diff options
| author | Sanjay Patel <spatel@rotateright.com> | 2015-09-02 19:23:23 +0000 |
|---|---|---|
| committer | Sanjay Patel <spatel@rotateright.com> | 2015-09-02 19:23:23 +0000 |
| commit | 42574203e55772022f93904a16f020daeade27cc (patch) | |
| tree | cbc16e5d0f106cc283323f433ce29cf408310e5c /llvm/test/CodeGen/AArch64/fast-isel-branch-cond-split.ll | |
| parent | fff7c6dc7319e7e735a3135b4254e874faef4077 (diff) | |
| download | bcm5719-llvm-42574203e55772022f93904a16f020daeade27cc.tar.gz bcm5719-llvm-42574203e55772022f93904a16f020daeade27cc.zip | |
use "unpredictable" metadata in fast-isel when splitting compares
This patch uses the metadata defined in D12341 to avoid creating an unpredictable branch.
Differential Revision: http://reviews.llvm.org/D12342
llvm-svn: 246692
Diffstat (limited to 'llvm/test/CodeGen/AArch64/fast-isel-branch-cond-split.ll')
| -rw-r--r-- | llvm/test/CodeGen/AArch64/fast-isel-branch-cond-split.ll | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/AArch64/fast-isel-branch-cond-split.ll b/llvm/test/CodeGen/AArch64/fast-isel-branch-cond-split.ll index aa6d5f11f36..5248b9253e7 100644 --- a/llvm/test/CodeGen/AArch64/fast-isel-branch-cond-split.ll +++ b/llvm/test/CodeGen/AArch64/fast-isel-branch-cond-split.ll @@ -36,7 +36,59 @@ bb4: ret i64 %2 } +; If the branch is unpredictable, don't add another branch. + +; CHECK-LABEL: test_or_unpredictable +; CHECK: cmp w0, #0 +; CHECK-NEXT: cset w8, eq +; CHECK-NEXT: cmp w1, #0 +; CHECK-NEXT: cset w9, eq +; CHECK-NEXT: orr w8, w8, w9 +; CHECK-NEXT: and w8, w8, #0x1 +; CHECK-NEXT: cmp w8, #0 +; CHECK-NEXT: b.ne +define i64 @test_or_unpredictable(i32 %a, i32 %b) { +bb1: + %0 = icmp eq i32 %a, 0 + %1 = icmp eq i32 %b, 0 + %or.cond = or i1 %0, %1 + br i1 %or.cond, label %bb3, label %bb4, !unpredictable !2 + +bb3: + ret i64 0 + +bb4: + %2 = call i64 @bar() + ret i64 %2 +} + +; CHECK-LABEL: test_and_unpredictable +; CHECK: cmp w0, #0 +; CHECK-NEXT: cset w8, ne +; CHECK-NEXT: cmp w1, #0 +; CHECK-NEXT: cset w9, ne +; CHECK-NEXT: and w8, w8, w9 +; CHECK-NEXT: and w8, w8, #0x1 +; CHECK-NEXT: cmp w8, #0 +; CHECK-NEXT: b.eq +define i64 @test_and_unpredictable(i32 %a, i32 %b) { +bb1: + %0 = icmp ne i32 %a, 0 + %1 = icmp ne i32 %b, 0 + %or.cond = and i1 %0, %1 + br i1 %or.cond, label %bb4, label %bb3, !unpredictable !2 + +bb3: + ret i64 0 + +bb4: + %2 = call i64 @bar() + ret i64 %2 +} + declare i64 @bar() !0 = !{!"branch_weights", i32 5128, i32 32} !1 = !{!"branch_weights", i32 1024, i32 4136} +!2 = !{} + |

