diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Analysis/IVUsers.cpp | 7 | 
1 files changed, 7 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/IVUsers.cpp b/llvm/lib/Analysis/IVUsers.cpp index b80966b65a1..0a6682a254f 100644 --- a/llvm/lib/Analysis/IVUsers.cpp +++ b/llvm/lib/Analysis/IVUsers.cpp @@ -21,6 +21,7 @@  #include "llvm/Analysis/Dominators.h"  #include "llvm/Analysis/LoopPass.h"  #include "llvm/Analysis/ScalarEvolutionExpressions.h" +#include "llvm/Analysis/ValueTracking.h"  #include "llvm/Target/TargetData.h"  #include "llvm/Assembly/Writer.h"  #include "llvm/ADT/STLExtras.h" @@ -120,6 +121,12 @@ bool IVUsers::AddUsersImpl(Instruction *I,    if (!SE->isSCEVable(I->getType()))      return false;   // Void and FP expressions cannot be reduced. +  // IVUsers is used by LSR which assumes that all SCEV expressions are safe to +  // pass to SCEVExpander. Expressions are not safe to expand if they represent +  // operations that are not safe to speculate, namely integer division. +  if (!isa<PHINode>(I) && !isSafeToSpeculativelyExecute(I, TD)) +    return false; +    // LSR is not APInt clean, do not touch integers bigger than 64-bits.    // Also avoid creating IVs of non-native types. For example, we don't want a    // 64-bit IV in 32-bit code just because the loop has one 64-bit cast.  | 

