diff options
author | Pirama Arumuga Nainar <pirama@google.com> | 2015-04-10 22:08:18 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2015-04-10 22:08:18 +0000 |
commit | 13a7db5b9c4f5e543d037be68ec3428216bfd550 (patch) | |
tree | 1b2c9792582e12f5af0b1512e3094425f0dc0df9 /test/CodeGen/ARM/ifcvt-iter-indbr.ll | |
parent | 0eb46f5d1e06a4284663d636a74b06adc3a161d7 (diff) | |
parent | 31195f0bdca6ee2a5e72d07edf13e1d81206d949 (diff) | |
download | external_llvm-13a7db5b9c4f5e543d037be68ec3428216bfd550.zip external_llvm-13a7db5b9c4f5e543d037be68ec3428216bfd550.tar.gz external_llvm-13a7db5b9c4f5e543d037be68ec3428216bfd550.tar.bz2 |
am 31195f0b: Merge "Update aosp/master llvm for rebase to r233350"
* commit '31195f0bdca6ee2a5e72d07edf13e1d81206d949':
Update aosp/master llvm for rebase to r233350
Diffstat (limited to 'test/CodeGen/ARM/ifcvt-iter-indbr.ll')
-rw-r--r-- | test/CodeGen/ARM/ifcvt-iter-indbr.ll | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/test/CodeGen/ARM/ifcvt-iter-indbr.ll b/test/CodeGen/ARM/ifcvt-iter-indbr.ll new file mode 100644 index 0000000..75e9d77 --- /dev/null +++ b/test/CodeGen/ARM/ifcvt-iter-indbr.ll @@ -0,0 +1,56 @@ +; RUN: llc < %s -mtriple thumbv7s-apple-darwin -asm-verbose=false | FileCheck %s + +declare i32 @foo(i32) +declare i8* @bar(i32, i8*, i8*) + +; Verify that we don't try to iteratively re-ifconvert a block with a +; (predicated) indirectbr terminator. +; If we do, we would ignore its fallthrough successor. + + +; CHECK-LABEL: test: +; CHECK: cmp {{.*}}, #21 +; CHECK-NEXT: itt eq +; CHECK-NEXT: streq.w +; CHECK-NEXT: moveq pc +; CHECK-NEXT: LBB{{[0-9_]+}}: +; CHECK-NEXT: cmp {{.*}}, #42 +; CHECK-NEXT: itt ne +; CHECK-NEXT: strne.w +; CHECK-NEXT: movne pc +; CHECK-NEXT: Ltmp +; CHECK-NEXT: LBB0_2: +; CHECK-NEXT: movw r0, #1234 +; CHECK-NEXT: b [[FOOCALL:LBB[0-9_]+]] +; CHECK-NEXT: Ltmp +; CHECK-NEXT: LBB{{[0-9_]+}}: +; CHECK-NEXT: movw r0, #4567 +; CHECK-NEXT: [[FOOCALL]]: +; CHECK-NEXT: blx _foo + +define i32 @test(i32 %a, i32 %a2, i32* %p, i32* %p2) { +entry: + %dst1 = call i8* @bar(i32 1, i8* blockaddress(@test, %bb1), i8* blockaddress(@test, %bb2)) + %dst2 = call i8* @bar(i32 2, i8* blockaddress(@test, %bb1), i8* blockaddress(@test, %bb2)) + %dst3 = call i8* @bar(i32 3, i8* blockaddress(@test, %bb1), i8* blockaddress(@test, %bb2)) + %cc1 = icmp eq i32 %a, 21 + br i1 %cc1, label %cc1t, label %cc1f + +cc1t: + store i32 %a, i32* %p + indirectbr i8* %dst3, [label %bb1, label %bb2] + +cc1f: + %cc2 = icmp ne i32 %a2, 42 + br i1 %cc2, label %cc2t, label %bb1 +cc2t: + store i32 %a, i32* %p2 + indirectbr i8* %dst1, [label %bb1, label %bb2] + +bb1: + %ret_bb1 = call i32 @foo(i32 1234) + ret i32 %ret_bb1 +bb2: + %ret_bb2 = call i32 @foo(i32 4567) + ret i32 %ret_bb2 +} |