[llvm-dev] Cleaning up ‘br i1 false’ cases in CodeGenPrepare
Friedman, Eli via llvm-dev
llvm-dev at lists.llvm.org
Fri Jun 29 12:20:59 PDT 2018
On 6/28/2018 9:44 PM, Bharathi Seshadri via llvm-dev wrote:
> Hi,
>
> I have come across a couple of cases where the code generated after
> CodeGenPrepare pass has "br i1 false .." with both true and false
> conditions preserved and this propagates further and remains the same
> in the final assembly code/executable.
>
> In CodeGenPrepare::runOnFunction, ConstantFoldTerminator (which
> handles the br i1 false condition) is called only once and if after
> the transformation of code by ConstantFoldTerminator() and
> DeleteDeadBlock() we end up with code like "br i1 false", there is no
> further opportunity to clean them up. So calling this code under
> (!DisableBranchOpts) in a loop until no more transformations are made
> fixes this issue. Is this reasonable ?
I would expect the precise case you're running into is rare: the second
iteration of the loop does nothing useful unless the IR specifically has
an i1 phi node in a block whose predecessors were erased. And the
default optimization pipeline runs SimplifyCFG at the very end, which is
close to CodeGenPrepare, so the CFG simplification will usually be a
no-op anyway.
We really shouldn't be doing this sort of folding in CodeGenPrepare in
the first place. It looks like it was added to work around the fact
that we we lower llvm.objectsize later than we should.
-Eli
--
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
More information about the llvm-dev
mailing list