mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-23 16:19:52 +00:00
Drop <def,dead> flags when merging into an unused lane.
The new coalescer can merge a dead def into an unused lane of an otherwise live vector register. Clear the <dead> flag when that happens since the flag refers to the full virtual register which is still live after the partial dead def. This fixes PR14079. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165877 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1739,15 +1739,20 @@ void JoinVals::pruneValues(JoinVals &Other,
|
|||||||
// has been replaced.
|
// has been replaced.
|
||||||
Val &OtherV = Other.Vals[Vals[i].OtherVNI->id];
|
Val &OtherV = Other.Vals[Vals[i].OtherVNI->id];
|
||||||
bool EraseImpDef = OtherV.IsImplicitDef && OtherV.Resolution == CR_Keep;
|
bool EraseImpDef = OtherV.IsImplicitDef && OtherV.Resolution == CR_Keep;
|
||||||
if (!EraseImpDef && !Def.isBlock()) {
|
if (!Def.isBlock()) {
|
||||||
// Remove <def,read-undef> flags. This def is now a partial redef.
|
// Remove <def,read-undef> flags. This def is now a partial redef.
|
||||||
|
// Also remove <def,dead> flags since the joined live range will
|
||||||
|
// continue past this instruction.
|
||||||
for (MIOperands MO(Indexes->getInstructionFromIndex(Def));
|
for (MIOperands MO(Indexes->getInstructionFromIndex(Def));
|
||||||
MO.isValid(); ++MO)
|
MO.isValid(); ++MO)
|
||||||
if (MO->isReg() && MO->isDef() && MO->getReg() == LI.reg)
|
if (MO->isReg() && MO->isDef() && MO->getReg() == LI.reg) {
|
||||||
MO->setIsUndef(false);
|
MO->setIsUndef(EraseImpDef);
|
||||||
|
MO->setIsDead(false);
|
||||||
|
}
|
||||||
// This value will reach instructions below, but we need to make sure
|
// This value will reach instructions below, but we need to make sure
|
||||||
// the live range also reaches the instruction at Def.
|
// the live range also reaches the instruction at Def.
|
||||||
EndPoints.push_back(Def);
|
if (!EraseImpDef)
|
||||||
|
EndPoints.push_back(Def);
|
||||||
}
|
}
|
||||||
DEBUG(dbgs() << "\t\tpruned " << PrintReg(Other.LI.reg) << " at " << Def
|
DEBUG(dbgs() << "\t\tpruned " << PrintReg(Other.LI.reg) << " at " << Def
|
||||||
<< ": " << Other.LI << '\n');
|
<< ": " << Other.LI << '\n');
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
; RUN: llc < %s -mcpu=cortex-a9 -verify-coalescing | FileCheck %s
|
; RUN: llc < %s -mcpu=cortex-a9 -verify-coalescing -verify-machineinstrs | FileCheck %s
|
||||||
target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32"
|
target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32"
|
||||||
target triple = "thumbv7-apple-ios0.0.0"
|
target triple = "thumbv7-apple-ios0.0.0"
|
||||||
|
|
||||||
@@ -263,3 +263,29 @@ bb31: ; preds = %bb12, %bb
|
|||||||
declare <2 x float> @baz(<2 x float>, <2 x float>, <2 x float>) nounwind readnone
|
declare <2 x float> @baz(<2 x float>, <2 x float>, <2 x float>) nounwind readnone
|
||||||
|
|
||||||
declare <2 x float> @baz67(<2 x float>, <2 x float>) nounwind readnone
|
declare <2 x float> @baz67(<2 x float>, <2 x float>) nounwind readnone
|
||||||
|
|
||||||
|
%struct.wombat.5 = type { %struct.quux, %struct.quux, %struct.quux, %struct.quux }
|
||||||
|
%struct.quux = type { <4 x float> }
|
||||||
|
|
||||||
|
; CHECK: pr14079
|
||||||
|
define linkonce_odr arm_aapcs_vfpcc %struct.wombat.5 @pr14079(i8* nocapture %arg, i8* nocapture %arg1, i8* nocapture %arg2) nounwind uwtable inlinehint {
|
||||||
|
bb:
|
||||||
|
%tmp = shufflevector <2 x i64> zeroinitializer, <2 x i64> undef, <1 x i32> zeroinitializer
|
||||||
|
%tmp3 = bitcast <1 x i64> %tmp to <2 x float>
|
||||||
|
%tmp4 = shufflevector <2 x float> %tmp3, <2 x float> zeroinitializer, <2 x i32> <i32 1, i32 3>
|
||||||
|
%tmp5 = shufflevector <2 x float> %tmp4, <2 x float> undef, <2 x i32> <i32 1, i32 3>
|
||||||
|
%tmp6 = bitcast <2 x float> %tmp5 to <1 x i64>
|
||||||
|
%tmp7 = shufflevector <1 x i64> undef, <1 x i64> %tmp6, <2 x i32> <i32 0, i32 1>
|
||||||
|
%tmp8 = bitcast <2 x i64> %tmp7 to <4 x float>
|
||||||
|
%tmp9 = shufflevector <2 x i64> zeroinitializer, <2 x i64> undef, <1 x i32> <i32 1>
|
||||||
|
%tmp10 = bitcast <1 x i64> %tmp9 to <2 x float>
|
||||||
|
%tmp11 = shufflevector <2 x float> %tmp10, <2 x float> undef, <2 x i32> <i32 0, i32 2>
|
||||||
|
%tmp12 = shufflevector <2 x float> %tmp11, <2 x float> undef, <2 x i32> <i32 0, i32 2>
|
||||||
|
%tmp13 = bitcast <2 x float> %tmp12 to <1 x i64>
|
||||||
|
%tmp14 = shufflevector <1 x i64> %tmp13, <1 x i64> undef, <2 x i32> <i32 0, i32 1>
|
||||||
|
%tmp15 = bitcast <2 x i64> %tmp14 to <4 x float>
|
||||||
|
%tmp16 = insertvalue %struct.wombat.5 undef, <4 x float> %tmp8, 1, 0
|
||||||
|
%tmp17 = insertvalue %struct.wombat.5 %tmp16, <4 x float> %tmp15, 2, 0
|
||||||
|
%tmp18 = insertvalue %struct.wombat.5 %tmp17, <4 x float> undef, 3, 0
|
||||||
|
ret %struct.wombat.5 %tmp18
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user