[LLVMdev] predicates vs. requirements [TableGen, X86InstrInfo.td]
Sanjay Patel
spatel at rotateright.com
Thu Sep 18 14:25:07 PDT 2014
I tried to add an 'OptForSize' requirement to a pattern in X86InstrSSE.td,
but it appears to be ignored. However, the condition was detected when
specified as a predicate.
So this doesn't work:
def : Pat<(v2f64 (X86VBroadcast (loadf64 addr:$src))), (VMOVDDUPrm addr:
$src)>,
*Requires<[OptForSize**]>*;
But this does:
* let Predicates = [OptForSize] in* {
def : Pat<(v2f64 (X86VBroadcast (loadf64 addr:$src))), (VMOVDDUPrm addr
:$src)>;
}
I see both forms used on some patterns like this:
* let Predicates = [HasAVX] *in {
def : Pat<(X86Movddup (loadv2f64 addr:$src)),
(VMOVDDUPrm addr:$src)>, *Requires<[HasAVX]>*;
}
Is a predicate different than a requirement or is this a bug?
There are existing patterns that specify 'OptForSize' with "Requires", but
they are not behaving as I expected.
Example:
// For scalar unary operations, fold a load into the operation
// only in OptForSize mode. It eliminates an instruction, but it also
// eliminates a whole-register clobber (the load), so it introduces a
// partial register update condition.
def : Pat<(f32 (fsqrt (load addr:$src))),
(VSQRTSSm (f32 (IMPLICIT_DEF)), addr:$src)>,
Requires<[HasAVX, OptForSize]>;
This is generated:
vsqrtss (%rdi), %xmm0, %xmm0
regardless of whether I specify -Os or -O1 with clang.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140918/3a04abe2/attachment.html>
More information about the llvm-dev
mailing list