reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
; RUN: llc < %s -march=bpfel | FileCheck %s

@foo_printf.fmt = private unnamed_addr constant [9 x i8] c"hello  \0A\00", align 1

; Function Attrs: nounwind readnone uwtable
define i32 @foo_int(i32 %a, i32 %b) #0 {
  %1 = add nsw i32 %b, %a
  ret i32 %1
; CHECK-LABEL: foo_int:
; CHECK: r0 += r1
}

; Function Attrs: nounwind readnone uwtable
define signext i8 @foo_char(i8 signext %a, i8 signext %b) #0 {
  %1 = add i8 %b, %a
  ret i8 %1
; CHECK-LABEL: foo_char:
; CHECK: r0 += r1
; CHECK: r0 <<= 56
; CHECK: r0 s>>= 56
}

; Function Attrs: nounwind readnone uwtable
define i64 @foo_ll(i64 %a, i64 %b, i64 %c) #0 {
  %1 = add nsw i64 %b, %a
  %2 = sub i64 %1, %c
  ret i64 %2
; CHECK-LABEL: foo_ll:
; CHECK: r0 = r2
; CHECK: r0 += r1
; CHECK: r0 -= r3
}

; Function Attrs: nounwind uwtable
define void @foo_call2(i32 %a, i32 %b) #1 {
  %1 = trunc i32 %b to i8
  tail call void @foo_2arg(i8 signext %1, i32 %a) #3
  ret void
; CHECK-LABEL: foo_call2:
; CHECK: r2 <<= 56
; CHECK: r2 s>>= 56
; CHECK: r1 = r2
}

declare void @foo_2arg(i8 signext, i32) #2

; Function Attrs: nounwind uwtable
define i32 @foo_call5(i8 signext %a, i16 signext %b, i32 %c, i64 %d) #1 {
  %1 = tail call i32 @bar(i8 signext %a, i16 signext %b, i32 %c, i64 %d) #3
  ret i32 0
; CHECK-LABEL: foo_call5:
; CHECK: call bar
}

declare i32 @bar(i8 signext, i16 signext, i32, i64) #2

; Function Attrs: nounwind readnone uwtable
define signext i8 @foo_cmp(i8 signext %a, i8 signext %b) #0 {
  %1 = icmp slt i8 %a, %b
  %a.b = select i1 %1, i8 %a, i8 %b
  ret i8 %a.b
; CHECK-LABEL: foo_cmp:
; CHECK: if r2 s> r0
}

; Function Attrs: nounwind readnone uwtable
define i32 @foo_muldiv(i8 signext %a, i16 signext %b, i32 %c, i64 %d) #0 {
  %1 = icmp eq i8 %a, 0
  br i1 %1, label %5, label %2

; <label>:2                                       ; preds = %0
  %3 = sext i16 %b to i32
  %4 = mul nsw i32 %3, %c
  br label %8

; <label>:5                                       ; preds = %0
  %6 = trunc i64 %d to i32
  %7 = udiv i32 %6, %c
  br label %8

; <label>:8                                       ; preds = %5, %2
  %.0 = phi i32 [ %4, %2 ], [ %7, %5 ]
  ret i32 %.0
; CHECK-LABEL: foo_muldiv:
; CHECK: r0 *= r3
}

; Function Attrs: nounwind uwtable
define i32 @foo_optimized() #1 {
  %1 = tail call i32 @manyarg(i32 1, i32 2, i32 3, i32 4, i32 5) #3
  ret i32 %1
; CHECK-LABEL: foo_optimized:
; CHECK: r1 = 1
; CHECK: r2 = 2
; CHECK: r3 = 3
; CHECK: r4 = 4
; CHECK: r5 = 5
}

declare i32 @manyarg(i32, i32, i32, i32, i32) #2

; Function Attrs: nounwind uwtable
define void @foo_printf() #1 {
  %fmt = alloca [9 x i8], align 1
  %1 = getelementptr inbounds [9 x i8], [9 x i8]* %fmt, i64 0, i64 0
  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @foo_printf.fmt, i64 0, i64 0), i64 9, i1 false)
; CHECK-LABEL: foo_printf:
; CHECK: r1 = 729618802566522216 ll
  %2 = call i32 (i8*, ...) @printf(i8* %1) #3
  ret void
}

; Function Attrs: nounwind
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) #3

; Function Attrs: nounwind
declare i32 @printf(i8* nocapture, ...) #4