From 47a4b39646a613805fd2580c044bea45c97df485 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Fri, 2 Dec 2016 02:26:02 +0000 Subject: [PATCH] ConstantFolding: Factor code into helper function llvm-svn: 288459 --- llvm/lib/Analysis/ConstantFolding.cpp | 57 +++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp index 500faed..04d36ffb 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(Element)) { + Result <<= BitShift; + continue; + } + + auto *ElementCI = dyn_cast_or_null(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(Element)) { - Result <<= BitShift; - continue; - } - - auto *ElementCI = dyn_cast_or_null(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); } -- 2.7.4