diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/CodeGen/ARM/indirectbr-3.ll | 32 | ||||
-rw-r--r-- | test/CodeGen/Thumb2/thumb2-ifcvt2.ll | 6 |
2 files changed, 35 insertions, 3 deletions
diff --git a/test/CodeGen/ARM/indirectbr-3.ll b/test/CodeGen/ARM/indirectbr-3.ll new file mode 100644 index 0000000..5a9c459 --- /dev/null +++ b/test/CodeGen/ARM/indirectbr-3.ll @@ -0,0 +1,32 @@ +; RUN: llc < %s -mtriple=thumbv7-apple-ios | FileCheck %s + +; If ARMBaseInstrInfo::AnalyzeBlocks returns the wrong value, which was possible +; for blocks with indirect branches, the IfConverter could end up deleting +; blocks that were the destinations of indirect branches, leaving branches to +; nowhere. +; <rdar://problem/14464830> + +define i32 @preserve_blocks(i32 %x) { +; preserve_blocks: +; CHECK: Block address taken +; CHECK: movs r0, #2 +; CHECK: movs r0, #1 +; CHECK-NOT: Address of block that was removed by CodeGen +entry: + %c2 = icmp slt i32 %x, 3 + %blockaddr = select i1 %c2, i8* blockaddress(@preserve_blocks, %ibt1), i8* blockaddress(@preserve_blocks, %ibt2) + %c1 = icmp eq i32 %x, 0 + br i1 %c1, label %pre_ib, label %nextblock + +nextblock: + ret i32 3 + +ibt1: + ret i32 2 + +ibt2: + ret i32 1 + +pre_ib: + indirectbr i8* %blockaddr, [ label %ibt1, label %ibt2 ] +} diff --git a/test/CodeGen/Thumb2/thumb2-ifcvt2.ll b/test/CodeGen/Thumb2/thumb2-ifcvt2.ll index d7bae42..788fa06 100644 --- a/test/CodeGen/Thumb2/thumb2-ifcvt2.ll +++ b/test/CodeGen/Thumb2/thumb2-ifcvt2.ll @@ -29,13 +29,13 @@ declare i32 @bar(...) define fastcc i32 @CountTree(%struct.quad_struct* %tree) { entry: ; CHECK-LABEL: CountTree: -; CHECK: itt eq -; CHECK: moveq -; CHECK: popeq ; CHECK: bne ; CHECK: cmp ; CHECK: it eq ; CHECK: cmpeq +; CHECK: itt eq +; CHECK: moveq +; CHECK: popeq br label %tailrecurse tailrecurse: ; preds = %bb, %entry |