aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target
diff options
context:
space:
mode:
authorVikram S. Adve <vadve@cs.uiuc.edu>2002-03-31 18:54:37 +0000
committerVikram S. Adve <vadve@cs.uiuc.edu>2002-03-31 18:54:37 +0000
commit1a53f03392ea21a47745430057f0b342129dd902 (patch)
treee0d10d44cb27bdb13aa86795fc9f4e59829d529d /lib/Target
parent9acfbeeaa8c71badd51d06959c082f377176a620 (diff)
downloadexternal_llvm-1a53f03392ea21a47745430057f0b342129dd902.zip
external_llvm-1a53f03392ea21a47745430057f0b342129dd902.tar.gz
external_llvm-1a53f03392ea21a47745430057f0b342129dd902.tar.bz2
Bug fix: address used by indirect call instruction should also
be marked as having a Call Interference, even though it may not be live after the call. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2068 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target')
-rw-r--r--lib/Target/SparcV9/RegAlloc/PhyRegAlloc.cpp37
1 files changed, 21 insertions, 16 deletions
diff --git a/lib/Target/SparcV9/RegAlloc/PhyRegAlloc.cpp b/lib/Target/SparcV9/RegAlloc/PhyRegAlloc.cpp
index b6a8ae1..49667e0 100644
--- a/lib/Target/SparcV9/RegAlloc/PhyRegAlloc.cpp
+++ b/lib/Target/SparcV9/RegAlloc/PhyRegAlloc.cpp
@@ -211,20 +211,6 @@ void PhyRegAlloc::addInterference(const Value *Def,
void PhyRegAlloc::setCallInterferences(const MachineInstr *MInst,
const ValueSet *LVSetAft) {
- // Now find the LR of the return value of the call
- // We do this because, we look at the LV set *after* the instruction
- // to determine, which LRs must be saved across calls. The return value
- // of the call is live in this set - but it does not interfere with call
- // (i.e., we can allocate a volatile register to the return value)
- //
- LiveRange *RetValLR = NULL;
- const Value *RetVal = MRI.getCallInstRetVal( MInst );
-
- if( RetVal ) {
- RetValLR = LRI.getLiveRangeForValue( RetVal );
- assert( RetValLR && "No LR for RetValue of call");
- }
-
if( DEBUG_RA)
cerr << "\n For call inst: " << *MInst;
@@ -243,11 +229,10 @@ void PhyRegAlloc::setCallInterferences(const MachineInstr *MInst,
printSet(*LR);
}
-
// LR can be null if it is a const since a const
// doesn't have a dominating def - see Assumptions above
//
- if( LR && (LR != RetValLR) ) {
+ if( LR ) {
LR->setCallInterference();
if( DEBUG_RA) {
cerr << "\n ++Added call interf for LR: " ;
@@ -257,6 +242,26 @@ void PhyRegAlloc::setCallInterferences(const MachineInstr *MInst,
}
+ // Now find the LR of the return value of the call
+ // We do this because, we look at the LV set *after* the instruction
+ // to determine, which LRs must be saved across calls. The return value
+ // of the call is live in this set - but it does not interfere with call
+ // (i.e., we can allocate a volatile register to the return value)
+ //
+ if( const Value *RetVal = MRI.getCallInstRetVal( MInst )) {
+ LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
+ assert( RetValLR && "No LR for RetValue of call");
+ RetValLR->clearCallInterference();
+ }
+
+ // If the CALL is an indirect call, find the LR of the function pointer.
+ // That has a call interference because it conflicts with outgoing args.
+ if( const Value *AddrVal = MRI.getCallInstIndirectAddrVal( MInst )) {
+ LiveRange *AddrValLR = LRI.getLiveRangeForValue( AddrVal );
+ assert( AddrValLR && "No LR for indirect addr val of call");
+ AddrValLR->setCallInterference();
+ }
+
}