The previous patch https://reviews.llvm.org/D23313 does not cover AVX-512F, KNL set.
FNEG(x) operation is lowered to (bitcast (vpxor (bitcast x), (bitcast constfp(0x80000000))).
It happens because FP XOR is not supported for 512-bit data types on KNL and we use integer XOR instead.
I added pattern match for integer XOR.
Details
Diff Detail
- Repository
- rL LLVM
Event Timeline
| ../lib/Target/X86/X86ISelLowering.cpp | ||
|---|---|---|
| 30304 | has -> have | |
| 30359–30361 | Can this be an assert? | |
| 30384–30393 | This would be clearer/smaller if we switched just the opcode selection and sank the common 'getBitcast(getNode())' after the switch: auto NewOpcode;
switch (Arg.getOpcode()) {
case X86ISD::FMADD: NewOpcode = X86ISD::FNMSUB; break;
case X86ISD::FMSUB: NewOpcode = X86ISD::FNMADD; break;
...
}
return DAG.getBitcast(OrigVT, DAG.getNode(NewOpcode, DL, VT, Arg.getNode()->ops());If you do that refactoring on the original code as an NFC patch, I think it will make the diff on this part of this patch just one line of code. | |
| ../lib/Target/X86/X86ISelLowering.cpp | ||
|---|---|---|
| 30307 | This interface feels awkward. The normal pattern is: Ie, if there's no negated value, it will return the empty SDValue(), and the caller can use that as a bool value if it wants to. | |
| 30359–30361 | This question was missed? | |
| ../lib/Target/X86/X86ISelLowering.cpp | ||
|---|---|---|
| 30307 | Thanks! I was looking for a proper interface. You suggestion is better than all APIs that I tried till now. I still think that my first solution with late FNEG lowering was simpler. We handle too many different patterns for XOR/FXOR. | |
| 30359–30361 | It will fail on compilation in release mode: | |
LGTM - see inline comments for some nits.
| ../lib/Target/X86/X86ISelLowering.cpp | ||
|---|---|---|
| 30303 | Fp -> FP | |
| 30307 | static? | |
| 30877 | formatting: SDValue &V | |
| 30878–30879 | combine to one line? if (SDValue Negval = isFNEG...) | |
Fp -> FP