static cl::opt<bool>
CommuteDef("coalescer-commute-instrs",
- cl::init(false), cl::Hidden);
+ cl::init(true), cl::Hidden);
+
+ static cl::opt<int>
+ CommuteLimit("commute-limit",
+ cl::init(-1), cl::Hidden);
RegisterPass<SimpleRegisterCoalescing>
X("simple-register-coalescing", "Simple Register Coalescing");
if (HasOtherReachingDefs(IntA, IntB, AValNo, BValNo))
return false;
+ if (CommuteLimit >= 0 && numCommutes >= (unsigned)CommuteLimit)
+ return false;
+
// At this point we have decided that it is legal to do this
// transformation. Start by commuting the instruction.
MachineBasicBlock *MBB = DefMI->getParent();
O.setSubReg(0);
} else {
unsigned OldSubIdx = O.getSubReg();
- assert((!SubIdx || !OldSubIdx) && "Conflicting sub-register index!");
- if (SubIdx)
+ // Sub-register indexes goes from small to large. e.g.
+ // RAX: 0 -> AL, 1 -> AH, 2 -> AX, 3 -> EAX
+ // EAX: 0 -> AL, 1 -> AH, 2 -> AX
+ // So RAX's sub-register 2 is AX, RAX's sub-regsiter 3 is EAX, whose
+ // sub-register 2 is also AX.
+ if (SubIdx && OldSubIdx && SubIdx != OldSubIdx)
+ assert(OldSubIdx < SubIdx && "Conflicting sub-register index!");
+ else if (SubIdx)
O.setSubReg(SubIdx);
O.setReg(DstReg);
}