[CodeGenPrepare] Split branch conditions into multiple conditional branches.
authorJuergen Ributzka <juergen@apple.com>
Tue, 9 Dec 2014 16:36:13 +0000 (16:36 +0000)
committerJuergen Ributzka <juergen@apple.com>
Tue, 9 Dec 2014 16:36:13 +0000 (16:36 +0000)
commitb49ee78320c74c583e3f0400a046118d91004b33
treeec12fefd6e0c148769c83b7fdb43835b235b4b6f
parentc4dedab6a67766053553b1c8d095c633b4e57e4c
[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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223786 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/CodeGenPrepare.cpp
test/CodeGen/AArch64/fast-isel-branch-cond-split.ll [new file with mode: 0644]