<div dir="ltr">I'm trying to match a ConstantFPSDNode == 0 in dag pattern for tablegen but am having some issues.<div><div><br></div><div>So LLVM doesn't seem to accept a floating point constant literal match like:</div><div><br></div><div><div>%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)</div><div>  ret <4 x float> %v</div></div><div><br></div><div>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 })>;</div><div><br></div><div>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:</div><div><br></div><div>bool XXXDAGToDAGISel::SelectConstantFPSDNodeImmZero(SDValue In, SDValue &Src) const {</div><div>  if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(In))</div><div>    return C->isZero();</div><div>  return false;</div><div>}</div><div><br></div><div>def ConstantFPSDNodeImmZero : ComplexPattern<f32, 0, "SelectConstantFPSDNodeImmZero">;</div><div><br></div><div>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 })>;</div><div><br></div><div><br></div><div>The problem here is that lod is that 'pattern has dead named input lod'. I removed the 'lod' but then I get:</div><div><br></div><div>error: no matching function for call to ‘{anonymous}::XXXDAGToDAGISel::SelectConstantFPSDNodeImmZero(llvm::SDValue&)’</div><div>   return SelectConstantFPSDNodeImmZero(N);</div><div><br></div><div>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.</div><div><br></div><div><br></div></div></div>