This is an archive of the discontinued LLVM Phabricator instance.

CodeGen: If Convert blocks that would form a diamond when tail-merged.
AbandonedPublic

Authored by iteratee on Aug 17 2016, 1:29 PM.

Details

Reviewers
rovka
Summary

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

Diff Detail

Event Timeline

iteratee updated this revision to Diff 68414.Aug 17 2016, 1:29 PM
iteratee retitled this revision from to CodeGen: If Convert blocks that would form a diamond when tail-merged..
iteratee updated this object.
iteratee added a reviewer: rovka.
iteratee added a subscriber: llvm-commits.

Diana, can you run the buildbot with this patch and see if it still regresses?

Thanks,
Kyle.

iteratee updated this revision to Diff 68419.Aug 17 2016, 1:50 PM

Remove extraneous debug output.

iteratee abandoned this revision.Aug 22 2016, 12:04 PM