[llvm] [NVPTX] Teach NVPTX about predicates (PR #67468)
Fraser Cormack via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 29 03:03:07 PDT 2024
================
@@ -3498,33 +3498,44 @@ defm : CVT_ROUND<frint, CvtRNI, CvtRNI_FTZ>;
// Control-flow
//-----------------------------------
-let isTerminator=1 in {
- let isReturn=1, isBarrier=1 in
- def Return : NVPTXInst<(outs), (ins), "ret;", [(retglue)]>;
-
- let isBranch=1 in
- def CBranch : NVPTXInst<(outs), (ins Int1Regs:$a, brtarget:$target),
- "@$a bra \t$target;",
- [(brcond Int1Regs:$a, bb:$target)]>;
- let isBranch=1 in
- def CBranchOther : NVPTXInst<(outs), (ins Int1Regs:$a, brtarget:$target),
- "@!$a bra \t$target;", []>;
-
- let isBranch=1, isBarrier=1 in
- def GOTO : NVPTXInst<(outs), (ins brtarget:$target),
- "bra.uni \t$target;", [(br bb:$target)]>;
+// As with the uniform call instructions, uniform branches and returns are
+// modelled as distinct instructions
+let isTerminator = 1 in {
+ let isBranch = 1 in {
+ def Bra : NVPTXInst<(outs), (ins brtarget:$target), "bra \t$target;", []>;
+ def BraUni : NVPTXInst<(outs), (ins brtarget:$target), "bra.uni \t$target;", []>;
+ // LLVM won't let us model conditional and unconditional branches with a
+ // single instruction, but PTX has only one "true" branch instruction.
+ // For codegen purposes, and to placate the verifier, we model a separate
+ // "unconditional" branch with a pseudo.
+ let isBarrier = 1 in
+ def Jump : NVPTXPseudo<(outs), (ins brtarget:$target), "bra.uni \t$target",
----------------
frasercrmck wrote:
This might be better as an actual expansion to `BraUni` (e.g., `PseudoInstExpansion`), as opposed to a pseudo that prints the same way as `BraUni`
https://github.com/llvm/llvm-project/pull/67468
More information about the llvm-commits
mailing list