[llvm-commits] [llvm] r58592 - in /llvm/trunk: lib/Analysis/ScalarEvolution.cpp test/Analysis/ScalarEvolution/2008-11-02-QuadraticCrash.ll

Nick Lewycky nicholas at mxc.ca
Sun Nov 2 18:43:49 PST 2008


Author: nicholas
Date: Sun Nov  2 20:43:49 2008
New Revision: 58592

URL: http://llvm.org/viewvc/llvm-project?rev=58592&view=rev
Log:
Don't crash analyzing certain quadratics (addrec of {X,+,Y,+,1}).
We're still waiting on code that actually analyzes them properly.

Added:
    llvm/trunk/test/Analysis/ScalarEvolution/2008-11-02-QuadraticCrash.ll
Modified:
    llvm/trunk/lib/Analysis/ScalarEvolution.cpp

Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=58592&r1=58591&r2=58592&view=diff

==============================================================================
--- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
+++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Sun Nov  2 20:43:49 2008
@@ -2604,6 +2604,11 @@
     // The divisions must be performed as signed divisions.
     APInt NegB(-B);
     APInt TwoA( A << 1 );
+    if (TwoA.isMinValue()) {
+      SCEV *CNC = new SCEVCouldNotCompute();
+      return std::make_pair(CNC, CNC);
+    }
+
     ConstantInt *Solution1 = ConstantInt::get((NegB + SqrtVal).sdiv(TwoA));
     ConstantInt *Solution2 = ConstantInt::get((NegB - SqrtVal).sdiv(TwoA));
 

Added: llvm/trunk/test/Analysis/ScalarEvolution/2008-11-02-QuadraticCrash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ScalarEvolution/2008-11-02-QuadraticCrash.ll?rev=58592&view=auto

==============================================================================
--- llvm/trunk/test/Analysis/ScalarEvolution/2008-11-02-QuadraticCrash.ll (added)
+++ llvm/trunk/test/Analysis/ScalarEvolution/2008-11-02-QuadraticCrash.ll Sun Nov  2 20:43:49 2008
@@ -0,0 +1,21 @@
+; RUN: llvm-as < %s | opt -analyze -scalar-evolution
+; PR1827
+
+declare void @use(i32)
+
+define void @foo() {
+entry:
+	br label %loop_1
+
+loop_1:		; preds = %loop_1, %entry
+	%a = phi i32 [ 2, %entry ], [ %b, %loop_1 ]		; <i32> [#uses=2]
+	%c = phi i32 [ 5, %entry ], [ %d, %loop_1 ]		; <i32> [#uses=1]
+	%b = add i32 %a, 1		; <i32> [#uses=1]
+	%d = add i32 %c, %a		; <i32> [#uses=3]
+	%A = icmp ult i32 %d, 50		; <i1> [#uses=1]
+	br i1 %A, label %loop_1, label %endloop
+
+endloop:		; preds = %loop_1
+	call void @use(i32 %d)
+	ret void
+}





More information about the llvm-commits mailing list