aboutsummaryrefslogtreecommitdiffstats
path: root/src/amd/compiler
diff options
context:
space:
mode:
authorRhys Perry <[email protected]>2019-11-12 15:53:15 +0000
committerRhys Perry <[email protected]>2019-11-12 17:21:38 +0000
commit2c98d79d114d3ed82a9e60519d666f51a1172cd3 (patch)
tree7d9e108de3cfe13be10626fdcc2f8b6dac2c9999 /src/amd/compiler
parent5a1bacb6f916d9a46a3d44830a4eb4bd3dca7d23 (diff)
aco: don't propagate vgprs into v_readlane/v_writelane
Signed-off-by: Rhys Perry <[email protected]> Reviewed-by: Daniel Schürmann <[email protected]> Fixes: 93c8ebfa ('aco: Initial commit of independent AMD compiler')
Diffstat (limited to 'src/amd/compiler')
-rw-r--r--src/amd/compiler/aco_optimizer.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/amd/compiler/aco_optimizer.cpp b/src/amd/compiler/aco_optimizer.cpp
index 679f25b5dda..68f17569e32 100644
--- a/src/amd/compiler/aco_optimizer.cpp
+++ b/src/amd/compiler/aco_optimizer.cpp
@@ -474,6 +474,13 @@ bool valu_can_accept_literal(opt_ctx& ctx, aco_ptr<Instruction>& instr, unsigned
operand == 0 && can_accept_constant(instr, operand);
}
+bool valu_can_accept_vgpr(aco_ptr<Instruction>& instr, unsigned operand)
+{
+ if (instr->opcode == aco_opcode::v_readlane_b32 || instr->opcode == aco_opcode::v_writelane_b32)
+ return operand != 1;
+ return true;
+}
+
bool parse_base_offset(opt_ctx &ctx, Instruction* instr, unsigned op_index, Temp *base, uint32_t *offset)
{
Operand op = instr->operands[op_index];
@@ -579,7 +586,7 @@ void label_instruction(opt_ctx &ctx, aco_ptr<Instruction>& instr)
/* VALU: propagate neg, abs & inline constants */
else if (instr->isVALU()) {
- if (info.is_temp() && info.temp.type() == RegType::vgpr) {
+ if (info.is_temp() && info.temp.type() == RegType::vgpr && valu_can_accept_vgpr(instr, i)) {
instr->operands[i].setTemp(info.temp);
info = ctx.info[info.temp.id()];
}