aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/IR/Constants.cpp
diff options
context:
space:
mode:
authorSanjay Patel <spatel@rotateright.com>2019-03-14 19:22:08 +0000
committerSanjay Patel <spatel@rotateright.com>2019-03-14 19:22:08 +0000
commitde1d5d3675992a60c95b17d70ea817468883c485 (patch)
tree705e488bdb810e0a0cba00b3a36906e11285c1dd /llvm/lib/IR/Constants.cpp
parent6e86216531e2c53f171aaf8b911327ab616c6c0d (diff)
downloadllvm-de1d5d3675992a60c95b17d70ea817468883c485.zip
llvm-de1d5d3675992a60c95b17d70ea817468883c485.tar.gz
llvm-de1d5d3675992a60c95b17d70ea817468883c485.tar.bz2
[InstCombine] canonicalize funnel shift constant shift amount to be modulo bitwidth
The shift argument is defined to be modulo the bitwidth, so if that argument is a constant, we can always reduce the constant to its minimal form to allow better CSE and other follow-on transforms. We need to be careful to ignore constant expressions here, or we will likely infinite loop. I'm adding a general vector constant query for that case. Differential Revision: https://reviews.llvm.org/D59374 llvm-svn: 356192
Diffstat (limited to 'llvm/lib/IR/Constants.cpp')
-rw-r--r--llvm/lib/IR/Constants.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/IR/Constants.cpp b/llvm/lib/IR/Constants.cpp
index 00d6cc7..a161992 100644
--- a/llvm/lib/IR/Constants.cpp
+++ b/llvm/lib/IR/Constants.cpp
@@ -260,6 +260,16 @@ bool Constant::containsUndefElement() const {
return false;
}
+bool Constant::containsConstantExpression() const {
+ if (!getType()->isVectorTy())
+ return false;
+ for (unsigned i = 0, e = getType()->getVectorNumElements(); i != e; ++i)
+ if (isa<ConstantExpr>(getAggregateElement(i)))
+ return true;
+
+ return false;
+}
+
/// Constructor to create a '0' constant of arbitrary type.
Constant *Constant::getNullValue(Type *Ty) {
switch (Ty->getTypeID()) {