nv50/ir: fix Instruction::isActionEqual for PHI instructions
authorKarol Herbst <kherbst@redhat.com>
Thu, 28 Jun 2018 16:55:00 +0000 (18:55 +0200)
committerKarol Herbst <kherbst@redhat.com>
Sat, 7 Jul 2018 18:32:33 +0000 (20:32 +0200)
commitde139787332eb83381d7b5ed794d834f44f2ac45
tree3476ea065dcd78b1266082206697fa7254d4fd60
parentf2cc694d8ee067467c946999138637b00a7a6158
nv50/ir: fix Instruction::isActionEqual for PHI instructions

phi instructions don't have the same results by simply having the same sources.
They need to be inside the same BasicBlock or share an equal condition
resulting into a path through the shader selecting equal sources as well.

short example:

cond = ...;
const0 = 0;
const1 = 1;

if (cond) {
  ssa_1 = const0;
} else {
  ssa_2 = const1;
}
ssa_3 = phi ssa_1 ssa_2;

if (!cond) {
  ssa_4 = const0;
} else {
  ssa_5 = const1;
}
ssa_6 = phi ssa_4 ssa_5;

allthough both phis actually have sources with equal results, merging them
would be wrong due to having a different condition selecting which source to
take.

For now we also stick an assert into GlobalCSE, because it should never end up
having to merge phi instructions.

Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp