mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-12 14:06:36 +00:00
[AMDGPU] Correct the handling of inlineasm output registers.
Summary: - There's a regression due to the cross-block RC assignment. Use the proper way to derive the output register RC in inline asm. Reviewers: rampitec, alex-t Subscribers: arsenm, kzhuravl, jvesely, wdng, nhaehnle, dstuttard, tpr, t-tye, eraman, hiraditya, llvm-commits, yaxunl Tags: #llvm Differential Revision: https://reviews.llvm.org/D62537 llvm-svn: 361868
This commit is contained in:
parent
7040f72aca
commit
297e39ba1f
@ -10244,8 +10244,7 @@ bool SITargetLowering::requiresUniformRegister(MachineFunction &MF,
|
||||
unsigned AssignedReg;
|
||||
const TargetRegisterClass *RC;
|
||||
std::tie(AssignedReg, RC) = getRegForInlineAsmConstraint(
|
||||
SIRI, TC.ConstraintCode,
|
||||
getSimpleValueType(MF.getDataLayout(), CS.getType()));
|
||||
SIRI, TC.ConstraintCode, TC.ConstraintVT);
|
||||
if (RC) {
|
||||
MachineRegisterInfo &MRI = MF.getRegInfo();
|
||||
if (AssignedReg != 0 && SIRI->isSGPRReg(MRI, AssignedReg))
|
||||
|
@ -277,3 +277,23 @@ entry:
|
||||
tail call void asm sideeffect "; sgpr96 $0", "s"(<3 x i32> <i32 10, i32 11, i32 12>) #1
|
||||
ret void
|
||||
}
|
||||
|
||||
; Check aggregate types are handled properly.
|
||||
; CHECK-LABEL: mad_u64
|
||||
; CHECK: v_mad_u64_u32
|
||||
define void @mad_u64(i32 %x) {
|
||||
entry:
|
||||
br i1 undef, label %exit, label %false
|
||||
|
||||
false:
|
||||
%s0 = tail call { i64, i64 } asm sideeffect "v_mad_u64_u32 $0, $1, $2, $3, $4", "=v,=s,v,v,v"(i32 -766435501, i32 %x, i64 0)
|
||||
br label %exit
|
||||
|
||||
exit:
|
||||
%s1 = phi { i64, i64} [ undef, %entry ], [ %s0, %false]
|
||||
%v0 = extractvalue { i64, i64 } %s1, 0
|
||||
%v1 = extractvalue { i64, i64 } %s1, 1
|
||||
tail call void asm sideeffect "; use $0", "v"(i64 %v0)
|
||||
tail call void asm sideeffect "; use $0", "v"(i64 %v1)
|
||||
ret void
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user