[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