Skip to content

Commit

Permalink
[LoopStrengthReduce] Don't bother rewriting PHIs in catchswitch blocks
Browse files Browse the repository at this point in the history
The catchswitch instruction cannot be split, don't bother trying to
rewrite it.

This fixes PR31627.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291966 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
majnemer committed Jan 13, 2017
1 parent 3615e56 commit 22eeda1
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 1 deletion.
6 changes: 5 additions & 1 deletion lib/Transforms/Scalar/LoopStrengthReduce.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3163,6 +3163,9 @@ LSRInstance::CollectLoopInvariantFixupsAndFormulae() {
// Don't bother if the instruction is in a BB which ends in an EHPad.
if (UseBB->getTerminator()->isEHPad())
continue;
// Don't bother rewriting PHIs in catchswitch blocks.
if (isa<CatchSwitchInst>(UserInst->getParent()->getTerminator()))
continue;
// Ignore uses which are part of other SCEV expressions, to avoid
// analyzing them multiple times.
if (SE.isSCEVable(UserInst->getType())) {
Expand Down Expand Up @@ -4672,7 +4675,8 @@ void LSRInstance::RewriteForPHI(PHINode *PN,
// is the canonical backedge for this loop, which complicates post-inc
// users.
if (e != 1 && BB->getTerminator()->getNumSuccessors() > 1 &&
!isa<IndirectBrInst>(BB->getTerminator())) {
!isa<IndirectBrInst>(BB->getTerminator()) &&
!isa<CatchSwitchInst>(BB->getTerminator())) {
BasicBlock *Parent = PN->getParent();
Loop *PNLoop = LI.getLoopFor(Parent);
if (!PNLoop || Parent != PNLoop->getHeader()) {
Expand Down
58 changes: 58 additions & 0 deletions test/Transforms/LoopStrengthReduce/pr31627.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
; RUN: opt -S -loop-reduce < %s | FileCheck %s
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc19.0.24215"

define void @fn3() personality i32 (...)* @__CxxFrameHandler3 {
entry:
%call = invoke i32 @fn2()
to label %for.cond.preheader unwind label %catch.dispatch2

for.cond.preheader: ; preds = %entry
br label %for.cond

for.cond: ; preds = %for.cond.preheader, %for.cond
%b.0 = phi i32 [ %inc, %for.cond ], [ %call, %for.cond.preheader ]
%inc = add nsw i32 %b.0, 1
invoke void @fn1(i32 %inc)
to label %for.cond unwind label %catch.dispatch

; CHECK: %[[add:.*]] = add i32 %call, 1
; CHECK: br label %for.cond

; CHECK: for.cond: ; preds = %for.cond, %for.cond.preheader
; CHECK: %[[lsr_iv:.*]] = phi i32 [ %lsr.iv.next, %for.cond ], [ %[[add]], %for.cond.preheader ]
; CHECK: %[[lsr_iv_next:.*]] = add i32 %lsr.iv, 1
; CHECK: invoke void @fn1(i32 %[[lsr_iv]])


catch.dispatch: ; preds = %for.cond
%0 = catchswitch within none [label %catch] unwind label %catch.dispatch2

catch: ; preds = %catch.dispatch
%1 = catchpad within %0 [i8* null, i32 64, i8* null]
invoke void @_CxxThrowException(i8* null, i8* null) #2 [ "funclet"(token %1) ]
to label %unreachable unwind label %catch.dispatch2

catch.dispatch2: ; preds = %catch.dispatch, %catch, %entry
%a.0 = phi i32 [ undef, %entry ], [ %call, %catch ], [ %call, %catch.dispatch ]
%2 = catchswitch within none [label %catch3] unwind to caller

catch3: ; preds = %catch.dispatch2
%3 = catchpad within %2 [i8* null, i32 64, i8* null]
call void @fn1(i32 %a.0) [ "funclet"(token %3) ]
catchret from %3 to label %try.cont4

try.cont4: ; preds = %catch3
ret void

unreachable: ; preds = %catch
unreachable
}

declare i32 @fn2()

declare i32 @__CxxFrameHandler3(...)

declare void @fn1(i32)

declare void @_CxxThrowException(i8*, i8*)

0 comments on commit 22eeda1

Please sign in to comment.