<div dir="ltr">I think so.</div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jan 13, 2017 at 3:59 PM, Hans Wennborg <span dir="ltr"><<a href="mailto:hans@chromium.org" target="_blank">hans@chromium.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Should we merge this to the release branch?<br>
<div class="HOEnZb"><div class="h5"><br>
On Fri, Jan 13, 2017 at 2:24 PM, David Majnemer via llvm-commits<br>
<<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br>
> Author: majnemer<br>
> Date: Fri Jan 13 16:24:27 2017<br>
> New Revision: 291966<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=291966&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=291966&view=rev</a><br>
> Log:<br>
> [LoopStrengthReduce] Don't bother rewriting PHIs in catchswitch blocks<br>
><br>
> The catchswitch instruction cannot be split, don't bother trying to<br>
> rewrite it.<br>
><br>
> This fixes PR31627.<br>
><br>
> Added:<br>
>     llvm/trunk/test/Transforms/<wbr>LoopStrengthReduce/pr31627.ll<br>
> Modified:<br>
>     llvm/trunk/lib/Transforms/<wbr>Scalar/LoopStrengthReduce.cpp<br>
><br>
> Modified: llvm/trunk/lib/Transforms/<wbr>Scalar/LoopStrengthReduce.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp?rev=291966&r1=291965&r2=291966&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>Transforms/Scalar/<wbr>LoopStrengthReduce.cpp?rev=<wbr>291966&r1=291965&r2=291966&<wbr>view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/lib/Transforms/<wbr>Scalar/LoopStrengthReduce.cpp (original)<br>
> +++ llvm/trunk/lib/Transforms/<wbr>Scalar/LoopStrengthReduce.cpp Fri Jan 13 16:24:27 2017<br>
> @@ -3163,6 +3163,9 @@ LSRInstance::<wbr>CollectLoopInvariantFixupsA<br>
>          // Don't bother if the instruction is in a BB which ends in an EHPad.<br>
>          if (UseBB->getTerminator()-><wbr>isEHPad())<br>
>            continue;<br>
> +        // Don't bother rewriting PHIs in catchswitch blocks.<br>
> +        if (isa<CatchSwitchInst>(<wbr>UserInst->getParent()-><wbr>getTerminator()))<br>
> +          continue;<br>
>          // Ignore uses which are part of other SCEV expressions, to avoid<br>
>          // analyzing them multiple times.<br>
>          if (SE.isSCEVable(UserInst-><wbr>getType())) {<br>
> @@ -4672,7 +4675,8 @@ void LSRInstance::RewriteForPHI(<wbr>PHINode<br>
>        // is the canonical backedge for this loop, which complicates post-inc<br>
>        // users.<br>
>        if (e != 1 && BB->getTerminator()-><wbr>getNumSuccessors() > 1 &&<br>
> -          !isa<IndirectBrInst>(BB-><wbr>getTerminator())) {<br>
> +          !isa<IndirectBrInst>(BB-><wbr>getTerminator()) &&<br>
> +          !isa<CatchSwitchInst>(BB-><wbr>getTerminator())) {<br>
>          BasicBlock *Parent = PN->getParent();<br>
>          Loop *PNLoop = LI.getLoopFor(Parent);<br>
>          if (!PNLoop || Parent != PNLoop->getHeader()) {<br>
><br>
> Added: llvm/trunk/test/Transforms/<wbr>LoopStrengthReduce/pr31627.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopStrengthReduce/pr31627.ll?rev=291966&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>Transforms/LoopStrengthReduce/<wbr>pr31627.ll?rev=291966&view=<wbr>auto</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/test/Transforms/<wbr>LoopStrengthReduce/pr31627.ll (added)<br>
> +++ llvm/trunk/test/Transforms/<wbr>LoopStrengthReduce/pr31627.ll Fri Jan 13 16:24:27 2017<br>
> @@ -0,0 +1,58 @@<br>
> +; RUN: opt -S -loop-reduce < %s | FileCheck %s<br>
> +target datalayout = "e-m:w-i64:64-f80:128-n8:16:<wbr>32:64-S128"<br>
> +target triple = "x86_64-pc-windows-msvc19.0.<wbr>24215"<br>
> +<br>
> +define void @fn3() personality i32 (...)* @__CxxFrameHandler3 {<br>
> +entry:<br>
> +  %call = invoke i32 @fn2()<br>
> +          to label %for.cond.preheader unwind label %catch.dispatch2<br>
> +<br>
> +for.cond.preheader:                               ; preds = %entry<br>
> +  br label %for.cond<br>
> +<br>
> +for.cond:                                         ; preds = %for.cond.preheader, %for.cond<br>
> +  %b.0 = phi i32 [ %inc, %for.cond ], [ %call, %for.cond.preheader ]<br>
> +  %inc = add nsw i32 %b.0, 1<br>
> +  invoke void @fn1(i32 %inc)<br>
> +          to label %for.cond unwind label %catch.dispatch<br>
> +<br>
> +; CHECK:   %[[add:.*]] = add i32 %call, 1<br>
> +; CHECK:   br label %for.cond<br>
> +<br>
> +; CHECK: for.cond:                                         ; preds = %for.cond, %for.cond.preheader<br>
> +; CHECK:   %[[lsr_iv:.*]] = phi i32 [ %lsr.iv.next, %for.cond ], [ %[[add]], %for.cond.preheader ]<br>
> +; CHECK:   %[[lsr_iv_next:.*]] = add i32 %lsr.iv, 1<br>
> +; CHECK:   invoke void @fn1(i32 %[[lsr_iv]])<br>
> +<br>
> +<br>
> +catch.dispatch:                                   ; preds = %for.cond<br>
> +  %0 = catchswitch within none [label %catch] unwind label %catch.dispatch2<br>
> +<br>
> +catch:                                            ; preds = %catch.dispatch<br>
> +  %1 = catchpad within %0 [i8* null, i32 64, i8* null]<br>
> +  invoke void @_CxxThrowException(i8* null, i8* null) #2 [ "funclet"(token %1) ]<br>
> +          to label %unreachable unwind label %catch.dispatch2<br>
> +<br>
> +catch.dispatch2:                                  ; preds = %catch.dispatch, %catch, %entry<br>
> +  %a.0 = phi i32 [ undef, %entry ], [ %call, %catch ], [ %call, %catch.dispatch ]<br>
> +  %2 = catchswitch within none [label %catch3] unwind to caller<br>
> +<br>
> +catch3:                                           ; preds = %catch.dispatch2<br>
> +  %3 = catchpad within %2 [i8* null, i32 64, i8* null]<br>
> +  call void @fn1(i32 %a.0) [ "funclet"(token %3) ]<br>
> +  catchret from %3 to label %try.cont4<br>
> +<br>
> +try.cont4:                                        ; preds = %catch3<br>
> +  ret void<br>
> +<br>
> +unreachable:                                      ; preds = %catch<br>
> +  unreachable<br>
> +}<br>
> +<br>
> +declare i32 @fn2()<br>
> +<br>
> +declare i32 @__CxxFrameHandler3(...)<br>
> +<br>
> +declare void @fn1(i32)<br>
> +<br>
> +declare void @_CxxThrowException(i8*, i8*)<br>
><br>
><br>
> ______________________________<wbr>_________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br></div>