- for (const unsigned *AliasSet = RegInfo->getAliasSet(Reg);
- unsigned Alias = *AliasSet; ++AliasSet) {
- if (MachineInstr *LastUse = PhysRegInfo[Alias]) {
- if (PhysRegUsed[Alias])
- addRegisterKilled(Alias, LastUse);
- else
- addRegisterDead(Alias, LastUse);
+ for (const unsigned *SubRegs = RegInfo->getSubRegisters(Reg);
+ unsigned SubReg = *SubRegs; ++SubRegs) {
+ if (MachineInstr *LastRef = PhysRegInfo[SubReg]) {
+ if (PhysRegUsed[SubReg]) {
+ if (!HandlePhysRegKill(SubReg, LastRef)) {
+ if (PhysRegPartUse[SubReg])
+ PhysRegPartUse[SubReg]->addRegisterKilled(SubReg, RegInfo, true);
+ }
+ } else if (PhysRegPartUse[SubReg]) {
+ // Add implicit use / kill to last use of a sub-register.
+ PhysRegPartUse[SubReg]->addRegisterKilled(SubReg, RegInfo, true);
+ } else if (LastRef != MI) {
+ // This must be a def of the subreg on the same MI.
+ LastRef->addRegisterDead(SubReg, RegInfo);
+ }
+ }
+ }
+
+ if (MI) {
+ for (const unsigned *SuperRegs = RegInfo->getSuperRegisters(Reg);
+ unsigned SuperReg = *SuperRegs; ++SuperRegs) {
+ if (PhysRegInfo[SuperReg] && PhysRegInfo[SuperReg] != MI) {
+ // The larger register is previously defined. Now a smaller part is
+ // being re-defined. Treat it as read/mod/write.
+ // EAX =
+ // AX = EAX<imp-use,kill>, EAX<imp-def>
+ MI->addOperand(MachineOperand::CreateReg(SuperReg, false/*IsDef*/,
+ true/*IsImp*/,true/*IsKill*/));
+ MI->addOperand(MachineOperand::CreateReg(SuperReg, true/*IsDef*/,
+ true/*IsImp*/));
+ PhysRegInfo[SuperReg] = MI;
+ PhysRegUsed[SuperReg] = false;
+ PhysRegPartUse[SuperReg] = NULL;
+ } else {
+ // Remember this partial def.
+ PhysRegPartDef[SuperReg].push_back(MI);
+ }
+ }
+
+ PhysRegInfo[Reg] = MI;
+ PhysRegUsed[Reg] = false;
+ PhysRegPartDef[Reg].clear();
+ PhysRegPartUse[Reg] = NULL;
+
+ for (const unsigned *SubRegs = RegInfo->getSubRegisters(Reg);
+ unsigned SubReg = *SubRegs; ++SubRegs) {
+ PhysRegInfo[SubReg] = MI;
+ PhysRegUsed[SubReg] = false;
+ PhysRegPartDef[SubReg].clear();
+ PhysRegPartUse[SubReg] = NULL;