diff options
author | Sanjay Patel <spatel@rotateright.com> | 2019-03-14 19:22:08 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2019-03-14 19:22:08 +0000 |
commit | de1d5d3675992a60c95b17d70ea817468883c485 (patch) | |
tree | 705e488bdb810e0a0cba00b3a36906e11285c1dd /llvm/lib/IR/Constants.cpp | |
parent | 6e86216531e2c53f171aaf8b911327ab616c6c0d (diff) | |
download | llvm-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.cpp | 10 |
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()) { |