Disable indvars on loops when LoopSimplify form is not available.

This fixes PR7333.

llvm-svn: 106267
This commit is contained in:
Dan Gohman 2010-06-18 01:35:11 +00:00
parent 99ba4dac59
commit f3aea7aecf
2 changed files with 29 additions and 1 deletions

View File

@ -467,6 +467,17 @@ void IndVarSimplify::EliminateIVRemainders() {
}
bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
// If LoopSimplify form is not available, stay out of trouble. Some notes:
// - LSR currently only supports LoopSimplify-form loops. Indvars'
// canonicalization can be a pessimization without LSR to "clean up"
// afterwards.
// - We depend on having a preheader; in particular,
// Loop::getCanonicalInductionVariable only supports loops with preheaders,
// and we're in trouble if we can't find the induction variable even when
// we've manually inserted one.
if (!L->isLoopSimplifyForm())
return false;
IU = &getAnalysis<IVUsers>();
LI = &getAnalysis<LoopInfo>();
SE = &getAnalysis<ScalarEvolution>();

View File

@ -1,6 +1,6 @@
; RUN: opt < %s -indvars -S -disable-output
; PR5758
; PR5758
define zeroext i1 @foo() nounwind {
entry:
indirectbr i8* undef, [label %"202", label %"133"]
@ -20,3 +20,20 @@ entry:
"202": ; preds = %entry
ret i1 false
}
; PR7333
define void @__atomvec_module__put_vrml_bonds() nounwind {
bb7.preheader: ; preds = %entry
indirectbr i8* undef, [label %bb14, label %bb16]
bb14: ; preds = %bb14, %bb7.preheader
br label %bb16
bb16: ; preds = %bb16, %bb14, %bb7.preheader
%S.31.0 = phi i64 [ %3, %bb16 ], [ 1, %bb7.preheader ], [ 1, %bb14 ] ; <i64> [#uses=2]
%0 = add nsw i64 %S.31.0, -1 ; <i64> [#uses=1]
%1 = getelementptr inbounds [3 x double]* undef, i64 0, i64 %0 ; <double*> [#uses=1]
%2 = load double* %1, align 8 ; <double> [#uses=0]
%3 = add nsw i64 %S.31.0, 1 ; <i64> [#uses=1]
br label %bb16
}