forked from OSchip/llvm-project
[DAGCombine] Pull out repeated demanded bitmask generation. NFCI.
llvm-svn: 355932
This commit is contained in:
parent
02e88490c1
commit
9f0a5ca843
|
@ -15420,23 +15420,22 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
|||
Value.getValueType().isInteger() &&
|
||||
(!isa<ConstantSDNode>(Value) ||
|
||||
!cast<ConstantSDNode>(Value)->isOpaque())) {
|
||||
APInt TruncDemandedBits =
|
||||
APInt::getLowBitsSet(Value.getScalarValueSizeInBits(),
|
||||
ST->getMemoryVT().getScalarSizeInBits());
|
||||
|
||||
// See if we can simplify the input to this truncstore with knowledge that
|
||||
// only the low bits are being used. For example:
|
||||
// "truncstore (or (shl x, 8), y), i8" -> "truncstore y, i8"
|
||||
SDValue Shorter = DAG.GetDemandedBits(
|
||||
Value, APInt::getLowBitsSet(Value.getScalarValueSizeInBits(),
|
||||
ST->getMemoryVT().getScalarSizeInBits()));
|
||||
SDValue Shorter = DAG.GetDemandedBits(Value, TruncDemandedBits);
|
||||
AddToWorklist(Value.getNode());
|
||||
if (Shorter.getNode())
|
||||
return DAG.getTruncStore(Chain, SDLoc(N), Shorter,
|
||||
Ptr, ST->getMemoryVT(), ST->getMemOperand());
|
||||
if (Shorter)
|
||||
return DAG.getTruncStore(Chain, SDLoc(N), Shorter, Ptr, ST->getMemoryVT(),
|
||||
ST->getMemOperand());
|
||||
|
||||
// Otherwise, see if we can simplify the operation with
|
||||
// SimplifyDemandedBits, which only works if the value has a single use.
|
||||
if (SimplifyDemandedBits(
|
||||
Value,
|
||||
APInt::getLowBitsSet(Value.getScalarValueSizeInBits(),
|
||||
ST->getMemoryVT().getScalarSizeInBits()))) {
|
||||
if (SimplifyDemandedBits(Value, TruncDemandedBits)) {
|
||||
// Re-visit the store if anything changed and the store hasn't been merged
|
||||
// with another node (N is deleted) SimplifyDemandedBits will add Value's
|
||||
// node back to the worklist if necessary, but we also need to re-visit
|
||||
|
|
Loading…
Reference in New Issue