[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