1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=bpfel -mcpu=v1 -- | FileCheck %s 3 4@foo_printf.fmt = private unnamed_addr constant [9 x i8] c"hello \0A\00", align 1 5 6; Function Attrs: nounwind readnone uwtable 7define i32 @foo_int(i32 %a, i32 %b) #0 { 8; CHECK-LABEL: foo_int: 9; CHECK: # %bb.0: 10; CHECK-NEXT: r0 = r2 11; CHECK-NEXT: r0 += r1 12; CHECK-NEXT: exit 13 %1 = add nsw i32 %b, %a 14 ret i32 %1 15} 16 17; Function Attrs: nounwind readnone uwtable 18define signext i8 @foo_char(i8 signext %a, i8 signext %b) #0 { 19; CHECK-LABEL: foo_char: 20; CHECK: # %bb.0: 21; CHECK-NEXT: r0 = r2 22; CHECK-NEXT: r0 += r1 23; CHECK-NEXT: r0 <<= 56 24; CHECK-NEXT: r0 s>>= 56 25; CHECK-NEXT: exit 26 %1 = add i8 %b, %a 27 ret i8 %1 28} 29 30; Function Attrs: nounwind readnone uwtable 31define i64 @foo_ll(i64 %a, i64 %b, i64 %c) #0 { 32; CHECK-LABEL: foo_ll: 33; CHECK: # %bb.0: 34; CHECK-NEXT: r0 = r2 35; CHECK-NEXT: r0 += r1 36; CHECK-NEXT: r0 -= r3 37; CHECK-NEXT: exit 38 %1 = add nsw i64 %b, %a 39 %2 = sub i64 %1, %c 40 ret i64 %2 41} 42 43; Function Attrs: nounwind uwtable 44define void @foo_call2(i32 %a, i32 %b) #1 { 45; CHECK-LABEL: foo_call2: 46; CHECK: # %bb.0: 47; CHECK-NEXT: r3 = r1 48; CHECK-NEXT: r2 <<= 56 49; CHECK-NEXT: r2 s>>= 56 50; CHECK-NEXT: r1 = r2 51; CHECK-NEXT: r2 = r3 52; CHECK-NEXT: call foo_2arg 53; CHECK-NEXT: exit 54 %1 = trunc i32 %b to i8 55 tail call void @foo_2arg(i8 signext %1, i32 %a) #3 56 ret void 57} 58 59declare void @foo_2arg(i8 signext, i32) #2 60 61; Function Attrs: nounwind uwtable 62define i32 @foo_call5(i8 signext %a, i16 signext %b, i32 %c, i64 %d) #1 { 63; CHECK-LABEL: foo_call5: 64; CHECK: # %bb.0: 65; CHECK-NEXT: call bar 66; CHECK-NEXT: r0 = 0 67; CHECK-NEXT: exit 68 %1 = tail call i32 @bar(i8 signext %a, i16 signext %b, i32 %c, i64 %d) #3 69 ret i32 0 70} 71 72declare i32 @bar(i8 signext, i16 signext, i32, i64) #2 73 74; Function Attrs: nounwind readnone uwtable 75define signext i8 @foo_cmp(i8 signext %a, i8 signext %b) #0 { 76; CHECK-LABEL: foo_cmp: 77; CHECK: # %bb.0: 78; CHECK-NEXT: r0 = r1 79; CHECK-NEXT: if r2 s> r0 goto LBB5_2 80; CHECK-NEXT: # %bb.1: 81; CHECK-NEXT: r0 = r2 82; CHECK-NEXT: LBB5_2: 83; CHECK-NEXT: exit 84 %1 = icmp slt i8 %a, %b 85 %a.b = select i1 %1, i8 %a, i8 %b 86 ret i8 %a.b 87} 88 89; Function Attrs: nounwind readnone uwtable 90define i32 @foo_muldiv(i8 signext %a, i16 signext %b, i32 %c, i64 %d) #0 { 91; CHECK-LABEL: foo_muldiv: 92; CHECK: # %bb.0: 93; CHECK-NEXT: r0 = r2 94; CHECK-NEXT: if r1 == 0 goto LBB6_2 95; CHECK-NEXT: # %bb.1: 96; CHECK-NEXT: r0 *= r3 97; CHECK-NEXT: goto LBB6_3 98; CHECK-NEXT: LBB6_2: 99; CHECK-NEXT: r3 <<= 32 100; CHECK-NEXT: r3 >>= 32 101; CHECK-NEXT: r4 <<= 32 102; CHECK-NEXT: r4 >>= 32 103; CHECK-NEXT: r4 /= r3 104; CHECK-NEXT: r0 = r4 105; CHECK-NEXT: LBB6_3: 106; CHECK-NEXT: exit 107 %1 = icmp eq i8 %a, 0 108 br i1 %1, label %5, label %2 109 110; <label>:2 ; preds = %0 111 %3 = sext i16 %b to i32 112 %4 = mul nsw i32 %3, %c 113 br label %8 114 115; <label>:5 ; preds = %0 116 %6 = trunc i64 %d to i32 117 %7 = udiv i32 %6, %c 118 br label %8 119 120; <label>:8 ; preds = %5, %2 121 %.0 = phi i32 [ %4, %2 ], [ %7, %5 ] 122 ret i32 %.0 123} 124 125; Function Attrs: nounwind uwtable 126define i32 @foo_optimized() #1 { 127; CHECK-LABEL: foo_optimized: 128; CHECK: # %bb.0: 129; CHECK-NEXT: r1 = 1 130; CHECK-NEXT: r2 = 2 131; CHECK-NEXT: r3 = 3 132; CHECK-NEXT: r4 = 4 133; CHECK-NEXT: r5 = 5 134; CHECK-NEXT: call manyarg 135; CHECK-NEXT: exit 136 %1 = tail call i32 @manyarg(i32 1, i32 2, i32 3, i32 4, i32 5) #3 137 ret i32 %1 138} 139 140declare i32 @manyarg(i32, i32, i32, i32, i32) #2 141 142; Function Attrs: nounwind uwtable 143define void @foo_printf() #1 { 144; CHECK-LABEL: foo_printf: 145; CHECK: # %bb.0: 146; CHECK-NEXT: r1 = 0 147; CHECK-NEXT: *(u8 *)(r10 - 8) = r1 148; CHECK-NEXT: r1 = 729618802566522216 ll 149; CHECK-NEXT: *(u64 *)(r10 - 16) = r1 150; CHECK-NEXT: r1 = r10 151; CHECK-NEXT: r1 += -16 152; CHECK-NEXT: call printf 153; CHECK-NEXT: exit 154 %fmt = alloca [9 x i8], align 1 155 call void @llvm.memcpy.p0.p0.i64(ptr %fmt, ptr @foo_printf.fmt, i64 9, i1 false) 156 %1 = call i32 (ptr, ...) @printf(ptr %fmt) #3 157 ret void 158} 159 160; Function Attrs: nounwind 161declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) #3 162 163; Function Attrs: nounwind 164declare i32 @printf(ptr nocapture, ...) #4 165