Home | History | Annotate | Download | only in AArch64
      1 ; RUN: llc -o - %s | FileCheck %s
      2 target triple = "aarch64--"
      3 
      4 declare void @begin()
      5 declare void @end()
      6 
      7 ; Test that we use the zero register before regalloc and do not unnecessarily
      8 ; clobber a register with the SUBS (cmp) instruction.
      9 ; CHECK-LABEL: func:
     10 define void @func(i64* %addr) {
     11   ; We should not see any spills or reloads between begin and end
     12   ; CHECK: bl begin
     13   ; CHECK-NOT: str{{.*}}sp
     14   ; CHECK-NOT: Folded Spill
     15   ; CHECK-NOT: ldr{{.*}}sp
     16   ; CHECK-NOT: Folded Reload
     17   call void @begin()
     18   %v0 = load volatile i64, i64* %addr  
     19   %v1 = load volatile i64, i64* %addr  
     20   %v2 = load volatile i64, i64* %addr  
     21   %v3 = load volatile i64, i64* %addr  
     22   %v4 = load volatile i64, i64* %addr  
     23   %v5 = load volatile i64, i64* %addr  
     24   %v6 = load volatile i64, i64* %addr  
     25   %v7 = load volatile i64, i64* %addr  
     26   %v8 = load volatile i64, i64* %addr  
     27   %v9 = load volatile i64, i64* %addr  
     28   %v10 = load volatile i64, i64* %addr  
     29   %v11 = load volatile i64, i64* %addr  
     30   %v12 = load volatile i64, i64* %addr  
     31   %v13 = load volatile i64, i64* %addr  
     32   %v14 = load volatile i64, i64* %addr  
     33   %v15 = load volatile i64, i64* %addr  
     34   %v16 = load volatile i64, i64* %addr  
     35   %v17 = load volatile i64, i64* %addr  
     36   %v18 = load volatile i64, i64* %addr  
     37   %v19 = load volatile i64, i64* %addr  
     38   %v20 = load volatile i64, i64* %addr
     39   %v21 = load volatile i64, i64* %addr
     40   %v22 = load volatile i64, i64* %addr
     41   %v23 = load volatile i64, i64* %addr
     42   %v24 = load volatile i64, i64* %addr
     43   %v25 = load volatile i64, i64* %addr
     44   %v26 = load volatile i64, i64* %addr
     45   %v27 = load volatile i64, i64* %addr
     46   %v28 = load volatile i64, i64* %addr
     47   %v29 = load volatile i64, i64* %addr
     48 
     49   %c = icmp eq i64 %v0, %v1
     50   br i1 %c, label %if.then, label %if.end
     51 
     52 if.then:
     53   store volatile i64 %v2, i64* %addr
     54   br label %if.end
     55 
     56 if.end:
     57   store volatile i64 %v0, i64* %addr
     58   store volatile i64 %v1, i64* %addr
     59   store volatile i64 %v2, i64* %addr
     60   store volatile i64 %v3, i64* %addr
     61   store volatile i64 %v4, i64* %addr
     62   store volatile i64 %v5, i64* %addr
     63   store volatile i64 %v6, i64* %addr
     64   store volatile i64 %v7, i64* %addr
     65   store volatile i64 %v8, i64* %addr
     66   store volatile i64 %v9, i64* %addr
     67   store volatile i64 %v10, i64* %addr
     68   store volatile i64 %v11, i64* %addr
     69   store volatile i64 %v12, i64* %addr
     70   store volatile i64 %v13, i64* %addr
     71   store volatile i64 %v14, i64* %addr
     72   store volatile i64 %v15, i64* %addr
     73   store volatile i64 %v16, i64* %addr
     74   store volatile i64 %v17, i64* %addr
     75   store volatile i64 %v18, i64* %addr
     76   store volatile i64 %v19, i64* %addr
     77   store volatile i64 %v20, i64* %addr
     78   store volatile i64 %v21, i64* %addr
     79   store volatile i64 %v22, i64* %addr
     80   store volatile i64 %v23, i64* %addr
     81   store volatile i64 %v24, i64* %addr
     82   store volatile i64 %v25, i64* %addr
     83   store volatile i64 %v26, i64* %addr
     84   store volatile i64 %v27, i64* %addr
     85   store volatile i64 %v28, i64* %addr
     86   store volatile i64 %v29, i64* %addr
     87   ; CHECK: bl end
     88   call void @end()
     89 
     90   ret void
     91 }
     92