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(); |