[PATCH][instcombine] Remove preservesCFG from instcombine
Nick Lewycky
nicholas at mxc.ca
Tue Nov 4 00:28:20 PST 2014
Mark Heffernan wrote:
> Hi Andrew,
>
> (Let me know if someone else is more appropriate to review this). This
> patch removes setPreservesCFG() from the instcombine pass.
NAK. Please don't commit this.
The reason
> is that InstCombine can modify terminator instructions (branches)
> specifically the predicate.
This is the thing where it removes an '%newcond = xor %cond, true' and
switches 'br %newcond, label %A, label %B' with 'br %cond, label %B,
label %A'?
If it's actually causing you problems, please just move that transform
to simplifycfg instead of removing preserves-cfg from instcombine.
Nick
Instcombine clears out dead blocks and
> replaces all the dead instruction uses with undef:
>
> http://llvm.org/docs/doxygen/html/InstructionCombining_8cpp_source.html#l02792
>
> These new undefs can be predicates of branches, and from the comment
> of setPreservesCFG():
>
> // setPreservesCFG - This function should be called to by the pass, iff
> they do
> // not:
> //
> // 1. Add or remove basic blocks from the function
> // 2. Modify terminator instructions in any way.
>
> Clearly instcombine is modifying terminator instructions so should not
> be calling setPreservesCFG(). The specific issue I ran into was a dead
> loop not being deleted because of stale analysis data. Repro:
>
> void foo(int *a, int start_x, int end_x, int start_y, int end_y, int k) {
> for (int y = start_y; y < end_y; y++) {
> for (int x = start_x; x < end_x; x++) {
> for (int i = 0; i < 1000; i++) {
> a[x + y + k*i] = 0;
> }
> }
> }
> }
>
> # Dead loop left after loop deletion:
> clang -S -emit-llvm foo.c -o - | opt -O1 -loop-rotate -loop-unswitch
> -instcombine -loop-deletion -S > bad.ll
>
> # Dead loop removed by splitting out loop-deletion into separate opt
> invocation:
> clang -S -emit-llvm foo.c -o - | opt -O1 -loop-rotate -loop-unswitch
> -instcombine | opt -loop-deletion -S > good.ll
>
> This patch fixes this discrepancy.
>
> Mark
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list