[llvm-dev] Change operand type in tablegen pattern

Сергей Киреев via llvm-dev llvm-dev at lists.llvm.org
Fri Nov 20 03:51:40 PST 2015


Hello,
i need ability to change type of instruction operand, changed by
ComplexPattern in pattern match.

i have pattern, which match operation (fdiv (f32 (sint_to_fp Rg32:$s)),
(f32 immfpow2:$p)) and replace it with one instruction. In case, if second
fdiv operand is power of 2 - this operation convert fixed point value to
float point value.

My .td contains:

def SITOFPF : Instruction
{
   ...
   let InOperandList =(ins Rg32:$rs, Rg32:$p);
   letOutOperandList = (outs R32:$rd);
   ...
}

where Rg32 is RegClass to i32 and f32 values.

def immfpow2 : ComplexPattern<f32, 1, "SelectImmFPow2">;

bool ...::SelectImmFPow2(SDValue N, SDValue& C)
{
    auto fpc = cast<ConstantFPSDNode>(N);
    auto p =
log2(fpc->getConstantFPValue()->getValueAPF().convertToFloat());

    if (remainderf(p, 1) != 0)
        return false;

    C = CurDAG->getTargetConstant(p, SDLoc(N), MVT::i8);

    return true;
}

def : Pat<(fdiv (f32 (sint_to_fp Rg32:$s)), (f32 immfpow2:$p)), (SITOFPF
$s, $p)>;

I need to second operand of SITOFPF have type i8. If i changed input
operand definition to (ins Rg32:$rs, Operand<i8>:$p),  tablegen says 'Type
inference contradiction found, merging 'f32' into 'i8''.

Can i specify, in some way, tablegen consider $p in fragment '(SITOFPF $s,
$p)'  has type i8, not f32, because it will be so if the ComplexPattern
matched?

Thanks.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20151120/c2de65f5/attachment.html>


More information about the llvm-dev mailing list