1 ; RUN: llc < %s -march=bpfel | FileCheck %s 2 3 @foo_printf.fmt = private unnamed_addr constant [9 x i8] c"hello \0A\00", align 1 4 5 ; Function Attrs: nounwind readnone uwtable 6 define i32 @foo_int(i32 %a, i32 %b) #0 { 7 %1 = add nsw i32 %b, %a 8 ret i32 %1 9 ; CHECK-LABEL: foo_int: 10 ; CHECK: add r2, r1 11 } 12 13 ; Function Attrs: nounwind readnone uwtable 14 define signext i8 @foo_char(i8 signext %a, i8 signext %b) #0 { 15 %1 = add i8 %b, %a 16 ret i8 %1 17 ; CHECK-LABEL: foo_char: 18 ; CHECK: add r2, r1 19 ; CHECK: slli r2, 56 20 ; CHECK: srai r2, 56 21 } 22 23 ; Function Attrs: nounwind readnone uwtable 24 define i64 @foo_ll(i64 %a, i64 %b, i64 %c) #0 { 25 %1 = add nsw i64 %b, %a 26 %2 = sub i64 %1, %c 27 ret i64 %2 28 ; CHECK-LABEL: foo_ll: 29 ; CHECK: add r2, r1 30 ; CHECK: sub r2, r3 31 ; CHECK: mov r0, r2 32 } 33 34 ; Function Attrs: nounwind uwtable 35 define void @foo_call2(i32 %a, i32 %b) #1 { 36 %1 = trunc i32 %b to i8 37 tail call void @foo_2arg(i8 signext %1, i32 %a) #3 38 ret void 39 ; CHECK-LABEL: foo_call2: 40 ; CHECK: slli r2, 56 41 ; CHECK: srai r2, 56 42 ; CHECK: mov r1, r2 43 } 44 45 declare void @foo_2arg(i8 signext, i32) #2 46 47 ; Function Attrs: nounwind uwtable 48 define i32 @foo_call5(i8 signext %a, i16 signext %b, i32 %c, i64 %d) #1 { 49 %1 = tail call i32 @bar(i8 signext %a, i16 signext %b, i32 %c, i64 %d) #3 50 ret i32 0 51 ; CHECK-LABEL: foo_call5: 52 ; CHECK: call bar 53 } 54 55 declare i32 @bar(i8 signext, i16 signext, i32, i64) #2 56 57 ; Function Attrs: nounwind readnone uwtable 58 define signext i8 @foo_cmp(i8 signext %a, i8 signext %b) #0 { 59 %1 = icmp slt i8 %a, %b 60 %a.b = select i1 %1, i8 %a, i8 %b 61 ret i8 %a.b 62 ; CHECK-LABEL: foo_cmp: 63 ; CHECK: jsgt r2, r1 64 } 65 66 ; Function Attrs: nounwind readnone uwtable 67 define i32 @foo_muldiv(i8 signext %a, i16 signext %b, i32 %c, i64 %d) #0 { 68 %1 = icmp eq i8 %a, 0 69 br i1 %1, label %5, label %2 70 71 ; <label>:2 ; preds = %0 72 %3 = sext i16 %b to i32 73 %4 = mul nsw i32 %3, %c 74 br label %8 75 76 ; <label>:5 ; preds = %0 77 %6 = trunc i64 %d to i32 78 %7 = udiv i32 %6, %c 79 br label %8 80 81 ; <label>:8 ; preds = %5, %2 82 %.0 = phi i32 [ %4, %2 ], [ %7, %5 ] 83 ret i32 %.0 84 ; CHECK-LABEL: foo_muldiv: 85 ; CHECK: mul r2, r3 86 } 87 88 ; Function Attrs: nounwind uwtable 89 define i32 @foo_optimized() #1 { 90 %1 = tail call i32 @manyarg(i32 1, i32 2, i32 3, i32 4, i32 5) #3 91 ret i32 %1 92 ; CHECK-LABEL: foo_optimized: 93 ; CHECK: mov r1, 1 94 ; CHECK: mov r2, 2 95 ; CHECK: mov r3, 3 96 ; CHECK: mov r4, 4 97 ; CHECK: mov r5, 5 98 } 99 100 declare i32 @manyarg(i32, i32, i32, i32, i32) #2 101 102 ; Function Attrs: nounwind uwtable 103 define void @foo_printf() #1 { 104 %fmt = alloca [9 x i8], align 1 105 %1 = getelementptr inbounds [9 x i8], [9 x i8]* %fmt, i64 0, i64 0 106 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, i32 1, i1 false) 107 ; CHECK-LABEL: foo_printf: 108 ; CHECK: ld_64 r1, 729618802566522216 109 %2 = call i32 (i8*, ...) @printf(i8* %1) #3 110 ret void 111 } 112 113 ; Function Attrs: nounwind 114 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) #3 115 116 ; Function Attrs: nounwind 117 declare i32 @printf(i8* nocapture, ...) #4 118