mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-10 10:01:42 +00:00
ConstantFolding: Factor code into helper function
llvm-svn: 288459
This commit is contained in:
parent
ab85225be4
commit
47a4b39646
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user