[PATCH] D42833: [LICM] update BlockColors after splitting predecessors
David Majnemer via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sat Feb 3 00:44:57 PST 2018
majnemer added inline comments.
================
Comment at: lib/Transforms/Scalar/LICM.cpp:860-863
+ // FIXME: it's not impossible to split LandingPad blocks, but it require
+ // updating BlockColors for all offspring blocks. By skipping such corner
+ // case, we can make updating BlockColors after splitting predecessor fairly
+ // simple.
----------------
junbuml wrote:
> majnemer wrote:
> > You don't need to worry about updating BlockColors if we have landingpads. If there is a landingpad, BlockColors should be entirely empty.
> As far as I see, BlockColors is not empty when we have landingpads.
> For example, in the IR below, I can see the color for %lpadBB is %lpadBB and the color of its successor (%lpadBBSucc1) is %lpadBB, which is just what I expected after colorEHFunclets(). If we split %lpadBB for sinking, SplitLandingPadPredecessors() will be called and the new blocks split (%lpadBB.split) become landpad blocks. Then, color for new blocks and its all successors should be changed accordingly based the rule in colorEHFunclets(). Please correct me if I miss something.
>
> ```
> define void @test(i1 %b, i32 %v1, i32 %v2) personality i32 (...)* @__CxxFrameHandler3 {
> entry:
> br label %while.cond
> while.cond:
> br i1 %b, label %try.cont, label %while.body
>
> while.body:
> invoke void @may_throw()
> to label %while.body2 unwind label %lpadBB
>
> while.body2:
> %v = call i32 @getv()
> %sinkable= mul i32 %v, %v2
> invoke void @may_throw2()
> to label %while.cond unwind label %lpadBB
> lpadBB:
> %.lcssa1 = phi i32 [ 0, %while.body ], [ %sinkable, %while.body2 ]
>
> landingpad { i8*, i32 }
> catch i8* null
> br label %lpadBBSucc1
>
> lpadBBSucc1:
> ret void
>
> try.cont:
> ret void
> }
>
> ```
>
Using _CxxFrameHandler3 with LandingPadInst is unsupported to the best of my knowledge.
Regardless, I think the best version of the predicate is:
if (!BlockColors.empty() && BB->getFirstNonPHI()->isEHPad())
This way we will still DTRT when using less interesting personality routines.
https://reviews.llvm.org/D42833
More information about the llvm-commits
mailing list