forked from OSchip/llvm-project
[TargetLowering] fix formatting and comments for ShrinkDemandedConstant; NFC
llvm-svn: 294325
This commit is contained in:
parent
a3dace3619
commit
8c99ca3df0
|
@ -334,34 +334,35 @@ TargetLowering::isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const {
|
|||
// Optimization Methods
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// Check to see if the specified operand of the specified instruction is a
|
||||
/// constant integer. If so, check to see if there are any bits set in the
|
||||
/// constant that are not demanded. If so, shrink the constant and return true.
|
||||
bool TargetLowering::TargetLoweringOpt::ShrinkDemandedConstant(SDValue Op,
|
||||
const APInt &Demanded) {
|
||||
SDLoc dl(Op);
|
||||
/// If the specified instruction has a constant integer operand and there are
|
||||
/// bits set in that constant that are not demanded, then clear those bits and
|
||||
/// return true.
|
||||
bool TargetLowering::TargetLoweringOpt::ShrinkDemandedConstant(
|
||||
SDValue Op, const APInt &Demanded) {
|
||||
SDLoc DL(Op);
|
||||
unsigned Opcode = Op.getOpcode();
|
||||
|
||||
// FIXME: ISD::SELECT, ISD::SELECT_CC
|
||||
switch (Op.getOpcode()) {
|
||||
default: break;
|
||||
switch (Opcode) {
|
||||
default:
|
||||
break;
|
||||
case ISD::XOR:
|
||||
case ISD::AND:
|
||||
case ISD::OR: {
|
||||
ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op.getOperand(1));
|
||||
if (!C) return false;
|
||||
|
||||
if (Op.getOpcode() == ISD::XOR &&
|
||||
(C->getAPIntValue() | (~Demanded)).isAllOnesValue())
|
||||
auto *Op1C = dyn_cast<ConstantSDNode>(Op.getOperand(1));
|
||||
if (!Op1C)
|
||||
return false;
|
||||
|
||||
// if we can expand it to have all bits set, do it
|
||||
if (C->getAPIntValue().intersects(~Demanded)) {
|
||||
// If this is a 'not' op, don't touch it because that's a canonical form.
|
||||
const APInt &C = Op1C->getAPIntValue();
|
||||
if (Opcode == ISD::XOR && (C | ~Demanded).isAllOnesValue())
|
||||
return false;
|
||||
|
||||
if (C.intersects(~Demanded)) {
|
||||
EVT VT = Op.getValueType();
|
||||
SDValue New = DAG.getNode(Op.getOpcode(), dl, VT, Op.getOperand(0),
|
||||
DAG.getConstant(Demanded &
|
||||
C->getAPIntValue(),
|
||||
dl, VT));
|
||||
return CombineTo(Op, New);
|
||||
SDValue NewC = DAG.getConstant(Demanded & C, DL, VT);
|
||||
SDValue NewOp = DAG.getNode(Opcode, DL, VT, Op.getOperand(0), NewC);
|
||||
return CombineTo(Op, NewOp);
|
||||
}
|
||||
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue