[PATCH] D77201: [CodeGen][SelectionDAG] Flip Booleans More Often
Pierre van Houtryve via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 2 00:30:14 PDT 2020
Pierre-vh added a comment.
In D77201#1955664 <https://reviews.llvm.org/D77201#1955664>, @efriedma wrote:
> We have to call getBooleanContents on the vector type, not the vector element type. On ARM, a boolean in a vector is ZeroOrNegativeOneBooleanContent. A scalar boolean on its own is ZeroOrOneBooleanContent. If you choose incorrectly, that's a potential miscompile. (Not sure why it isn't showing up as a regression test change for other targets; maybe the specific VSELECT pattern in question is rare after legalization.)
>
> Maybe the code should be truncating the APInt before it checks isAllOnesValue(), though. For a boolean, isOne() and isAllOnesValue() should be equivalent.
Thank you for this explanation. Is the kind of change you have in mind? (I tested it and it also works)
ConstantSDNode *Const = isConstOrConstSplat(V.getOperand(1),
/*AllowUndefs*/ false,
/*AllowTruncation*/ true);
if (!Const)
return SDValue();
EVT VT = V.getValueType();
bool IsFlip = false;
switch(TLI.getBooleanContents(VT)) {
case TargetLowering::ZeroOrOneBooleanContent:
IsFlip = Const->isOne();
break;
case TargetLowering::ZeroOrNegativeOneBooleanContent:
IsFlip = Const->getAPIntValue()
.sextOrTrunc(Const->getNumValues())
.isAllOnesValue();
break;
case TargetLowering::UndefinedBooleanContent:
IsFlip = (Const->getAPIntValue() & 0x01) == 1;
break;
}
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D77201/new/
https://reviews.llvm.org/D77201
More information about the llvm-commits
mailing list