[llvm] r259702 - [LoopStrengthReduce] Don't rewrite PHIs with incoming values from CatchSwitches

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 17 09:35:31 PST 2016


Could we get this merged into 3.8?

On Wed, Feb 3, 2016 at 1:30 PM, David Majnemer via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: majnemer
> Date: Wed Feb  3 15:30:34 2016
> New Revision: 259702
>
> URL: http://llvm.org/viewvc/llvm-project?rev=259702&view=rev
> Log:
> [LoopStrengthReduce] Don't rewrite PHIs with incoming values from
> CatchSwitches
>
> Bail out if we have a PHI on an EHPad that gets a value from a
> CatchSwitchInst.  Because the CatchSwitchInst cannot be split, there is
> no good place to stick any instructions.
>
> This fixes PR26373.
>
> Modified:
>     llvm/trunk/include/llvm/IR/Instructions.h
>     llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp
>     llvm/trunk/test/Transforms/LoopStrengthReduce/funclet.ll
>
> Modified: llvm/trunk/include/llvm/IR/Instructions.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Instructions.h?rev=259702&r1=259701&r2=259702&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/Instructions.h (original)
> +++ llvm/trunk/include/llvm/IR/Instructions.h Wed Feb  3 15:30:34 2016
> @@ -2512,6 +2512,14 @@ public:
>      return block_begin() + getNumOperands();
>    }
>
> +  iterator_range<block_iterator> blocks() {
> +    return make_range(block_begin(), block_end());
> +  }
> +
> +  iterator_range<const_block_iterator> blocks() const {
> +    return make_range(block_begin(), block_end());
> +  }
> +
>    op_range incoming_values() { return operands(); }
>
>    const_op_range incoming_values() const { return operands(); }
>
> Modified: llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp?rev=259702&r1=259701&r2=259702&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp Wed Feb  3
> 15:30:34 2016
> @@ -4799,6 +4799,17 @@ LSRInstance::LSRInstance(Loop *L, IVUser
>        DEBUG(dbgs() << "LSR skipping loop, too many IV Users in " << U <<
> "\n");
>        return;
>      }
> +    // Bail out if we have a PHI on an EHPad that gets a value from a
> +    // CatchSwitchInst.  Because the CatchSwitchInst cannot be split,
> there is
> +    // no good place to stick any instructions.
> +    if (auto *PN = dyn_cast<PHINode>(U.getUser())) {
> +       auto *FirstNonPHI = PN->getParent()->getFirstNonPHI();
> +       if (isa<FuncletPadInst>(FirstNonPHI) ||
> +           isa<CatchSwitchInst>(FirstNonPHI))
> +         for (BasicBlock *PredBB : PN->blocks())
> +           if (isa<CatchSwitchInst>(PredBB->getFirstNonPHI()))
> +             return;
> +    }
>    }
>
>  #ifndef NDEBUG
>
> Modified: llvm/trunk/test/Transforms/LoopStrengthReduce/funclet.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopStrengthReduce/funclet.ll?rev=259702&r1=259701&r2=259702&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/Transforms/LoopStrengthReduce/funclet.ll (original)
> +++ llvm/trunk/test/Transforms/LoopStrengthReduce/funclet.ll Wed Feb  3
> 15:30:34 2016
> @@ -214,3 +214,32 @@ try.cont.7:
>
>  ; CHECK: catch.dispatch.2:
>  ; CHECK: %e.0 = phi i32* [ %c, %try.cont ], [ %b, %catch.dispatch ]
> +
> +define i32 @test2() personality i32 (...)* @_except_handler3 {
> +entry:
> +  br label %for.body
> +
> +for.body:                                         ; preds = %for.inc,
> %entry
> +  %phi = phi i32 [ %inc, %for.inc ], [ 0, %entry ]
> +  invoke void @reserve()
> +          to label %for.inc unwind label %catch.dispatch
> +
> +catch.dispatch:                                   ; preds = %for.body
> +  %tmp18 = catchswitch within none [label %catch.handler] unwind to caller
> +
> +catch.handler:                                    ; preds =
> %catch.dispatch
> +  %phi.lcssa = phi i32 [ %phi, %catch.dispatch ]
> +  %tmp19 = catchpad within %tmp18 [i8* null]
> +  catchret from %tmp19 to label %done
> +
> +done:
> +  ret i32 %phi.lcssa
> +
> +for.inc:                                          ; preds = %for.body
> +  %inc = add i32 %phi, 1
> +  br label %for.body
> +}
> +
> +; CHECK-LABEL: define i32 @test2(
> +; CHECK:      %phi.lcssa = phi i32 [ %phi, %catch.dispatch ]
> +; CHECK-NEXT: catchpad within
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160217/c8c0275c/attachment.html>


More information about the llvm-commits mailing list