[RegUsageInfoCollector] Bugfix for handling of register aliases.
Don't assume the alias of a defined reg is always already in the set.
As the test case in https://bugs.llvm.org/show_bug.cgi?id=36587 discovered,
it is wrong to assume that all the aliases of the defined register in the
*current function* is already present in the UsedPhysRegsMask.
This patch changes this so that any definition in the current function of a
phys-reg always results in all its aliases inserted into the set of defined
registers.
Review: Quentin Colombet
https://reviews.llvm.org/D45157
llvm-svn: 331509
diff --git a/llvm/lib/CodeGen/RegUsageInfoCollector.cpp b/llvm/lib/CodeGen/RegUsageInfoCollector.cpp
index f49ea25..d934fa9 100644
--- a/llvm/lib/CodeGen/RegUsageInfoCollector.cpp
+++ b/llvm/lib/CodeGen/RegUsageInfoCollector.cpp
@@ -110,19 +110,18 @@
// Scan all the physical registers. When a register is defined in the current
// function set it and all the aliasing registers as defined in the regmask.
for (unsigned PReg = 1, PRegE = TRI->getNumRegs(); PReg < PRegE; ++PReg) {
- // If a register is in the UsedPhysRegsMask set then mark it as defined.
- // All it's aliases will also be in the set, so we can skip setting
- // as defined all the aliases here.
- if (UsedPhysRegsMask.test(PReg)) {
- SetRegAsDefined(PReg);
- continue;
- }
// If a register is defined by an instruction mark it as defined together
// with all it's aliases.
if (!MRI->def_empty(PReg)) {
for (MCRegAliasIterator AI(PReg, TRI, true); AI.isValid(); ++AI)
SetRegAsDefined(*AI);
+ continue;
}
+ // If a register is in the UsedPhysRegsMask set then mark it as defined.
+ // All clobbered aliases will also be in the set, so we can skip setting
+ // as defined all the aliases here.
+ if (UsedPhysRegsMask.test(PReg))
+ SetRegAsDefined(PReg);
}
if (!TargetFrameLowering::isSafeForNoCSROpt(F)) {