mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-03 01:12:53 +00:00
Drop the REDEF_BY_EC VNInfo flag.
A live range that has an early clobber tied redef now looks like a normal tied redef, except the early clobber def uses the early clobber slot. This is enough to handle any strange interference problems. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149769 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7e899cbb91
commit
0aad7d274d
@ -43,9 +43,8 @@ namespace llvm {
|
||||
private:
|
||||
enum {
|
||||
HAS_PHI_KILL = 1,
|
||||
REDEF_BY_EC = 1 << 1,
|
||||
IS_PHI_DEF = 1 << 2,
|
||||
IS_UNUSED = 1 << 3
|
||||
IS_PHI_DEF = 1 << 1,
|
||||
IS_UNUSED = 1 << 2
|
||||
};
|
||||
|
||||
unsigned char flags;
|
||||
@ -95,17 +94,6 @@ namespace llvm {
|
||||
flags &= ~HAS_PHI_KILL;
|
||||
}
|
||||
|
||||
/// Returns true if this value is re-defined by an early clobber somewhere
|
||||
/// during the live range.
|
||||
bool hasRedefByEC() const { return flags & REDEF_BY_EC; }
|
||||
/// Set the "redef by early clobber" flag on this value.
|
||||
void setHasRedefByEC(bool hasRedef) {
|
||||
if (hasRedef)
|
||||
flags |= REDEF_BY_EC;
|
||||
else
|
||||
flags &= ~REDEF_BY_EC;
|
||||
}
|
||||
|
||||
/// Returns true if this value is defined by a PHI instruction (or was,
|
||||
/// PHI instrucions may have been eliminated).
|
||||
bool isPHIDef() const { return flags & IS_PHI_DEF; }
|
||||
|
@ -642,8 +642,6 @@ void LiveInterval::print(raw_ostream &OS, const TargetRegisterInfo *TRI) const {
|
||||
OS << "-phidef";
|
||||
if (vni->hasPHIKill())
|
||||
OS << "-phikill";
|
||||
if (vni->hasRedefByEC())
|
||||
OS << "-ec";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -432,8 +432,6 @@ exit:
|
||||
bool Extend = ValNo != 0;
|
||||
if (!Extend)
|
||||
ValNo = interval.getNextValue(start, VNInfoAllocator);
|
||||
if (Extend && MO.isEarlyClobber())
|
||||
ValNo->setHasRedefByEC(true);
|
||||
LiveRange LR(start, end, ValNo);
|
||||
interval.addRange(LR);
|
||||
DEBUG(dbgs() << " +" << LR << '\n');
|
||||
|
@ -438,27 +438,6 @@ bool RegisterCoalescer::AdjustCopiesBackFrom(const CoalescerPair &CP,
|
||||
// The live range might not exist after fun with physreg coalescing.
|
||||
if (ALR == IntA.end()) return false;
|
||||
VNInfo *AValNo = ALR->valno;
|
||||
// If it's re-defined by an early clobber somewhere in the live range, then
|
||||
// it's not safe to eliminate the copy. FIXME: This is a temporary workaround.
|
||||
// See PR3149:
|
||||
// 172 %ECX<def> = MOV32rr %reg1039<kill>
|
||||
// 180 INLINEASM <es:subl $5,$1
|
||||
// sbbl $3,$0>, 10, %EAX<def>, 14, %ECX<earlyclobber,def>, 9,
|
||||
// %EAX<kill>,
|
||||
// 36, <fi#0>, 1, %reg0, 0, 9, %ECX<kill>, 36, <fi#1>, 1, %reg0, 0
|
||||
// 188 %EAX<def> = MOV32rr %EAX<kill>
|
||||
// 196 %ECX<def> = MOV32rr %ECX<kill>
|
||||
// 204 %ECX<def> = MOV32rr %ECX<kill>
|
||||
// 212 %EAX<def> = MOV32rr %EAX<kill>
|
||||
// 220 %EAX<def> = MOV32rr %EAX
|
||||
// 228 %reg1039<def> = MOV32rr %ECX<kill>
|
||||
// The early clobber operand ties ECX input to the ECX def.
|
||||
//
|
||||
// The live interval of ECX is represented as this:
|
||||
// %reg20,inf = [46,47:1)[174,230:0) 0@174-(230) 1@46-(47)
|
||||
// The coalescer has no idea there was a def in the middle of [174,230].
|
||||
if (AValNo->hasRedefByEC())
|
||||
return false;
|
||||
|
||||
// If AValNo is defined as a copy from IntB, we can potentially process this.
|
||||
// Get the instruction that defines this value number.
|
||||
@ -1510,10 +1489,6 @@ bool RegisterCoalescer::JoinIntervals(CoalescerPair &CP) {
|
||||
if (!MI->isCopyLike()) // Src not defined by a copy?
|
||||
continue;
|
||||
|
||||
// Never join with a register that has EarlyClobber redefs.
|
||||
if (VNI->hasRedefByEC())
|
||||
return false;
|
||||
|
||||
// Figure out the value # from the RHS.
|
||||
LiveRange *lr = RHS.getLiveRangeContaining(VNI->def.getPrevSlot());
|
||||
// The copy could be to an aliased physreg.
|
||||
@ -1540,10 +1515,6 @@ bool RegisterCoalescer::JoinIntervals(CoalescerPair &CP) {
|
||||
if (!MI->isCopyLike()) // Src not defined by a copy?
|
||||
continue;
|
||||
|
||||
// Never join with a register that has EarlyClobber redefs.
|
||||
if (VNI->hasRedefByEC())
|
||||
return false;
|
||||
|
||||
// Figure out the value # from the LHS.
|
||||
LiveRange *lr = LHS.getLiveRangeContaining(VNI->def.getPrevSlot());
|
||||
// The copy could be to an aliased physreg.
|
||||
@ -1624,10 +1595,6 @@ bool RegisterCoalescer::JoinIntervals(CoalescerPair &CP) {
|
||||
if (LHSValNoAssignments[I->valno->id] !=
|
||||
RHSValNoAssignments[J->valno->id])
|
||||
return false;
|
||||
// If it's re-defined by an early clobber somewhere in the live range,
|
||||
// then conservatively abort coalescing.
|
||||
if (NewVNInfo[LHSValNoAssignments[I->valno->id]]->hasRedefByEC())
|
||||
return false;
|
||||
}
|
||||
|
||||
if (I->end < J->end)
|
||||
|
Loading…
Reference in New Issue
Block a user