diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-12-02 02:26:02 +0000 |
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-12-02 02:26:02 +0000 |
| commit | 47a4b39646a613805fd2580c044bea45c97df485 (patch) | |
| tree | 0534df085efee615233ba49e4138ab7d6c4d3dbd | |
| parent | ab85225be49b2abf5112823d84525e91d469d6bd (diff) | |
| download | bcm5719-llvm-47a4b39646a613805fd2580c044bea45c97df485.tar.gz bcm5719-llvm-47a4b39646a613805fd2580c044bea45c97df485.zip | |
ConstantFolding: Factor code into helper function
llvm-svn: 288459
| -rw-r--r-- | llvm/lib/Analysis/ConstantFolding.cpp | 57 |
1 files changed, 34 insertions, 23 deletions
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp index 500faed39b1..04d36ffbb7e 100644 --- a/llvm/lib/Analysis/ConstantFolding.cpp +++ b/llvm/lib/Analysis/ConstantFolding.cpp @@ -58,7 +58,37 @@ namespace { // Constant Folding internal helper functions //===----------------------------------------------------------------------===// -/// Constant fold bitcast, symbolically evaluating it with DataLayout. +static Constant *foldConstVectorToAPInt(APInt &Result, Type *DestTy, + Constant *C, Type *SrcEltTy, + unsigned NumSrcElts, + const DataLayout &DL) { + // Now that we know that the input value is a vector of integers, just shift + // and insert them into our result. + unsigned BitShift = DL.getTypeSizeInBits(SrcEltTy); + for (unsigned i = 0; i != NumSrcElts; ++i) { + Constant *Element; + if (DL.isLittleEndian()) + Element = C->getAggregateElement(NumSrcElts - i - 1); + else + Element = C->getAggregateElement(i); + + if (Element && isa<UndefValue>(Element)) { + Result <<= BitShift; + continue; + } + + auto *ElementCI = dyn_cast_or_null<ConstantInt>(Element); + if (!ElementCI) + return ConstantExpr::getBitCast(C, DestTy); + + Result <<= BitShift; + Result |= ElementCI->getValue().zextOrSelf(Result.getBitWidth()); + } + + return nullptr; +} + +// Constant fold bitcast, symbolically evaluating it with DataLayout. /// This always returns a non-null constant, but it may be a /// ConstantExpr if unfoldable. Constant *FoldBitCast(Constant *C, Type *DestTy, const DataLayout &DL) { @@ -88,29 +118,10 @@ Constant *FoldBitCast(Constant *C, Type *DestTy, const DataLayout &DL) { C = ConstantExpr::getBitCast(C, SrcIVTy); } - // Now that we know that the input value is a vector of integers, just shift - // and insert them into our result. - unsigned BitShift = DL.getTypeSizeInBits(SrcEltTy); APInt Result(IT->getBitWidth(), 0); - for (unsigned i = 0; i != NumSrcElts; ++i) { - Constant *Element; - if (DL.isLittleEndian()) - Element = C->getAggregateElement(NumSrcElts-i-1); - else - Element = C->getAggregateElement(i); - - if (Element && isa<UndefValue>(Element)) { - Result <<= BitShift; - continue; - } - - auto *ElementCI = dyn_cast_or_null<ConstantInt>(Element); - if (!ElementCI) - return ConstantExpr::getBitCast(C, DestTy); - - Result <<= BitShift; - Result |= ElementCI->getValue().zextOrSelf(IT->getBitWidth()); - } + if (Constant *CE = foldConstVectorToAPInt(Result, DestTy, C, + SrcEltTy, NumSrcElts, DL)) + return CE; return ConstantInt::get(IT, Result); } |

