Ryan Taylor via llvm-dev
2018-Jun-07 17:45 UTC
[llvm-dev] Matching ConstantFPSDNode tablegen
I'm trying to match a ConstantFPSDNode == 0 in dag pattern for tablegen but
am having some issues.
So LLVM doesn't seem to accept a floating point constant literal match like:
%v = call <4 x float> @foo(i32 15, float %s, float 0.0, <8 x i32>
%rsrc, <4
x i32> %samp, i1 0, i32 0, i32 0)
ret <4 x float> %v
def : XXXPat<(v4f32 (int_foo i32:$mask, f32:$s, 0, v8i32:$rsrc,
v4i32:$sampler, i1:$unorm, 0, i32:$cachepolicy)), (FOO_MI (COPY_TO_REGCLASS
?:$s, 32RegClass), ?:$rsrc, ?:$sampler, (as_i32imm ?:$mask), (as_i1imm
?:$unorm), (as_i1imm ?:$cachepolicy), (as_i1imm ?:$cachepolicy), 0, 0, 0, {
0 })>;
which would be ideal. This seems to be because OPC_CheckInteger only checks
for ConstantSDNode and not ConstantFPSDNode. So it was suggested to use
ComplexPattern, so given:
bool XXXDAGToDAGISel::SelectConstantFPSDNodeImmZero(SDValue In, SDValue
&Src) const {
if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(In))
return C->isZero();
return false;
}
def ConstantFPSDNodeImmZero : ComplexPattern<f32, 0,
"SelectConstantFPSDNodeImmZero">;
def : XXXPat<(v4f32 (int_foo i32:$dmask, f32:$s, (f32
(ConstantFPSDNodeImmZero f32:$lod)), v8i32:$rsrc, v4i32:$sampler,
i1:$unorm, 0, i32:$cachepolicy)), (FOO_MI (COPY_TO_REGCLASS ?:$s,
32RegClass), ?:$rsrc, ?:$sampler, (as_i32imm ?:$dmask), (as_i1imm
?:$unorm), (as_i1imm ?:$cachepolicy), (as_i1imm ?:$cachepolicy), 0, 0, 0, {
0 })>;
The problem here is that lod is that 'pattern has dead named input lod'.
I
removed the 'lod' but then I get:
error: no matching function for call to
‘{anonymous}::XXXDAGToDAGISel::SelectConstantFPSDNodeImmZero(llvm::SDValue&)’
return SelectConstantFPSDNodeImmZero(N);
which makes sense, the Select function needs an input to check, which I
believe I was calling 'lod' and sending as the input param. It seems
like
LLVM doesn't llke a variable used in the pattern to match that isn't
then
also used in the output MI, which sort of seems quite limiting honestly but
I suppose this wouldn't be seen if 'lod' was an int and not a float.
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20180607/d9c757c7/attachment.html>
Friedman, Eli via llvm-dev
2018-Jun-07 18:17 UTC
[llvm-dev] Matching ConstantFPSDNode tablegen
On 6/7/2018 10:45 AM, Ryan Taylor via llvm-dev wrote:> I'm trying to match a ConstantFPSDNode == 0 in dag pattern for > tablegen but am having some issues. > > So LLVM doesn't seem to accept a floating point constant literal match > like: > > %v = call <4 x float> @foo(i32 15, float %s, float 0.0, <8 x i32> > %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0) > ret <4 x float> %v > > def : XXXPat<(v4f32 (int_foo i32:$mask, f32:$s, 0, v8i32:$rsrc, > v4i32:$sampler, i1:$unorm, 0, i32:$cachepolicy)), (FOO_MI > (COPY_TO_REGCLASS ?:$s, 32RegClass), ?:$rsrc, ?:$sampler, (as_i32imm > ?:$mask), (as_i1imm ?:$unorm), (as_i1imm ?:$cachepolicy), (as_i1imm > ?:$cachepolicy), 0, 0, 0, { 0 })>; > > which would be ideal. This seems to be because OPC_CheckInteger only > checks for ConstantSDNode and not ConstantFPSDNode. So it was > suggested to use ComplexPattern, so given: > > bool XXXDAGToDAGISel::SelectConstantFPSDNodeImmZero(SDValue In, > SDValue &Src) const { > if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(In)) > return C->isZero(); > return false; > } > > def ConstantFPSDNodeImmZero : ComplexPattern<f32, 0, > "SelectConstantFPSDNodeImmZero">; > > def : XXXPat<(v4f32 (int_foo i32:$dmask, f32:$s, (f32 > (ConstantFPSDNodeImmZero f32:$lod)), v8i32:$rsrc, v4i32:$sampler, > i1:$unorm, 0, i32:$cachepolicy)), (FOO_MI (COPY_TO_REGCLASS ?:$s, > 32RegClass), ?:$rsrc, ?:$sampler, (as_i32imm ?:$dmask), (as_i1imm > ?:$unorm), (as_i1imm ?:$cachepolicy), (as_i1imm ?:$cachepolicy), 0, 0, > 0, { 0 })>;This isn't right; an floating-point immediate doesn't have any inputs. A bunch of backends have a pattern like this; grep for fpimm0. -Eli -- Employee of Qualcomm Innovation Center, Inc. Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
Ryan Taylor via llvm-dev
2018-Jun-07 18:34 UTC
[llvm-dev] Matching ConstantFPSDNode tablegen
Eli, Ok, thanks, this makes more sense. On Thu, Jun 7, 2018 at 2:17 PM, Friedman, Eli <efriedma at codeaurora.org> wrote:> On 6/7/2018 10:45 AM, Ryan Taylor via llvm-dev wrote: > >> I'm trying to match a ConstantFPSDNode == 0 in dag pattern for tablegen >> but am having some issues. >> >> So LLVM doesn't seem to accept a floating point constant literal match >> like: >> >> %v = call <4 x float> @foo(i32 15, float %s, float 0.0, <8 x i32> %rsrc, >> <4 x i32> %samp, i1 0, i32 0, i32 0) >> ret <4 x float> %v >> >> def : XXXPat<(v4f32 (int_foo i32:$mask, f32:$s, 0, v8i32:$rsrc, >> v4i32:$sampler, i1:$unorm, 0, i32:$cachepolicy)), (FOO_MI (COPY_TO_REGCLASS >> ?:$s, 32RegClass), ?:$rsrc, ?:$sampler, (as_i32imm ?:$mask), (as_i1imm >> ?:$unorm), (as_i1imm ?:$cachepolicy), (as_i1imm ?:$cachepolicy), 0, 0, 0, { >> 0 })>; >> >> which would be ideal. This seems to be because OPC_CheckInteger only >> checks for ConstantSDNode and not ConstantFPSDNode. So it was suggested to >> use ComplexPattern, so given: >> >> bool XXXDAGToDAGISel::SelectConstantFPSDNodeImmZero(SDValue In, SDValue >> &Src) const { >> if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(In)) >> return C->isZero(); >> return false; >> } >> >> def ConstantFPSDNodeImmZero : ComplexPattern<f32, 0, >> "SelectConstantFPSDNodeImmZero">; >> >> def : XXXPat<(v4f32 (int_foo i32:$dmask, f32:$s, (f32 >> (ConstantFPSDNodeImmZero f32:$lod)), v8i32:$rsrc, v4i32:$sampler, >> i1:$unorm, 0, i32:$cachepolicy)), (FOO_MI (COPY_TO_REGCLASS ?:$s, >> 32RegClass), ?:$rsrc, ?:$sampler, (as_i32imm ?:$dmask), (as_i1imm >> ?:$unorm), (as_i1imm ?:$cachepolicy), (as_i1imm ?:$cachepolicy), 0, 0, 0, { >> 0 })>; >> > > This isn't right; an floating-point immediate doesn't have any inputs. > > A bunch of backends have a pattern like this; grep for fpimm0. > > -Eli > > -- > Employee of Qualcomm Innovation Center, Inc. > Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux > Foundation Collaborative Project > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180607/97b5699b/attachment.html>