bool runOnMachineFunction(MachineFunction &MF) override;
static char ID;
-
-private:
- void markRegClobbered(const TargetRegisterInfo *TRI, uint32_t *RegMask,
- unsigned PReg);
};
} // end of anonymous namespace
return new RegUsageInfoCollector();
}
-void RegUsageInfoCollector::markRegClobbered(const TargetRegisterInfo *TRI,
- uint32_t *RegMask, unsigned PReg) {
- // If PReg is clobbered then all of its alias are also clobbered.
- for (MCRegAliasIterator AI(PReg, TRI, true); AI.isValid(); ++AI)
- RegMask[*AI / 32] &= ~(1u << *AI % 32);
-}
-
void RegUsageInfoCollector::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<PhysicalRegisterUsageInfo>();
AU.setPreservesAll();
for (unsigned PReg = 1, PRegE = TRI->getNumRegs(); PReg < PRegE; ++PReg)
if (MRI->isPhysRegModified(PReg, true))
- markRegClobbered(TRI, &RegMask[0], PReg);
+ RegMask[PReg / 32] &= ~(1u << PReg % 32);
if (!TargetFrameLowering::isSafeForNoCSROpt(F)) {
const uint32_t *CallPreservedMask =
--- /dev/null
+; RUN: llc -enable-ipra -print-regusage -o /dev/null 2>&1 < %s | FileCheck %s
+target triple = "x86_64--"
+
+define i8 @main(i8 %X) {
+ %inc = add i8 %X, 1
+ %inc2 = mul i8 %inc, 5
+; Here only CL is clobbred so CH should not be clobbred, but CX, ECX and RCX
+; should be clobbered.
+; CHECK: main Clobbered Registers: AH AL AX CL CX EAX ECX EFLAGS RAX RCX
+ ret i8 %inc2
+}
+