diff options
author | Max Kazantsev <max.kazantsev@azul.com> | 2018-06-13 02:25:32 +0000 |
---|---|---|
committer | Max Kazantsev <max.kazantsev@azul.com> | 2018-06-13 02:25:32 +0000 |
commit | 0ed79620c6d2ff008a483d62f51b21e69f5bfac6 (patch) | |
tree | 9fcfa1fc38b810aa083003a93c02883ca5d975f5 /llvm/lib/Transforms/Utils | |
parent | 8472ec9663a5131b04abd01bff1fcd778c9b19c8 (diff) | |
download | bcm5719-llvm-0ed79620c6d2ff008a483d62f51b21e69f5bfac6.tar.gz bcm5719-llvm-0ed79620c6d2ff008a483d62f51b21e69f5bfac6.zip |
[SimplifyIndVars] Ignore dead users
IndVarSimplify sometimes makes transforms basing on users that are trivially dead. In particular,
if DCE wasn't run before it, there may be a dead `sext/zext` in loop that will trigger widening
transforms, however it makes no sense to do it.
This patch teaches IndVarsSimplify ignore the mist trivial cases of that.
Differential Revision: https://reviews.llvm.org/D47974
Reviewed By: sanjoy
llvm-svn: 334567
Diffstat (limited to 'llvm/lib/Transforms/Utils')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyIndVar.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp b/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp index e72602d016f..a417b037314 100644 --- a/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp @@ -26,6 +26,7 @@ #include "llvm/IR/PatternMatch.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/Transforms/Utils/Local.h" using namespace llvm; @@ -772,6 +773,15 @@ void SimplifyIndvar::simplifyUsers(PHINode *CurrIV, IVVisitor *V) { SimpleIVUsers.pop_back_val(); Instruction *UseInst = UseOper.first; + // If a user of the IndVar is trivially dead, we prefer just to mark it dead + // rather than try to do some complex analysis or transformation (such as + // widening) basing on it. + // TODO: Propagate TLI and pass it here to handle more cases. + if (isInstructionTriviallyDead(UseInst, /* TLI */ nullptr)) { + DeadInsts.emplace_back(UseInst); + continue; + } + // Bypass back edges to avoid extra work. if (UseInst == CurrIV) continue; |