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