Home | History | Annotate | Download | only in AArch64
      1 ; RUN: llc -verify-machineinstrs -o - %s | FileCheck %s
      2 target triple = "arm64--"
      3 
      4 ; AArch64InstrInfo::optimizeCondBranch() optimizes the
      5 ; "x = and y, 256; cmp x, 0; br" from an "and; cbnz" to a tbnz instruction.
      6 ; It forgot to clear the a flag resulting in a MachineVerifier complaint.
      7 ;
      8 ; Writing a stable/simple test is tricky since most tbz instructions are already
      9 ; formed in SelectionDAG, optimizeCondBranch() only triggers if the and
     10 ; instruction is in a different block than the conditional jump.
     11 ;
     12 ; CHECK-LABEL: func
     13 ; CHECK-NOT: and
     14 ; CHECK: tbnz
     15 define void @func() {
     16   %c0 = icmp sgt i64 0, 0
     17   br i1 %c0, label %b1, label %b6
     18 
     19 b1:
     20   br i1 undef, label %b3, label %b2
     21 
     22 b2:
     23   %v0 = tail call i32 @extfunc()
     24   br label %b5
     25 
     26 b3:
     27   %v1 = load i32, i32* undef, align 4
     28   %v2 = and i32 %v1, 256
     29   br label %b5
     30 
     31 b5:
     32   %v3 = phi i32 [ %v2, %b3 ], [ %v0, %b2 ]
     33   %c1 = icmp eq i32 %v3, 0
     34   br i1 %c1, label %b8, label %b7
     35 
     36 b6:
     37   tail call i32 @extfunc()
     38   ret void
     39 
     40 b7:
     41   tail call i32 @extfunc()
     42   ret void
     43 
     44 b8:
     45   ret void
     46 }
     47 
     48 declare i32 @extfunc()
     49