[llvm] AMDGPU: Avoid instantiating PatFrag with null_frag (PR #77271)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 7 21:14:32 PST 2024
https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/77271
This makes it possible to pass null_frag to the MAIInst multiclass.
null_frag does not work as you may hope if used as the input to a PatFrag, which is what happens when it's passed through to *MAIFrag. Avoid this by checking for null_frag. It might be possible to hack up tablegen to allow consuming PatFrag inputs.
>From 6bfb80835b8e2a7d34b394cfe66a91bdb2b421e0 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Mon, 8 Jan 2024 11:55:45 +0700
Subject: [PATCH] AMDGPU: Avoid instantiating PatFrag with null_frag
This makes it possible to pass null_frag to the MAIInst
multiclass.
null_frag does not work as you may hope if used as the input
to a PatFrag, which is what happens when it's passed through to
*MAIFrag. Avoid this by checking for null_frag. It might be
possible to hack up tablegen to allow consuming PatFrag inputs.
---
llvm/lib/Target/AMDGPU/VOP3PInstructions.td | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/llvm/lib/Target/AMDGPU/VOP3PInstructions.td b/llvm/lib/Target/AMDGPU/VOP3PInstructions.td
index 985b77be1d881e..e9d6f67aee1644 100644
--- a/llvm/lib/Target/AMDGPU/VOP3PInstructions.td
+++ b/llvm/lib/Target/AMDGPU/VOP3PInstructions.td
@@ -623,12 +623,12 @@ multiclass MAIInst<string OpName, string P, SDPatternOperator node,
// FP32 denorm mode is respected, rounding mode is not. Exceptions are not supported.
let Constraints = !if(NoDstOverlap, "@earlyclobber $vdst", "") in {
def _e64 : MAIInst<OpName, !cast<VOPProfileMAI>("VOPProfileMAI_" # P),
- !if(NoDstOverlap, null_frag, AgprMAIFrag<node>)>,
+ !if(!or(NoDstOverlap, !eq(node, null_frag)), null_frag, AgprMAIFrag<node>)>,
MFMATable<0, NAME # "_e64">;
let SubtargetPredicate = isGFX90APlus, Mnemonic = OpName in
def _vgprcd_e64 : MAIInst<OpName # "_vgprcd", !cast<VOPProfileMAI>("VOPProfileMAI_" # P # "_VCD"),
- !if(NoDstOverlap, null_frag, VgprMAIFrag<node>)>,
+ !if(!or(NoDstOverlap, !eq(node, null_frag)), null_frag, VgprMAIFrag<node>)>,
MFMATable<0, NAME # "_vgprcd_e64">;
}
@@ -636,12 +636,13 @@ multiclass MAIInst<string OpName, string P, SDPatternOperator node,
let Constraints = !if(NoDstOverlap, "$vdst = $src2", ""),
isConvertibleToThreeAddress = NoDstOverlap,
Mnemonic = OpName in {
- def "_mac_e64" : MAIInst<OpName # "_mac", !cast<VOPProfileMAI>("VOPProfileMAI_" # P), AgprMAIFrag<node>>,
+ def "_mac_e64" : MAIInst<OpName # "_mac", !cast<VOPProfileMAI>("VOPProfileMAI_" # P),
+ !if(!eq(node, null_frag), null_frag, AgprMAIFrag<node>)>,
MFMATable<1, NAME # "_e64">;
let SubtargetPredicate = isGFX90APlus in
def _mac_vgprcd_e64 : MAIInst<OpName # "_mac_vgprcd", !cast<VOPProfileMAI>("VOPProfileMAI_" # P # "_VCD"),
- VgprMAIFrag<node>>,
+ !if(!eq(node, null_frag), null_frag, VgprMAIFrag<node>)>,
MFMATable<1, NAME # "_vgprcd_e64">;
}
}
More information about the llvm-commits
mailing list