================ @@ -2776,19 +2776,35 @@ bool SPIRVInstructionSelector::selectIntrinsic(Register ResVReg, } return MIB.constrainAllUses(TII, TRI, RBI); } - case Intrinsic::spv_loop_merge: - case Intrinsic::spv_selection_merge: { - const auto Opcode = IID == Intrinsic::spv_selection_merge - ? SPIRV::OpSelectionMerge - : SPIRV::OpLoopMerge; - auto MIB = BuildMI(BB, I, I.getDebugLoc(), TII.get(Opcode)); + case Intrinsic::spv_loop_merge: { + auto MIB = BuildMI(BB, I, I.getDebugLoc(), TII.get(SPIRV::OpLoopMerge)); for (unsigned i = 1; i < I.getNumExplicitOperands(); ++i) { assert(I.getOperand(i).isMBB()); MIB.addMBB(I.getOperand(i).getMBB()); } MIB.addImm(SPIRV::SelectionControl::None); return MIB.constrainAllUses(TII, TRI, RBI); } + case Intrinsic::spv_selection_merge: { + + int64_t SelectionControl = SPIRV::SelectionControl::None; + auto LastOp = I.getOperand(I.getNumOperands() - 1); + + auto BranchHint = LastOp.getImm(); + if (BranchHint == 2) + SelectionControl = SPIRV::SelectionControl::Flatten; + else if (BranchHint == 1) + SelectionControl = SPIRV::SelectionControl::DontFlatten; + + auto MIB = + BuildMI(BB, I, I.getDebugLoc(), TII.get(SPIRV::OpSelectionMerge)); + for (unsigned i = 1; i < I.getNumExplicitOperands() - 1; ++i) { + assert(I.getOperand(i).isMBB()); + MIB.addMBB(I.getOperand(i).getMBB()); + } + MIB.addImm(SelectionControl); + return MIB.constrainAllUses(TII, TRI, RBI); + } ---------------- Keenuts wrote:
Why do you need to loop through the operands given the instruction is not variadic? (Sadly the Flatten/DontFlatten immediate values don't match the FE values so cannot static cast into the enum :/ ) ```suggestion namespace { SPIRV::SelectionControl GetSelectionOperandForImm(int Imm) { if (Imm == 2) return SPIRV::SelectionControl::Flatten; if (Imm == 1) return SPIRV::SelectionControl::DontFlatten; if (Imm == 0) return SPIRV::SelectionControl::None; llvm::unreachable("Invalid immediate") } [...] case Intrinsic::spv_selection_merge: { auto MIB = BuildMI(BB, I, I.getDebugLoc(), TII.get(SPIRV::OpSelectionMerge)); assert(I.getOperand(1).isMBB()); MIB.addMBB(I.getOperand(1).getMBB()); MIB.addImm(GetSelectionOperandForImmediate(I.getOperand(2).getImm()); return MIB.constrainAllUses(TII, TRI, RBI); } ``` https://github.com/llvm/llvm-project/pull/116331 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits