[PATCH] D31488: [SimplifyIndvar] Replace the sdiv used by IV if we can prove both of its operands are non-negative
Sanjoy Das via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 30 12:53:00 PDT 2017
sanjoy requested changes to this revision.
sanjoy added a comment.
This revision now requires changes to proceed.
Comments inline.
You can also do this same rewrite within SCEV. That is, try to have `getSCEV(sdiv instruction)` return a `SCEVUDivExpr` if legal. However, given that `udiv` is more canonical, this patch is good too if it solves your problem.
================
Comment at: lib/Transforms/Utils/SimplifyIndVar.cpp:38
STATISTIC(NumElimRem , "Number of IV remainder operations eliminated");
+STATISTIC(NumElimSDiv , "Number of IV signed division operations eliminated");
STATISTIC(NumElimCmp , "Number of IV comparisons eliminated");
----------------
s/eliminated/converted to unsigned division/
================
Comment at: lib/Transforms/Utils/SimplifyIndVar.cpp:275
+ // the numerator.
+ if (IVOperand != SDiv->getOperand(0))
+ return false;
----------------
This seems unnecessary - why do you not care about optimizing
```
%val = sdiv <non-iv-known-positive>, <iv>
```
================
Comment at: lib/Transforms/Utils/SimplifyIndVar.cpp:279
+ // Get the SCEVs for the ICmp operands.
+ auto S = SE->getSCEV(SDiv->getOperand(0));
+ auto X = SE->getSCEV(SDiv->getOperand(1));
----------------
Use `auto *`.
================
Comment at: lib/Transforms/Utils/SimplifyIndVar.cpp:284
+ const Loop *L = LI->getLoopFor(SDiv->getParent());
+ S = SE->getSCEVAtScope(S, L);
+ X = SE->getSCEVAtScope(X, L);
----------------
I'd use `N` and `D` instead of `S` and `X`.
================
Comment at: lib/Transforms/Utils/SimplifyIndVar.cpp:289
+ if (SE->isKnownNonNegative(S) && SE->isKnownNonNegative(X)) {
+ auto UDiv = BinaryOperator::Create(
+ BinaryOperator::UDiv, SDiv->getOperand(0), SDiv->getOperand(1),
----------------
Use `auto *`.
================
Comment at: lib/Transforms/Utils/SimplifyIndVar.cpp:297
+ Changed = true;
+ DeadInsts.emplace_back(SDiv);
+ return true;
----------------
Why not `push_back`?
https://reviews.llvm.org/D31488
More information about the llvm-commits
mailing list