1; RUN: llc -O2 -o - %s | FileCheck %s 2target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 3target triple = "thumbv8-unknown-linux-gnueabihf" 4 5; This is a tricky test case. 6; The point of it is to create a diamond where both the true block and the 7; false block clobber the predicate when viewed as a whole, but only one of them 8; clobbers the predicate when considering the instructions they share. 9 10; Function Attrs: nounwind 11define void @BN_kronecker(i1 %a, i32 %b) #0 { 12entry: 13 br label %while.cond38 14 15while.cond38: ; preds = %if.end111, %entry 16 %cmp79 = icmp eq i32 0, 0 17 br i1 %a, label %cond.true77, label %cond.false87 18 19; CHECK: %cond.true77 20; CHECK-NEXT: @ in Loop 21; CHECK-NEXT: cmp.w {{r[0-9]+}}, #0 22; CHECK-NEXT: it eq 23; CHECK-NEXT: ldreq 24; CHECK-NEXT: it ne 25 ; N.b. 16-bit mov instruction in IT block does not set flags. 26; CHECK-NEXT: movne 27; CHECK-NEXT: mvns 28; CHECK-NEXT: b 29cond.true77: ; preds = %while.cond38 30 br i1 %cmp79, label %cond.end84, label %cond.false81 31 32cond.false81: ; preds = %cond.true77 33 %0 = load i32, i32* null, align 4 34 br label %cond.end84 35 36cond.end84: ; preds = %cond.false81, %cond.true77 37 %cond85 = phi i32 [ %0, %cond.false81 ], [ 0, %cond.true77 ] 38 %neg86 = xor i32 %cond85, -1 39 br label %cond.false101 40 41cond.false87: ; preds = %while.cond38 42 br i1 %cmp79, label %cond.false101, label %cond.false91 43 44cond.false91: ; preds = %cond.false87 45 br label %cond.false101 46 47cond.false101: ; preds = %cond.false91, %cond.false87, %cond.end84 48 %cond97 = phi i32 [ %neg86, %cond.end84 ], [ %b, %cond.false91 ], [ 0, %cond.false87 ] 49 %1 = load i32, i32* null, align 4 50 %and106 = and i32 %cond97, %1 51 %and107 = and i32 %and106, 2 52 %tobool108 = icmp ne i32 %and107, 0 53 br i1 %tobool108, label %if.then109, label %if.end111 54 55if.then109: ; preds = %cond.false101 56 store i32 0, i32* undef, align 4 57 br label %if.end111 58 59if.end111: ; preds = %if.then109, %cond.false101 60 %tobool113 = icmp ne i32 0, 0 61 br i1 %tobool113, label %while.cond38, label %end 62 63end: ; preds = %if.end111 64 ret void 65} 66 67attributes #0 = { nounwind } 68