Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Unified Diff: src/IceCfg.cpp

Issue 2124973005: Selectively invert ICMP operands for better address optimization (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: More auto Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/IceCfg.h ('K') | « src/IceCfg.h ('k') | src/IceInst.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/IceCfg.cpp
diff --git a/src/IceCfg.cpp b/src/IceCfg.cpp
index 0bcda2b0525b6e9225e2b61029249e3b6ba26d8b..b300027cad34850058a7e678d011af3dda80ad14 100644
--- a/src/IceCfg.cpp
+++ b/src/IceCfg.cpp
@@ -703,6 +703,76 @@ void Cfg::shortCircuitJumps() {
Nodes = NewList;
}
+void Cfg::invertICMP() {
+ for (auto *Node : getNodes()) {
+ for (auto &Inst : Node->getInsts()) {
+
+ if (auto *ICMP = llvm::dyn_cast<InstIcmp>(&Inst)) {
John 2016/07/07 21:20:56 optional: Icmp instead of ICMP
manasijm 2016/07/07 22:43:35 Done.
+ auto *Const0 = llvm::dyn_cast<Constant>(ICMP->getSrc(0));
+ auto *Const1 = llvm::dyn_cast<Constant>(ICMP->getSrc(1));
+ if (Const0 || Const1)
Eric Holk 2016/07/07 21:46:48 Should this be (Const0 != nullptr || Const1 != nul
manasijm 2016/07/07 22:43:35 Acknowledged.
+ continue;
+ auto *Var0 = llvm::dyn_cast<Variable>(ICMP->getSrc(0));
+ auto *Var1 = llvm::dyn_cast<Variable>(ICMP->getSrc(1));
+ if (!Var0)
Eric Holk 2016/07/07 21:46:48 Here too, Var0 == nullptr.
manasijm 2016/07/07 22:43:35 Done.
+ continue;
+ if (!getVMetadata()->isTracked(Var0))
+ continue;
+ auto Op0Def = getVMetadata()->getFirstDefinitionSingleBlock(Var0);
John 2016/07/07 21:20:56 are you missing a * here?
manasijm 2016/07/07 22:43:35 Done.
+ if (!Op0Def || !llvm::isa<InstLoad>(Op0Def))
John 2016/07/07 21:20:55 Op0Def == nullptr
manasijm 2016/07/07 22:43:35 Done.
+ continue;
+ if (getVMetadata()->getLocalUseNode(Var0) != Node)
+ continue;
+
John 2016/07/07 21:20:55 optional: define Var1 here, closer to where it is
manasijm 2016/07/07 22:43:35 Done.
+ if (Var1 && getVMetadata()->isTracked(Var1)) {
+ auto Op1Def = getVMetadata()->getFirstDefinitionSingleBlock(Var1);
John 2016/07/07 21:20:55 are you missing a * here?
manasijm 2016/07/07 22:43:35 Done.
+ if (Op1Def && !getVMetadata()->isMultiBlock(Var1) &&
+ llvm::isa<InstLoad>(Op1Def)) {
+ continue; // Both are loads
+ }
+ }
+ auto Cond = ICMP->getCondition();
+ switch (Cond) {
John 2016/07/07 21:20:56 I would either add a "swap" field to the ICEINSTIC
manasijm 2016/07/07 22:43:35 Added a function to InstIcmp
+ case InstIcmp::ICond::Eq:
+ break;
+ case InstIcmp::ICond::Ne:
+ break;
+ case InstIcmp::ICond::Sge:
+ Cond = InstIcmp::ICond::Sle;
+ break;
+ case InstIcmp::ICond::Sgt:
+ Cond = InstIcmp::ICond::Slt;
+ break;
+ case InstIcmp::ICond::Sle:
+ Cond = InstIcmp::ICond::Sge;
+ break;
+ case InstIcmp::ICond::Slt:
+ Cond = InstIcmp::ICond::Sgt;
+ break;
+ case InstIcmp::ICond::Uge:
+ Cond = InstIcmp::ICond::Ule;
+ break;
+ case InstIcmp::ICond::Ugt:
+ Cond = InstIcmp::ICond::Ult;
+ break;
+ case InstIcmp::ICond::Ule:
+ Cond = InstIcmp::ICond::Uge;
+ break;
+ case InstIcmp::ICond::Ult:
+ Cond = InstIcmp::ICond::Ugt;
+ break;
+ default:
+ continue;
+ }
+ ICMP->setCondition(Cond);
+ auto *TempOp = ICMP->getSrc(0);
+ ICMP->replaceSource(0, ICMP->getSrc(1));
+ ICMP->replaceSource(1, TempOp);
+ }
+ }
+ }
+}
+
void Cfg::doArgLowering() {
TimerMarker T(TimerStack::TT_doArgLowering, this);
getTarget()->lowerArguments();
« src/IceCfg.h ('K') | « src/IceCfg.h ('k') | src/IceInst.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698