[llvm-commits] [llvm] r161107 - in /llvm/trunk: lib/Analysis/ScalarEvolution.cpp test/Analysis/ScalarEvolution/SolveQuadraticEquation.ll
Nick Lewycky
nicholas at mxc.ca
Wed Aug 1 02:14:36 PDT 2012
Author: nicholas
Date: Wed Aug 1 04:14:36 2012
New Revision: 161107
URL: http://llvm.org/viewvc/llvm-project?rev=161107&view=rev
Log:
Stay rational; don't assert trying to take the square root of a negative value.
If it's negative, the loop is already proven to be infinite. Fixes PR13489!
Modified:
llvm/trunk/lib/Analysis/ScalarEvolution.cpp
llvm/trunk/test/Analysis/ScalarEvolution/SolveQuadraticEquation.ll
Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=161107&r1=161106&r2=161107&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
+++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Wed Aug 1 04:14:36 2012
@@ -5370,6 +5370,12 @@
SqrtTerm *= B;
SqrtTerm -= Four * (A * C);
+ if (SqrtTerm.isNegative()) {
+ // The loop is provably infinite.
+ const SCEV *CNC = SE.getCouldNotCompute();
+ return std::make_pair(CNC, CNC);
+ }
+
// Compute sqrt(B^2-4ac). This is guaranteed to be the nearest
// integer value or else APInt::sqrt() will assert.
APInt SqrtVal(SqrtTerm.sqrt());
Modified: llvm/trunk/test/Analysis/ScalarEvolution/SolveQuadraticEquation.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ScalarEvolution/SolveQuadraticEquation.ll?rev=161107&r1=161106&r2=161107&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/ScalarEvolution/SolveQuadraticEquation.ll (original)
+++ llvm/trunk/test/Analysis/ScalarEvolution/SolveQuadraticEquation.ll Wed Aug 1 04:14:36 2012
@@ -80,3 +80,24 @@
unreachable
}
; CHECK: Determining loop execution counts for: @test3
+
+; PR13489
+; We used to crash on this too.
+
+define void @test4() {
+entry:
+ br label %for.body
+
+for.body: ; preds = %for.body, %entry
+ %v2.02 = phi i64 [ 2, %entry ], [ %phitmp, %for.body ]
+ %v1.01 = phi i64 [ -2, %entry ], [ %sub1, %for.body ]
+ %sub1 = sub i64 %v1.01, %v2.02
+ %phitmp = add i64 %v2.02, 2
+ %tobool = icmp eq i64 %sub1, %phitmp
+ br i1 %tobool, label %for.end, label %for.body
+
+for.end: ; preds = %for.body
+ ret void
+}
+
+; CHECK: Determining loop execution counts for: @test4
More information about the llvm-commits
mailing list