mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-06 06:33:24 +00:00
R600: Enable folding of inline literals into REQ_SEQUENCE instructions
Tested-by: Aaron Watry <awatry@gmail.com> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188517 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e7ac2ed1c2
commit
6b88cdb34c
@ -453,29 +453,32 @@ SDNode *AMDGPUDAGToDAGISel::Select(SDNode *N) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (!TII->isALUInstr(Use->getMachineOpcode()) ||
|
||||
(TII->get(Use->getMachineOpcode()).TSFlags &
|
||||
R600_InstFlag::VECTOR)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int ImmIdx = TII->getOperandIdx(Use->getMachineOpcode(),
|
||||
AMDGPU::OpName::literal);
|
||||
if (ImmIdx == -1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (TII->getOperandIdx(Use->getMachineOpcode(),
|
||||
AMDGPU::OpName::dst) != -1) {
|
||||
// subtract one from ImmIdx, because the DST operand is usually index
|
||||
// 0 for MachineInstrs, but we have no DST in the Ops vector.
|
||||
ImmIdx--;
|
||||
switch(Use->getMachineOpcode()) {
|
||||
case AMDGPU::REG_SEQUENCE: break;
|
||||
default:
|
||||
if (!TII->isALUInstr(Use->getMachineOpcode()) ||
|
||||
(TII->get(Use->getMachineOpcode()).TSFlags &
|
||||
R600_InstFlag::VECTOR)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Check that we aren't already using an immediate.
|
||||
// XXX: It's possible for an instruction to have more than one
|
||||
// immediate operand, but this is not supported yet.
|
||||
if (ImmReg == AMDGPU::ALU_LITERAL_X) {
|
||||
int ImmIdx = TII->getOperandIdx(Use->getMachineOpcode(),
|
||||
AMDGPU::OpName::literal);
|
||||
if (ImmIdx == -1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (TII->getOperandIdx(Use->getMachineOpcode(),
|
||||
AMDGPU::OpName::dst) != -1) {
|
||||
// subtract one from ImmIdx, because the DST operand is usually index
|
||||
// 0 for MachineInstrs, but we have no DST in the Ops vector.
|
||||
ImmIdx--;
|
||||
}
|
||||
ConstantSDNode *C = dyn_cast<ConstantSDNode>(Use->getOperand(ImmIdx));
|
||||
assert(C);
|
||||
|
||||
|
@ -50,6 +50,9 @@ isImplicitlyDef(MachineRegisterInfo &MRI, unsigned Reg) {
|
||||
E = MRI.def_end(); It != E; ++It) {
|
||||
return (*It).isImplicitDef();
|
||||
}
|
||||
if (MRI.isReserved(Reg)) {
|
||||
return false;
|
||||
}
|
||||
llvm_unreachable("Reg without a def");
|
||||
return false;
|
||||
}
|
||||
|
@ -31,3 +31,16 @@ entry:
|
||||
store float %0, float addrspace(1)* %out
|
||||
ret void
|
||||
}
|
||||
|
||||
; Make sure inline literals are folded into REG_SEQUENCE instructions.
|
||||
; CHECK: @inline_literal_reg_sequence
|
||||
; CHECK: MOV T[[GPR:[0-9]]].X, 0.0
|
||||
; CHECK-NEXT: MOV T[[GPR]].Y, 0.0
|
||||
; CHECK-NEXT: MOV T[[GPR]].Z, 0.0
|
||||
; CHECK-NEXT: MOV * T[[GPR]].W, 0.0
|
||||
|
||||
define void @inline_literal_reg_sequence(<4 x i32> addrspace(1)* %out) {
|
||||
entry:
|
||||
store <4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32> addrspace(1)* %out
|
||||
ret void
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user