| # RUN: llc -mtriple=arm-apple-ios -run-pass=if-converter %s -o - | FileCheck %s | |
| --- | | |
| declare void @__stack_chk_fail() | |
| declare void @bar() | |
| define void @foo() { | |
| ret void | |
| } | |
| ... | |
| --- | |
| name: foo | |
| body: | | |
| bb.0: | |
| Bcc %bb.1, 1, $cpsr | |
| B %bb.2 | |
| bb.1: | |
| Bcc %bb.3, 0, $cpsr | |
| bb.2: | |
| successors: | |
| tBL 14, $cpsr, @__stack_chk_fail | |
| bb.3: | |
| successors: | |
| $sp = tADDspi $sp, 2, 14, _ | |
| $sp = tADDspi $sp, 2, 14, _ | |
| tTAILJMPdND @bar, 14, $cpsr | |
| ... | |
| # bb.2 has no successors, presumably because __stack_chk_fail doesn't return, | |
| # so there should be no edge from bb.2 to bb.3. | |
| # Nevertheless, IfConversion treats bb.1, bb.2, bb.3 as a triangle and | |
| # inserts a predicated copy of bb.2 in bb.1. | |
| # This caused r302876 to die with a failed assertion. | |
| # CHECK: bb.0: | |
| # CHECK: successors: %bb.2(0x40000000), %bb.1(0x40000000) | |
| # CHECK: Bcc %bb.2, 1, $cpsr | |
| # CHECK: bb.1: | |
| # CHECK-NOT: successors: %bb | |
| # CHECK: tBL 14, $cpsr, @__stack_chk_fail | |
| # CHECK: bb.2: | |
| # CHECK-NOT: successors: %bb | |
| # CHECK: tBL 1, $cpsr, @__stack_chk_fail | |
| # CHECK: $sp = tADDspi $sp, 2, 14, $noreg | |
| # CHECK: $sp = tADDspi $sp, 2, 14, $noreg | |
| # CHECK: tTAILJMPdND @bar, 14, $cpsr |