aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib
diff options
context:
space:
mode:
authorXiang1 Zhang <xiang1.zhang@intel.com>2022-06-30 19:07:25 +0800
committerXiang1 Zhang <xiang1.zhang@intel.com>2022-07-01 08:58:00 +0800
commit5fe5aa284efed1ee1492e1f266351b35f0a8bb69 (patch)
tree9127ff30cd1b550821aa903b12f81d149372197c /llvm/lib
parent4be3fc35aa8b27494968e9a52eb0afa0672d98e7 (diff)
downloadllvm-5fe5aa284efed1ee1492e1f266351b35f0a8bb69.zip
llvm-5fe5aa284efed1ee1492e1f266351b35f0a8bb69.tar.gz
llvm-5fe5aa284efed1ee1492e1f266351b35f0a8bb69.tar.bz2
[ISel] Match all bits when merge undef(s) for DAG combine
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp11
-rw-r--r--llvm/lib/Support/APInt.cpp16
2 files changed, 21 insertions, 6 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index bc1011b..b3b8756 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -2712,7 +2712,16 @@ bool SelectionDAG::isSplatValue(SDValue V, const APInt &DemandedElts,
SubDemandedElts &= ScaledDemandedElts;
if (!isSplatValue(Src, SubDemandedElts, SubUndefElts, Depth + 1))
return false;
- UndefElts |= APIntOps::ScaleBitMask(SubUndefElts, NumElts);
+
+ // Here we can't do "MatchAnyBits" operation merge for undef bits.
+ // Because some operation only use part value of the source.
+ // Take llvm.fshl.* for example:
+ // t1: v4i32 = Constant:i32<12>, undef:i32, Constant:i32<12>, undef:i32
+ // t2: v2i64 = bitcast t1
+ // t5: v2i64 = fshl t3, t4, t2
+ // We can not convert t2 to {i64 undef, i64 undef}
+ UndefElts |= APIntOps::ScaleBitMask(SubUndefElts, NumElts,
+ /*MatchAllBits=*/true);
}
return true;
}
diff --git a/llvm/lib/Support/APInt.cpp b/llvm/lib/Support/APInt.cpp
index acc68fe..f74178b 100644
--- a/llvm/lib/Support/APInt.cpp
+++ b/llvm/lib/Support/APInt.cpp
@@ -2968,7 +2968,8 @@ llvm::APIntOps::GetMostSignificantDifferentBit(const APInt &A, const APInt &B) {
return A.getBitWidth() - ((A ^ B).countLeadingZeros() + 1);
}
-APInt llvm::APIntOps::ScaleBitMask(const APInt &A, unsigned NewBitWidth) {
+APInt llvm::APIntOps::ScaleBitMask(const APInt &A, unsigned NewBitWidth,
+ bool MatchAllBits) {
unsigned OldBitWidth = A.getBitWidth();
assert((((OldBitWidth % NewBitWidth) == 0) ||
((NewBitWidth % OldBitWidth) == 0)) &&
@@ -2992,11 +2993,16 @@ APInt llvm::APIntOps::ScaleBitMask(const APInt &A, unsigned NewBitWidth) {
if (A[i])
NewA.setBits(i * Scale, (i + 1) * Scale);
} else {
- // Merge bits - if any old bit is set, then set scale equivalent new bit.
unsigned Scale = OldBitWidth / NewBitWidth;
- for (unsigned i = 0; i != NewBitWidth; ++i)
- if (!A.extractBits(Scale, i * Scale).isZero())
- NewA.setBit(i);
+ for (unsigned i = 0; i != NewBitWidth; ++i) {
+ if (MatchAllBits) {
+ if (A.extractBits(Scale, i * Scale).isAllOnes())
+ NewA.setBit(i);
+ } else {
+ if (!A.extractBits(Scale, i * Scale).isZero())
+ NewA.setBit(i);
+ }
+ }
}
return NewA;