mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-23 20:44:51 +00:00
3da1bfb213
The following function currently relies on tail-merging for if conversion to succeed. The common tail of cond_true and cond_false is extracted, and this then forms a diamond pattern that can be successfully if converted. If this block does not get extracted, either because tail-merging is disabled or the threshold is higher, we should still recognize this pattern and if-convert it. Fixed a regression in the original commit. Need to un-reverse branches after reversing them, or other conversions go awry. define i32 @t2(i32 %a, i32 %b) nounwind { entry: %tmp1434 = icmp eq i32 %a, %b ; <i1> [#uses=1] br i1 %tmp1434, label %bb17, label %bb.outer bb.outer: ; preds = %cond_false, %entry %b_addr.021.0.ph = phi i32 [ %b, %entry ], [ %tmp10, %cond_false ] %a_addr.026.0.ph = phi i32 [ %a, %entry ], [ %a_addr.026.0, %cond_false ] br label %bb bb: ; preds = %cond_true, %bb.outer %indvar = phi i32 [ 0, %bb.outer ], [ %indvar.next, %cond_true ] %tmp. = sub i32 0, %b_addr.021.0.ph %tmp.40 = mul i32 %indvar, %tmp. %a_addr.026.0 = add i32 %tmp.40, %a_addr.026.0.ph %tmp3 = icmp sgt i32 %a_addr.026.0, %b_addr.021.0.ph br i1 %tmp3, label %cond_true, label %cond_false cond_true: ; preds = %bb %tmp7 = sub i32 %a_addr.026.0, %b_addr.021.0.ph %tmp1437 = icmp eq i32 %tmp7, %b_addr.021.0.ph %indvar.next = add i32 %indvar, 1 br i1 %tmp1437, label %bb17, label %bb cond_false: ; preds = %bb %tmp10 = sub i32 %b_addr.021.0.ph, %a_addr.026.0 %tmp14 = icmp eq i32 %a_addr.026.0, %tmp10 br i1 %tmp14, label %bb17, label %bb.outer bb17: ; preds = %cond_false, %cond_true, %entry %a_addr.026.1 = phi i32 [ %a, %entry ], [ %tmp7, %cond_true ], [ %a_addr.026.0, %cond_false ] ret i32 %a_addr.026.1 } Without tail-merging or diamond-tail if conversion: LBB1_1: @ %bb @ =>This Inner Loop Header: Depth=1 cmp r0, r1 ble LBB1_3 @ BB#2: @ %cond_true @ in Loop: Header=BB1_1 Depth=1 subs r0, r0, r1 cmp r1, r0 it ne cmpne r0, r1 bgt LBB1_4 LBB1_3: @ %cond_false @ in Loop: Header=BB1_1 Depth=1 subs r1, r1, r0 cmp r1, r0 bne LBB1_1 LBB1_4: @ %bb17 bx lr With diamond-tail if conversion, but without tail-merging: @ BB#0: @ %entry cmp r0, r1 it eq bxeq lr LBB1_1: @ %bb @ =>This Inner Loop Header: Depth=1 cmp r0, r1 ite le suble r1, r1, r0 subgt r0, r0, r1 cmp r1, r0 bne LBB1_1 @ BB#2: @ %bb17 bx lr git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@278287 91177308-0d34-0410-b5e6-96231b3b80d8 |
||
---|---|---|
.. | ||
2009-07-17-CrossRegClassCopy.ll | ||
2009-07-21-ISelBug.ll | ||
2009-07-23-CPIslandBug.ll | ||
2009-07-30-PEICrash.ll | ||
2009-08-01-WrongLDRBOpc.ll | ||
2009-08-02-CoalescerBug.ll | ||
2009-08-04-CoalescerAssert.ll | ||
2009-08-04-CoalescerBug.ll | ||
2009-08-04-ScavengerAssert.ll | ||
2009-08-04-SubregLoweringBug2.ll | ||
2009-08-04-SubregLoweringBug3.ll | ||
2009-08-04-SubregLoweringBug.ll | ||
2009-08-06-SpDecBug.ll | ||
2009-08-07-CoalescerBug.ll | ||
2009-08-07-NeonFPBug.ll | ||
2009-08-08-ScavengerAssert.ll | ||
2009-08-10-ISelBug.ll | ||
2009-08-21-PostRAKill4.ll | ||
2009-09-01-PostRAProlog.ll | ||
2009-09-28-ITBlockBug.ll | ||
2009-10-15-ITBlockBranch.ll | ||
2009-11-01-CopyReg2RegBug.ll | ||
2009-11-11-ScavengerAssert.ll | ||
2009-11-13-STRDBug.ll | ||
2009-12-01-LoopIVUsers.ll | ||
2010-01-06-TailDuplicateLabels.ll | ||
2010-01-19-RemovePredicates.ll | ||
2010-02-11-phi-cycle.ll | ||
2010-02-24-BigStack.ll | ||
2010-03-08-addi12-ccout.ll | ||
2010-03-15-AsmCCClobber.ll | ||
2010-04-15-DynAllocBug.ll | ||
2010-04-26-CopyRegCrash.ll | ||
2010-05-24-rsbs.ll | ||
2010-06-14-NEONCoalescer.ll | ||
2010-06-19-ITBlockCrash.ll | ||
2010-06-21-TailMergeBug.ll | ||
2010-08-10-VarSizedAllocaBug.ll | ||
2010-11-22-EpilogueBug.ll | ||
2010-12-03-AddSPNarrowing.ll | ||
2011-04-21-FILoweringBug.ll | ||
2011-06-07-TwoAddrEarlyClobber.ll | ||
2011-12-16-T2SizeReduceAssert.ll | ||
2012-01-13-CBNZBug.ll | ||
2013-02-19-tail-call-register-hint.ll | ||
2013-03-02-vduplane-nonconstant-source-index.ll | ||
2013-03-06-vector-sext-operand-scalarize.ll | ||
aapcs.ll | ||
aligned-constants.ll | ||
aligned-spill.ll | ||
bfi.ll | ||
bfx.ll | ||
bicbfi.ll | ||
buildvector-crash.ll | ||
carry.ll | ||
cbnz.ll | ||
constant-islands-jump-table.ll | ||
constant-islands-new-island-padding.ll | ||
constant-islands-new-island.ll | ||
constant-islands.ll | ||
cortex-fp.ll | ||
crash.ll | ||
cross-rc-coalescing-1.ll | ||
cross-rc-coalescing-2.ll | ||
div.ll | ||
emit-unwinding.ll | ||
float-cmp.ll | ||
float-intrinsics-double.ll | ||
float-intrinsics-float.ll | ||
float-ops.ll | ||
frameless2.ll | ||
frameless.ll | ||
ifcvt-compare.ll | ||
ifcvt-neon.ll | ||
inflate-regs.ll | ||
inlineasm.ll | ||
large-call.ll | ||
large-stack.ll | ||
ldr-str-imm12.ll | ||
lit.local.cfg | ||
longMACt.ll | ||
lsr-deficiency.ll | ||
machine-licm.ll | ||
mul_const.ll | ||
pic-load.ll | ||
segmented-stacks.ll | ||
setjmp_longjmp.ll | ||
stack_guard_remat.ll | ||
tail-call-r9.ll | ||
thumb2-adc.ll | ||
thumb2-add2.ll | ||
thumb2-add3.ll | ||
thumb2-add4.ll | ||
thumb2-add5.ll | ||
thumb2-add6.ll | ||
thumb2-add.ll | ||
thumb2-and2.ll | ||
thumb2-and.ll | ||
thumb2-asr2.ll | ||
thumb2-asr.ll | ||
thumb2-bcc.ll | ||
thumb2-bfc.ll | ||
thumb2-bic.ll | ||
thumb2-branch.ll | ||
thumb2-call-tc.ll | ||
thumb2-call.ll | ||
thumb2-cbnz.ll | ||
thumb2-clz.ll | ||
thumb2-cmn2.ll | ||
thumb2-cmn.ll | ||
thumb2-cmp2.ll | ||
thumb2-cmp.ll | ||
thumb2-cpsr-liveness.ll | ||
thumb2-eor2.ll | ||
thumb2-eor.ll | ||
thumb2-ifcvt1-tc.ll | ||
thumb2-ifcvt1.ll | ||
thumb2-ifcvt2.ll | ||
thumb2-ifcvt3.ll | ||
thumb2-jtb.ll | ||
thumb2-ldm.ll | ||
thumb2-ldr_ext.ll | ||
thumb2-ldr_post.ll | ||
thumb2-ldr_pre.ll | ||
thumb2-ldr.ll | ||
thumb2-ldrb.ll | ||
thumb2-ldrd.ll | ||
thumb2-ldrh.ll | ||
thumb2-lsl2.ll | ||
thumb2-lsl.ll | ||
thumb2-lsr2.ll | ||
thumb2-lsr3.ll | ||
thumb2-lsr.ll | ||
thumb2-mla.ll | ||
thumb2-mls.ll | ||
thumb2-mov.ll | ||
thumb2-mul.ll | ||
thumb2-mulhi.ll | ||
thumb2-mvn2.ll | ||
thumb2-mvn.ll | ||
thumb2-neg.ll | ||
thumb2-orn2.ll | ||
thumb2-orn.ll | ||
thumb2-orr2.ll | ||
thumb2-orr.ll | ||
thumb2-pack.ll | ||
thumb2-rev16.ll | ||
thumb2-rev.ll | ||
thumb2-ror.ll | ||
thumb2-rsb2.ll | ||
thumb2-rsb.ll | ||
thumb2-sbc.ll | ||
thumb2-select_xform.ll | ||
thumb2-select.ll | ||
thumb2-shifter.ll | ||
thumb2-smla.ll | ||
thumb2-smul.ll | ||
thumb2-spill-q.ll | ||
thumb2-str_post.ll | ||
thumb2-str_pre.ll | ||
thumb2-str.ll | ||
thumb2-strb.ll | ||
thumb2-strh.ll | ||
thumb2-sub2.ll | ||
thumb2-sub3.ll | ||
thumb2-sub4.ll | ||
thumb2-sub5.ll | ||
thumb2-sub.ll | ||
thumb2-sxt_rot.ll | ||
thumb2-sxt-uxt.ll | ||
thumb2-tbb.ll | ||
thumb2-tbh.ll | ||
thumb2-teq2.ll | ||
thumb2-teq.ll | ||
thumb2-tst2.ll | ||
thumb2-tst.ll | ||
thumb2-uxt_rot.ll | ||
thumb2-uxtb.ll | ||
tls1.ll | ||
tls2.ll | ||
tpsoft.ll | ||
v8_IT_1.ll | ||
v8_IT_2.ll | ||
v8_IT_3.ll | ||
v8_IT_4.ll | ||
v8_IT_5.ll | ||
v8_IT_6.ll |