Chromium Code Reviews| 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(); |