diff options
| author | Juergen Ributzka <juergen@apple.com> | 2014-12-09 16:36:13 +0000 |
|---|---|---|
| committer | Juergen Ributzka <juergen@apple.com> | 2014-12-09 16:36:13 +0000 |
| commit | c1bbcbbd324a61b37516ade18837efbe178d3419 (patch) | |
| tree | 4a24e30b0435edd0b9a5d5b5c5a533acdf574db3 /llvm/test/CodeGen | |
| parent | f5e976979d3c7ecb8155e39cd997ace0071d5420 (diff) | |
| download | bcm5719-llvm-c1bbcbbd324a61b37516ade18837efbe178d3419.tar.gz bcm5719-llvm-c1bbcbbd324a61b37516ade18837efbe178d3419.zip | |
[CodeGenPrepare] Split branch conditions into multiple conditional branches.
This optimization transforms code like:
bb1:
%0 = icmp ne i32 %a, 0
%1 = icmp ne i32 %b, 0
%or.cond = or i1 %0, %1
br i1 %or.cond, label %TrueBB, label %FalseBB
into a multiple branch instructions like:
bb1:
%0 = icmp ne i32 %a, 0
br i1 %0, label %TrueBB, label %bb2
bb2:
%1 = icmp ne i32 %b, 0
br i1 %1, label %TrueBB, label %FalseBB
This optimization is already performed by SelectionDAG, but not by FastISel.
FastISel cannot perform this optimization, because it cannot generate new
MachineBasicBlocks.
Performing this optimization at CodeGenPrepare time makes it available to both -
SelectionDAG and FastISel - and the implementation in SelectiuonDAG could be
removed. There are currenty a few differences in codegen for X86 and PPC, so
this commmit only enables it for FastISel.
Reviewed by Jim Grosbach
This fixes rdar://problem/19034919.
llvm-svn: 223786
Diffstat (limited to 'llvm/test/CodeGen')
| -rw-r--r-- | llvm/test/CodeGen/AArch64/fast-isel-branch-cond-split.ll | 42 |
1 files changed, 42 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 new file mode 100644 index 00000000000..058007b4b5a --- /dev/null +++ b/llvm/test/CodeGen/AArch64/fast-isel-branch-cond-split.ll @@ -0,0 +1,42 @@ +; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel -fast-isel-abort -verify-machineinstrs < %s | FileCheck %s + +; CHECK-label: test_or +; CHECK: cbnz w0, {{LBB[0-9]+_2}} +; CHECK: cbz w1, {{LBB[0-9]+_1}} +define i64 @test_or(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, !prof !0 + +bb3: + ret i64 0 + +bb4: + %2 = call i64 @bar() + ret i64 %2 +} + +; CHECK-label: test_ans +; CHECK: cbz w0, {{LBB[0-9]+_2}} +; CHECK: cbnz w1, {{LBB[0-9]+_3}} +define i64 @test_and(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, !prof !1 + +bb3: + ret i64 0 + +bb4: + %2 = call i64 @bar() + ret i64 %2 +} + +declare i64 @bar() + +!0 = metadata !{metadata !"branch_weights", i32 5128, i32 32} +!1 = metadata !{metadata !"branch_weights", i32 1024, i32 4136} |

