mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
Do not share a single unknown val# for all the live ranges merged into a physical sub-register live interval. When coalescer is merging in clobbered virtaul register live interval into a physical register live interval, give each virtual register val# a separate val# in the physical register live interval. Otherwise, the coalescer would have lost track of the definitions information it needs to make correct coalescing decisions.
llvm-svn: 70026
This commit is contained in:
parent
9093a67350
commit
696a04eba2
@ -213,10 +213,6 @@ namespace llvm {
|
||||
return VNI;
|
||||
}
|
||||
|
||||
/// getUnknownValNo - Find a value# for unknown values, if there isn't one
|
||||
/// create a new one.
|
||||
VNInfo *getUnknownValNo(BumpPtrAllocator &VNInfoAllocator);
|
||||
|
||||
/// addKill - Add a kill instruction index to the specified value
|
||||
/// number.
|
||||
static void addKill(VNInfo *VNI, unsigned KillIdx) {
|
||||
|
@ -19,6 +19,7 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/CodeGen/LiveInterval.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/SmallSet.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/Support/Streams.h"
|
||||
@ -567,20 +568,6 @@ void LiveInterval::MergeValueInAsValue(const LiveInterval &RHS,
|
||||
}
|
||||
}
|
||||
|
||||
VNInfo *LiveInterval::getUnknownValNo(BumpPtrAllocator &VNInfoAllocator) {
|
||||
unsigned i = getNumValNums();
|
||||
if (i) {
|
||||
do {
|
||||
--i;
|
||||
VNInfo *VNI = getValNumInfo(i);
|
||||
if (VNI->def == ~0U && !VNI->copy &&
|
||||
!VNI->hasPHIKill && !VNI->redefByEC && VNI->kills.empty())
|
||||
return VNI;
|
||||
} while (i != 0);
|
||||
}
|
||||
return getNextValue(~0U, 0, VNInfoAllocator);
|
||||
}
|
||||
|
||||
|
||||
/// MergeInClobberRanges - For any live ranges that are not defined in the
|
||||
/// current interval, but are defined in the Clobbers interval, mark them
|
||||
@ -589,12 +576,19 @@ void LiveInterval::MergeInClobberRanges(const LiveInterval &Clobbers,
|
||||
BumpPtrAllocator &VNInfoAllocator) {
|
||||
if (Clobbers.empty()) return;
|
||||
|
||||
// Find a value # to use for the clobber ranges. If there is already a value#
|
||||
// for unknown values, use it.
|
||||
VNInfo *ClobberValNo = getUnknownValNo(VNInfoAllocator);
|
||||
|
||||
DenseMap<VNInfo*, VNInfo*> ValNoMaps;
|
||||
iterator IP = begin();
|
||||
for (const_iterator I = Clobbers.begin(), E = Clobbers.end(); I != E; ++I) {
|
||||
// For every val# in the Clobbers interval, create a new "unknown" val#.
|
||||
VNInfo *ClobberValNo = 0;
|
||||
DenseMap<VNInfo*, VNInfo*>::iterator VI = ValNoMaps.find(I->valno);
|
||||
if (VI != ValNoMaps.end())
|
||||
ClobberValNo = VI->second;
|
||||
else {
|
||||
ClobberValNo = getNextValue(~0U, 0, VNInfoAllocator);
|
||||
ValNoMaps.insert(std::make_pair(I->valno, ClobberValNo));
|
||||
}
|
||||
|
||||
bool Done = false;
|
||||
unsigned Start = I->start, End = I->end;
|
||||
// If a clobber range starts before an existing range and ends after
|
||||
@ -637,7 +631,7 @@ void LiveInterval::MergeInClobberRange(unsigned Start, unsigned End,
|
||||
BumpPtrAllocator &VNInfoAllocator) {
|
||||
// Find a value # to use for the clobber ranges. If there is already a value#
|
||||
// for unknown values, use it.
|
||||
VNInfo *ClobberValNo = getUnknownValNo(VNInfoAllocator);
|
||||
VNInfo *ClobberValNo = getNextValue(~0U, 0, VNInfoAllocator);
|
||||
|
||||
iterator IP = begin();
|
||||
IP = std::upper_bound(IP, end(), Start);
|
||||
|
19
test/CodeGen/X86/2009-04-25-CoalescerBug.ll
Normal file
19
test/CodeGen/X86/2009-04-25-CoalescerBug.ll
Normal file
@ -0,0 +1,19 @@
|
||||
; RUN: llvm-as < %s | llc -march=x86-64 | grep mov | count 2
|
||||
; rdar://6806252
|
||||
|
||||
define i64 @test(i32* %tmp13) nounwind {
|
||||
entry:
|
||||
br label %while.cond
|
||||
|
||||
while.cond: ; preds = %while.cond, %entry
|
||||
%tmp15 = load i32* %tmp13 ; <i32> [#uses=2]
|
||||
%bf.lo = lshr i32 %tmp15, 1 ; <i32> [#uses=1]
|
||||
%bf.lo.cleared = and i32 %bf.lo, 2147483647 ; <i32> [#uses=1]
|
||||
%conv = zext i32 %bf.lo.cleared to i64 ; <i64> [#uses=1]
|
||||
%bf.lo.cleared25 = and i32 %tmp15, 1 ; <i32> [#uses=1]
|
||||
%tobool = icmp ne i32 %bf.lo.cleared25, 0 ; <i1> [#uses=1]
|
||||
br i1 %tobool, label %while.cond, label %while.end
|
||||
|
||||
while.end: ; preds = %while.cond
|
||||
ret i64 %conv
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user