[llvm] d9f306a - [LV] Fix crash when generating remarks with multi-exit loops.

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Sat Jan 2 13:46:14 PST 2021


Thanks!

Philip

On 1/1/21 5:57 AM, Florian Hahn via llvm-commits wrote:
> Author: Florian Hahn
> Date: 2021-01-01T13:54:41Z
> New Revision: d9f306aa52fe233a711af2d5baa0d6536f164b10
>
> URL: https://github.com/llvm/llvm-project/commit/d9f306aa52fe233a711af2d5baa0d6536f164b10
> DIFF: https://github.com/llvm/llvm-project/commit/d9f306aa52fe233a711af2d5baa0d6536f164b10.diff
>
> LOG: [LV] Fix crash when generating remarks with multi-exit loops.
>
> If DoExtraAnalysis is true (e.g. because remarks are enabled), we
> continue with the analysis rather than exiting. Update code to
> conditionally check if the ExitBB has phis or not a single predecessor.
> Otherwise a nullptr is dereferenced with DoExtraAnalysis.
>
> Added:
>      llvm/test/Transforms/LoopVectorize/remarks-multi-exit-loops.ll
>
> Modified:
>      llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
>
> Removed:
>      
>
>
> ################################################################################
> diff  --git a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
> index 65b3132dc3f1..3906b11ba4b9 100644
> --- a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
> +++ b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
> @@ -1110,22 +1110,22 @@ bool LoopVectorizationLegality::canVectorizeLoopCFG(Loop *Lp,
>         Result = false;
>       else
>         return false;
> -  }
> -
> -  // The existing code assumes that LCSSA implies that phis are single entry
> -  // (which was true when we had at most a single exiting edge from the latch).
> -  // In general, there's nothing which prevents an LCSSA phi in exit block from
> -  // having two or more values if there are multiple exiting edges leading to
> -  // the exit block.  (TODO: implement general case)
> -  if (!llvm::empty(ExitBB->phis()) && !ExitBB->getSinglePredecessor()) {
> -    reportVectorizationFailure("The loop must have no live-out values if "
> -                               "it has more than one exiting block",
> -        "loop control flow is not understood by vectorizer",
> -        "CFGNotUnderstood", ORE, TheLoop);
> -    if (DoExtraAnalysis)
> -      Result = false;
> -    else
> -      return false;
> +  } else {
> +    // The existing code assumes that LCSSA implies that phis are single entry
> +    // (which was true when we had at most a single exiting edge from the latch).
> +    // In general, there's nothing which prevents an LCSSA phi in exit block from
> +    // having two or more values if there are multiple exiting edges leading to
> +    // the exit block.  (TODO: implement general case)
> +    if (!llvm::empty(ExitBB->phis()) && !ExitBB->getSinglePredecessor()) {
> +      reportVectorizationFailure("The loop must have no live-out values if "
> +                                 "it has more than one exiting block",
> +          "loop control flow is not understood by vectorizer",
> +          "CFGNotUnderstood", ORE, TheLoop);
> +      if (DoExtraAnalysis)
> +        Result = false;
> +      else
> +        return false;
> +    }
>     }
>   
>     return Result;
>
> diff  --git a/llvm/test/Transforms/LoopVectorize/remarks-multi-exit-loops.ll b/llvm/test/Transforms/LoopVectorize/remarks-multi-exit-loops.ll
> new file mode 100644
> index 000000000000..7cbff7acc14b
> --- /dev/null
> +++ b/llvm/test/Transforms/LoopVectorize/remarks-multi-exit-loops.ll
> @@ -0,0 +1,28 @@
> +; RUN: opt -disable-output -loop-vectorize -pass-remarks-analysis='.*' -force-vector-width=2 2>&1 %s | FileCheck %s
> +
> +; Make sure LV does not crash when generating remarks for loops with non-unique
> +; exit blocks.
> +define i32 @test_non_unique_exit_blocks(i32* nocapture readonly align 4 dereferenceable(1024) %data, i32 %x) {
> +; CHECK: loop not vectorized: loop control flow is not understood by vectorizer
> +;
> +entry:
> +  br label %for.header
> +
> +for.header:                                         ; preds = %for.cond.lr.ph, %for.body
> +  %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.latch ]
> +  %iv.next = add nuw nsw i64 %iv, 1
> +  %exitcond.not = icmp eq i64 %iv.next, 256
> +  br i1 %exitcond.not, label %header.exit, label %for.latch
> +
> +for.latch:
> +  %arrayidx = getelementptr inbounds i32, i32* %data, i64 %iv
> +  %lv = load i32, i32* %arrayidx, align 4
> +  %cmp1 = icmp eq i32 %lv, %x
> +  br i1 %cmp1, label %latch.exit, label %for.header
> +
> +header.exit:                       ; preds = %for.body
> +  ret i32 0
> +
> +latch.exit:                       ; preds = %for.body
> +  ret i32 %lv
> +}
>
>
>          
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list