Home | History | Annotate | Download | only in BPF
      1 ; RUN: llc < %s -march=bpf -mcpu=v2 -verify-machineinstrs | FileCheck %s
      2 ;
      3 ; Source file:
      4 ; int b, c;
      5 ; int test() {
      6 ;   int a = b;
      7 ;   if (a)
      8 ;     a = c;
      9 ;   return a;
     10 ; }
     11 @b = common local_unnamed_addr global i32 0, align 4
     12 @c = common local_unnamed_addr global i32 0, align 4
     13 
     14 ; Function Attrs: norecurse nounwind readonly
     15 define i32 @test() local_unnamed_addr #0 {
     16 entry:
     17   %0 = load i32, i32* @b, align 4
     18   %tobool = icmp eq i32 %0, 0
     19   %1 = load i32, i32* @c, align 4
     20   %. = select i1 %tobool, i32 0, i32 %1
     21 ; CHECK:  r1 = b
     22 ; CHECK:  r1 = *(u32 *)(r1 + 0)
     23 ; CHECK:  if r1 == 0 goto
     24   ret i32 %.
     25 }
     26 
     27 attributes #0 = { norecurse nounwind readonly }
     28 
     29 ; test immediate out of 32-bit range
     30 ; Source file:
     31 
     32 ; unsigned long long
     33 ; load_word(void *buf, unsigned long long off)
     34 ; asm("llvm.bpf.load.word");
     35 ;
     36 ; int
     37 ; foo(void *buf)
     38 ; {
     39 ;  unsigned long long sum = 0;
     40 ;
     41 ;  sum += load_word(buf, 100);
     42 ;  sum += load_word(buf, 104);
     43 ;
     44 ;  if (sum != 0x1ffffffffULL)
     45 ;    return ~0U;
     46 ;
     47 ;  return 0;
     48 ;}
     49 
     50 ; Function Attrs: nounwind readonly
     51 define i32 @foo(i8*) local_unnamed_addr #0 {
     52   %2 = tail call i64 @llvm.bpf.load.word(i8* %0, i64 100)
     53   %3 = tail call i64 @llvm.bpf.load.word(i8* %0, i64 104)
     54   %4 = add i64 %3, %2
     55   %5 = icmp ne i64 %4, 8589934591
     56 ; CHECK:  r{{[0-9]+}} = 8589934591 ll
     57   %6 = sext i1 %5 to i32
     58   ret i32 %6
     59 }
     60 
     61 ; Function Attrs: nounwind readonly
     62 declare i64 @llvm.bpf.load.word(i8*, i64) #1
     63 
     64 ; Source file:
     65 ; int m, n;
     66 ; int test2() {
     67 ;   int a = m;
     68 ;   if (a < 6)
     69 ;     a = n;
     70 ;   return a;
     71 ; }
     72 
     73 @m = common local_unnamed_addr global i32 0, align 4
     74 @n = common local_unnamed_addr global i32 0, align 4
     75 
     76 ; Function Attrs: norecurse nounwind readonly
     77 define i32 @test2() local_unnamed_addr #0 {
     78 entry:
     79   %0 = load i32, i32* @m, align 4
     80   %cmp = icmp slt i32 %0, 6
     81 ; CHECK:  if r{{[0-9]+}} s{{<|>}} 6 goto
     82   %1 = load i32, i32* @n, align 4
     83   %spec.select = select i1 %cmp, i32 %1, i32 %0
     84   ret i32 %spec.select
     85 }
     86 
     87 attributes #0 = { norecurse nounwind readonly }
     88