[llvm-commits] [llvm] r166286 - in /llvm/trunk: lib/Analysis/ScalarEvolutionExpander.cpp test/Transforms/IndVarSimplify/2012-10-19-congruent-constant.ll test/Transforms/IndVarSimplify/no-iv-rewrite.ll
Benjamin Kramer
benny.kra at googlemail.com
Fri Oct 19 09:37:30 PDT 2012
Author: d0k
Date: Fri Oct 19 11:37:30 2012
New Revision: 166286
URL: http://llvm.org/viewvc/llvm-project?rev=166286&view=rev
Log:
SCEVExpander: Don't crash when trying to merge two constant phis.
Just constant fold them so they can't cause any trouble. Fixes PR12627.
Added:
llvm/trunk/test/Transforms/IndVarSimplify/2012-10-19-congruent-constant.ll
Modified:
llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp
llvm/trunk/test/Transforms/IndVarSimplify/no-iv-rewrite.ll
Modified: llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp?rev=166286&r1=166285&r2=166286&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp (original)
+++ llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp Fri Oct 19 11:37:30 2012
@@ -1618,6 +1618,17 @@
PEnd = Phis.end(); PIter != PEnd; ++PIter) {
PHINode *Phi = *PIter;
+ // Fold constant phis. They may be congruent to other constant phis and
+ // would confuse the logic below that expects proper IVs.
+ if (Value *V = Phi->hasConstantValue()) {
+ Phi->replaceAllUsesWith(V);
+ DeadInsts.push_back(Phi);
+ ++NumElim;
+ DEBUG_WITH_TYPE(DebugType, dbgs()
+ << "INDVARS: Eliminated constant iv: " << *Phi << '\n');
+ continue;
+ }
+
if (!SE.isSCEVable(Phi->getType()))
continue;
Added: llvm/trunk/test/Transforms/IndVarSimplify/2012-10-19-congruent-constant.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/IndVarSimplify/2012-10-19-congruent-constant.ll?rev=166286&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/IndVarSimplify/2012-10-19-congruent-constant.ll (added)
+++ llvm/trunk/test/Transforms/IndVarSimplify/2012-10-19-congruent-constant.ll Fri Oct 19 11:37:30 2012
@@ -0,0 +1,27 @@
+; RUN: opt -S -indvars < %s | FileCheck %s
+
+; PR12627
+define void @test1(i32 %x) nounwind uwtable ssp {
+entry:
+ br label %for.body
+
+for.body: ; preds = %for.body, %entry
+ %phi1 = phi i1 [ false, %entry ], [ %cmpa, %for.body ]
+ %phi2 = phi i1 [ false, %entry ], [ %cmpb, %for.body ]
+ %i.07 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
+ tail call void @aux(i1 %phi1, i1 %phi2) nounwind
+ %cmpa = icmp sgt i32 %i.07, 200
+ %cmpb = icmp sgt i32 %i.07, 100
+ %inc = add nsw i32 %i.07, 1
+ %exitcond = icmp eq i32 %inc, 100
+ br i1 %exitcond, label %for.end, label %for.body
+
+for.end: ; preds = %for.body
+ ret void
+
+; CHECK: @test1
+; CHECK-NOT: phi i1
+; CHECK: call void @aux(i1 false, i1 false)
+}
+
+declare void @aux(i1, i1)
Modified: llvm/trunk/test/Transforms/IndVarSimplify/no-iv-rewrite.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/IndVarSimplify/no-iv-rewrite.ll?rev=166286&r1=166285&r2=166286&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/IndVarSimplify/no-iv-rewrite.ll (original)
+++ llvm/trunk/test/Transforms/IndVarSimplify/no-iv-rewrite.ll Fri Oct 19 11:37:30 2012
@@ -199,7 +199,6 @@
; back to the loop iv.
;
; CHECK: loop:
-; CHECK: phi i32
; CHECK-NOT: phi
; CHECK: exit:
loop:
More information about the llvm-commits
mailing list