summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorMatthias Braun <matze@braunis.de>2016-07-21 03:50:39 +0000
committerMatthias Braun <matze@braunis.de>2016-07-21 03:50:39 +0000
commitd9fdad72aefb6e152a1505807e5afad3a6d7e57b (patch)
treee2cb1fdc5b6d300e933175dedad172ee57f0c780 /llvm/lib/CodeGen
parente3fc4d0fdda3762fc0e88bb426274d8fc946e480 (diff)
downloadbcm5719-llvm-d9fdad72aefb6e152a1505807e5afad3a6d7e57b.tar.gz
bcm5719-llvm-d9fdad72aefb6e152a1505807e5afad3a6d7e57b.zip
IPRA: Fix RegMask calculation for alias registers
This patch fixes a very subtle bug in regmask calculation. Thanks to zan jyu Wong <zyfwong@gmail.com> for bringing this to notice. For example if CL is only clobbered than CH should not be marked clobbered but CX, RCX and ECX should be mark clobbered. Previously for each modified register all of its aliases are marked clobbered by markRegClobbred() in RegUsageInfoCollector.cpp but that is wrong because when CL is clobbered then MRI::isPhysRegModified() will return true for CL, CX, ECX, RCX which is correct behavior but then for CX, EXC, RCX we mark CH also clobbered as CH is aliased to CX,ECX,RCX so markRegClobbred() is not required because isPhysRegModified already take cares of proper aliasing register. A very simple test case has been added to verify this change. Please find relevant bug report here : http://llvm.org/PR28567 Patch by Vivek Pandya <vivekvpandya@gmail.com> Differential Revision: https://reviews.llvm.org/D22400 llvm-svn: 276235
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/RegUsageInfoCollector.cpp13
1 files changed, 1 insertions, 12 deletions
diff --git a/llvm/lib/CodeGen/RegUsageInfoCollector.cpp b/llvm/lib/CodeGen/RegUsageInfoCollector.cpp
index 50b88542337..22eb1cea830 100644
--- a/llvm/lib/CodeGen/RegUsageInfoCollector.cpp
+++ b/llvm/lib/CodeGen/RegUsageInfoCollector.cpp
@@ -57,10 +57,6 @@ public:
bool runOnMachineFunction(MachineFunction &MF) override;
static char ID;
-
-private:
- void markRegClobbered(const TargetRegisterInfo *TRI, uint32_t *RegMask,
- unsigned PReg);
};
} // end of anonymous namespace
@@ -76,13 +72,6 @@ FunctionPass *llvm::createRegUsageInfoCollector() {
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();
@@ -116,7 +105,7 @@ bool RegUsageInfoCollector::runOnMachineFunction(MachineFunction &MF) {
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 =
OpenPOWER on IntegriCloud