1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple thumbv7s-apple-darwin -asm-verbose=false | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple thumbv7s-apple-darwin -asm-verbose=false -print-machineinstrs=if-converter 2>&1 | FileCheck --check-prefix=CHECK-PROB %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare i32 @foo(i32) 5*9880d681SAndroid Build Coastguard Workerdeclare i8* @bar(i32, i8*, i8*) 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; Verify that we don't try to iteratively re-ifconvert a block with a 8*9880d681SAndroid Build Coastguard Worker; (predicated) indirectbr terminator. 9*9880d681SAndroid Build Coastguard Worker; If we do, we would ignore its fallthrough successor. 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test: 13*9880d681SAndroid Build Coastguard Worker; CHECK: cmp {{.*}}, #21 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: itt eq 15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: streq.w 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: moveq pc 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: LBB{{[0-9_]+}}: 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp {{.*}}, #42 19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: itt ne 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: strne.w 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movne pc 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: Ltmp 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: LBB0_2: 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movw r0, #1234 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b [[FOOCALL:LBB[0-9_]+]] 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: Ltmp 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: LBB{{[0-9_]+}}: 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movw r0, #4567 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[FOOCALL]]: 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bl _foo 31*9880d681SAndroid Build Coastguard Worker; 32*9880d681SAndroid Build Coastguard Worker; CHECK-PROB: BB#0: 33*9880d681SAndroid Build Coastguard Worker; CHECK-PROB: Successors according to CFG: BB#1({{[0-9a-fx/= ]+}}50.00%) BB#2({{[0-9a-fx/= ]+}}25.00%) BB#4({{[0-9a-fx/= ]+}}25.00%) 34*9880d681SAndroid Build Coastguard Worker; CHECK-PROB: BB#1: 35*9880d681SAndroid Build Coastguard Worker; CHECK-PROB: Successors according to CFG: BB#2({{[0-9a-fx/= ]+}}75.00%) BB#4({{[0-9a-fx/= ]+}}25.00%) 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine i32 @test(i32 %a, i32 %a2, i32* %p, i32* %p2) { 38*9880d681SAndroid Build Coastguard Workerentry: 39*9880d681SAndroid Build Coastguard Worker %dst1 = call i8* @bar(i32 1, i8* blockaddress(@test, %bb1), i8* blockaddress(@test, %bb2)) 40*9880d681SAndroid Build Coastguard Worker %dst2 = call i8* @bar(i32 2, i8* blockaddress(@test, %bb1), i8* blockaddress(@test, %bb2)) 41*9880d681SAndroid Build Coastguard Worker %dst3 = call i8* @bar(i32 3, i8* blockaddress(@test, %bb1), i8* blockaddress(@test, %bb2)) 42*9880d681SAndroid Build Coastguard Worker %cc1 = icmp eq i32 %a, 21 43*9880d681SAndroid Build Coastguard Worker br i1 %cc1, label %cc1t, label %cc1f 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workercc1t: 46*9880d681SAndroid Build Coastguard Worker store i32 %a, i32* %p 47*9880d681SAndroid Build Coastguard Worker indirectbr i8* %dst3, [label %bb1, label %bb2] 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workercc1f: 50*9880d681SAndroid Build Coastguard Worker %cc2 = icmp ne i32 %a2, 42 51*9880d681SAndroid Build Coastguard Worker br i1 %cc2, label %cc2t, label %bb1 52*9880d681SAndroid Build Coastguard Workercc2t: 53*9880d681SAndroid Build Coastguard Worker store i32 %a, i32* %p2 54*9880d681SAndroid Build Coastguard Worker indirectbr i8* %dst1, [label %bb1, label %bb2] 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerbb1: 57*9880d681SAndroid Build Coastguard Worker %ret_bb1 = call i32 @foo(i32 1234) 58*9880d681SAndroid Build Coastguard Worker ret i32 %ret_bb1 59*9880d681SAndroid Build Coastguard Workerbb2: 60*9880d681SAndroid Build Coastguard Worker %ret_bb2 = call i32 @foo(i32 4567) 61*9880d681SAndroid Build Coastguard Worker ret i32 %ret_bb2 62*9880d681SAndroid Build Coastguard Worker} 63