Home | History | Annotate | Download | only in BPF
      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