mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-25 00:24:26 +00:00
Revert 80959. It isn't sufficient to solve the full problem. And it
introduced regressions in the Ocaml bindings tests. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@80969 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -470,6 +470,7 @@ LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal);
|
|||||||
LLVMValueRef LLVMConstFNeg(LLVMValueRef ConstantVal);
|
LLVMValueRef LLVMConstFNeg(LLVMValueRef ConstantVal);
|
||||||
LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal);
|
LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal);
|
||||||
LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
||||||
|
LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
||||||
LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
||||||
LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
||||||
LLVMValueRef LLVMConstFSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
LLVMValueRef LLVMConstFSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
||||||
@ -477,6 +478,7 @@ LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
|||||||
LLVMValueRef LLVMConstFMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
LLVMValueRef LLVMConstFMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
||||||
LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
||||||
LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
||||||
|
LLVMValueRef LLVMConstExactSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
||||||
LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
||||||
LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
||||||
LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
||||||
@ -493,6 +495,9 @@ LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
|||||||
LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
|
||||||
LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
|
LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
|
||||||
LLVMValueRef *ConstantIndices, unsigned NumIndices);
|
LLVMValueRef *ConstantIndices, unsigned NumIndices);
|
||||||
|
LLVMValueRef LLVMConstInBoundsGEP(LLVMValueRef ConstantVal,
|
||||||
|
LLVMValueRef *ConstantIndices,
|
||||||
|
unsigned NumIndices);
|
||||||
LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
|
LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
|
||||||
LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
|
LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
|
||||||
LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
|
LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
|
||||||
|
@ -648,6 +648,9 @@ public:
|
|||||||
static Constant *getIntToPtr(Constant *C, const Type *Ty);
|
static Constant *getIntToPtr(Constant *C, const Type *Ty);
|
||||||
static Constant *getBitCast (Constant *C, const Type *Ty);
|
static Constant *getBitCast (Constant *C, const Type *Ty);
|
||||||
|
|
||||||
|
static Constant* getNSWAdd(Constant* C1, Constant* C2);
|
||||||
|
static Constant* getExactSDiv(Constant* C1, Constant* C2);
|
||||||
|
|
||||||
/// Transparently provide more efficient getOperand methods.
|
/// Transparently provide more efficient getOperand methods.
|
||||||
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant);
|
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant);
|
||||||
|
|
||||||
@ -734,6 +737,15 @@ public:
|
|||||||
static Constant *getGetElementPtr(Constant *C,
|
static Constant *getGetElementPtr(Constant *C,
|
||||||
Value* const *IdxList, unsigned NumIdx);
|
Value* const *IdxList, unsigned NumIdx);
|
||||||
|
|
||||||
|
/// Create an "inbounds" getelementptr. See the documentation for the
|
||||||
|
/// "inbounds" flag in LangRef.html for details.
|
||||||
|
static Constant *getInBoundsGetElementPtr(Constant *C,
|
||||||
|
Constant* const *IdxList,
|
||||||
|
unsigned NumIdx);
|
||||||
|
static Constant *getInBoundsGetElementPtr(Constant *C,
|
||||||
|
Value* const *IdxList,
|
||||||
|
unsigned NumIdx);
|
||||||
|
|
||||||
static Constant *getExtractElement(Constant *Vec, Constant *Idx);
|
static Constant *getExtractElement(Constant *Vec, Constant *Idx);
|
||||||
static Constant *getInsertElement(Constant *Vec, Constant *Elt,Constant *Idx);
|
static Constant *getInsertElement(Constant *Vec, Constant *Elt,Constant *Idx);
|
||||||
static Constant *getShuffleVector(Constant *V1, Constant *V2, Constant *Mask);
|
static Constant *getShuffleVector(Constant *V1, Constant *V2, Constant *Mask);
|
||||||
|
@ -36,7 +36,7 @@ public:
|
|||||||
return ConstantExpr::getAdd(LHS, RHS);
|
return ConstantExpr::getAdd(LHS, RHS);
|
||||||
}
|
}
|
||||||
Constant *CreateNSWAdd(Constant *LHS, Constant *RHS) const {
|
Constant *CreateNSWAdd(Constant *LHS, Constant *RHS) const {
|
||||||
return ConstantExpr::getAdd(LHS, RHS);
|
return ConstantExpr::getNSWAdd(LHS, RHS);
|
||||||
}
|
}
|
||||||
Constant *CreateFAdd(Constant *LHS, Constant *RHS) const {
|
Constant *CreateFAdd(Constant *LHS, Constant *RHS) const {
|
||||||
return ConstantExpr::getFAdd(LHS, RHS);
|
return ConstantExpr::getFAdd(LHS, RHS);
|
||||||
@ -60,7 +60,7 @@ public:
|
|||||||
return ConstantExpr::getSDiv(LHS, RHS);
|
return ConstantExpr::getSDiv(LHS, RHS);
|
||||||
}
|
}
|
||||||
Constant *CreateExactSDiv(Constant *LHS, Constant *RHS) const {
|
Constant *CreateExactSDiv(Constant *LHS, Constant *RHS) const {
|
||||||
return ConstantExpr::getSDiv(LHS, RHS);
|
return ConstantExpr::getExactSDiv(LHS, RHS);
|
||||||
}
|
}
|
||||||
Constant *CreateFDiv(Constant *LHS, Constant *RHS) const {
|
Constant *CreateFDiv(Constant *LHS, Constant *RHS) const {
|
||||||
return ConstantExpr::getFDiv(LHS, RHS);
|
return ConstantExpr::getFDiv(LHS, RHS);
|
||||||
@ -127,11 +127,11 @@ public:
|
|||||||
|
|
||||||
Constant *CreateInBoundsGetElementPtr(Constant *C, Constant* const *IdxList,
|
Constant *CreateInBoundsGetElementPtr(Constant *C, Constant* const *IdxList,
|
||||||
unsigned NumIdx) const {
|
unsigned NumIdx) const {
|
||||||
return ConstantExpr::getGetElementPtr(C, IdxList, NumIdx);
|
return ConstantExpr::getInBoundsGetElementPtr(C, IdxList, NumIdx);
|
||||||
}
|
}
|
||||||
Constant *CreateInBoundsGetElementPtr(Constant *C, Value* const *IdxList,
|
Constant *CreateInBoundsGetElementPtr(Constant *C, Value* const *IdxList,
|
||||||
unsigned NumIdx) const {
|
unsigned NumIdx) const {
|
||||||
return ConstantExpr::getGetElementPtr(C, IdxList, NumIdx);
|
return ConstantExpr::getInBoundsGetElementPtr(C, IdxList, NumIdx);
|
||||||
}
|
}
|
||||||
|
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
|
@ -131,7 +131,7 @@ public:
|
|||||||
|
|
||||||
Constant *CreateInBoundsGetElementPtr(Constant *C, Constant* const *IdxList,
|
Constant *CreateInBoundsGetElementPtr(Constant *C, Constant* const *IdxList,
|
||||||
unsigned NumIdx) const {
|
unsigned NumIdx) const {
|
||||||
return ConstantExpr::getGetElementPtr(C, IdxList, NumIdx);
|
return ConstantExpr::getInBoundsGetElementPtr(C, IdxList, NumIdx);
|
||||||
}
|
}
|
||||||
Value *CreateInBoundsGetElementPtr(Constant *C, Value* const *IdxList,
|
Value *CreateInBoundsGetElementPtr(Constant *C, Value* const *IdxList,
|
||||||
unsigned NumIdx) const {
|
unsigned NumIdx) const {
|
||||||
|
@ -52,7 +52,7 @@ public:
|
|||||||
return Fold(ConstantExpr::getAdd(LHS, RHS));
|
return Fold(ConstantExpr::getAdd(LHS, RHS));
|
||||||
}
|
}
|
||||||
Constant *CreateNSWAdd(Constant *LHS, Constant *RHS) const {
|
Constant *CreateNSWAdd(Constant *LHS, Constant *RHS) const {
|
||||||
return Fold(ConstantExpr::getAdd(LHS, RHS));
|
return Fold(ConstantExpr::getNSWAdd(LHS, RHS));
|
||||||
}
|
}
|
||||||
Constant *CreateFAdd(Constant *LHS, Constant *RHS) const {
|
Constant *CreateFAdd(Constant *LHS, Constant *RHS) const {
|
||||||
return Fold(ConstantExpr::getFAdd(LHS, RHS));
|
return Fold(ConstantExpr::getFAdd(LHS, RHS));
|
||||||
@ -76,7 +76,7 @@ public:
|
|||||||
return Fold(ConstantExpr::getSDiv(LHS, RHS));
|
return Fold(ConstantExpr::getSDiv(LHS, RHS));
|
||||||
}
|
}
|
||||||
Constant *CreateExactSDiv(Constant *LHS, Constant *RHS) const {
|
Constant *CreateExactSDiv(Constant *LHS, Constant *RHS) const {
|
||||||
return Fold(ConstantExpr::getSDiv(LHS, RHS));
|
return Fold(ConstantExpr::getExactSDiv(LHS, RHS));
|
||||||
}
|
}
|
||||||
Constant *CreateFDiv(Constant *LHS, Constant *RHS) const {
|
Constant *CreateFDiv(Constant *LHS, Constant *RHS) const {
|
||||||
return Fold(ConstantExpr::getFDiv(LHS, RHS));
|
return Fold(ConstantExpr::getFDiv(LHS, RHS));
|
||||||
@ -143,11 +143,11 @@ public:
|
|||||||
|
|
||||||
Constant *CreateInBoundsGetElementPtr(Constant *C, Constant* const *IdxList,
|
Constant *CreateInBoundsGetElementPtr(Constant *C, Constant* const *IdxList,
|
||||||
unsigned NumIdx) const {
|
unsigned NumIdx) const {
|
||||||
return Fold(ConstantExpr::getGetElementPtr(C, IdxList, NumIdx));
|
return Fold(ConstantExpr::getInBoundsGetElementPtr(C, IdxList, NumIdx));
|
||||||
}
|
}
|
||||||
Constant *CreateInBoundsGetElementPtr(Constant *C, Value* const *IdxList,
|
Constant *CreateInBoundsGetElementPtr(Constant *C, Value* const *IdxList,
|
||||||
unsigned NumIdx) const {
|
unsigned NumIdx) const {
|
||||||
return Fold(ConstantExpr::getGetElementPtr(C, IdxList, NumIdx));
|
return Fold(ConstantExpr::getInBoundsGetElementPtr(C, IdxList, NumIdx));
|
||||||
}
|
}
|
||||||
|
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
|
@ -203,21 +203,15 @@ static Constant *SymbolicallyEvaluateGEP(Constant* const* Ops, unsigned NumOps,
|
|||||||
if (Offset != 0)
|
if (Offset != 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// Create the GEP constant expr.
|
|
||||||
Constant *C = ConstantExpr::getGetElementPtr(Ptr,
|
|
||||||
&NewIdxs[0], NewIdxs.size());
|
|
||||||
assert(cast<PointerType>(C->getType())->getElementType() == Ty &&
|
|
||||||
"Computed GetElementPtr has unexpected type!");
|
|
||||||
|
|
||||||
// If the base is the start of a GlobalVariable and all the array indices
|
// If the base is the start of a GlobalVariable and all the array indices
|
||||||
// remain in their static bounds, the GEP is inbounds. We can check that
|
// remain in their static bounds, the GEP is inbounds. We can check that
|
||||||
// all indices are in bounds by just checking the first index only
|
// all indices are in bounds by just checking the first index only
|
||||||
// because we've just normalized all the indices. We can mutate the
|
// because we've just normalized all the indices.
|
||||||
// Constant in place because we've proven that the indices are in bounds,
|
Constant *C = isa<GlobalVariable>(Ptr) && NewIdxs[0]->isNullValue() ?
|
||||||
// so they'll always be in bounds.
|
ConstantExpr::getInBoundsGetElementPtr(Ptr, &NewIdxs[0], NewIdxs.size()) :
|
||||||
if (isa<GlobalVariable>(Ptr) && NewIdxs[0]->isNullValue())
|
ConstantExpr::getGetElementPtr(Ptr, &NewIdxs[0], NewIdxs.size());
|
||||||
if (GEPOperator *GEP = dyn_cast<GEPOperator>(C))
|
assert(cast<PointerType>(C->getType())->getElementType() == Ty &&
|
||||||
GEP->setIsInBounds(true);
|
"Computed GetElementPtr has unexpected type!");
|
||||||
|
|
||||||
// If we ended up indexing a member with a type that doesn't match
|
// If we ended up indexing a member with a type that doesn't match
|
||||||
// the type of what the original indices indexed, add a cast.
|
// the type of what the original indices indexed, add a cast.
|
||||||
|
@ -122,7 +122,9 @@ static Constant *FoldBitCast(LLVMContext &Context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ElTy == DPTy->getElementType())
|
if (ElTy == DPTy->getElementType())
|
||||||
return ConstantExpr::getGetElementPtr(V, &IdxList[0], IdxList.size());
|
// This GEP is inbounds because all indices are zero.
|
||||||
|
return ConstantExpr::getInBoundsGetElementPtr(V, &IdxList[0],
|
||||||
|
IdxList.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle casts from one vector constant to another. We know that the src
|
// Handle casts from one vector constant to another. We know that the src
|
||||||
|
@ -631,6 +631,24 @@ Constant* ConstantVector::get(Constant* const* Vals, unsigned NumVals) {
|
|||||||
return get(std::vector<Constant*>(Vals, Vals+NumVals));
|
return get(std::vector<Constant*>(Vals, Vals+NumVals));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Constant* ConstantExpr::getNSWAdd(Constant* C1, Constant* C2) {
|
||||||
|
Constant *C = getAdd(C1, C2);
|
||||||
|
// Set nsw attribute, assuming constant folding didn't eliminate the
|
||||||
|
// Add.
|
||||||
|
if (AddOperator *Add = dyn_cast<AddOperator>(C))
|
||||||
|
Add->setHasNoSignedWrap(true);
|
||||||
|
return C;
|
||||||
|
}
|
||||||
|
|
||||||
|
Constant* ConstantExpr::getExactSDiv(Constant* C1, Constant* C2) {
|
||||||
|
Constant *C = getSDiv(C1, C2);
|
||||||
|
// Set exact attribute, assuming constant folding didn't eliminate the
|
||||||
|
// SDiv.
|
||||||
|
if (SDivOperator *SDiv = dyn_cast<SDivOperator>(C))
|
||||||
|
SDiv->setIsExact(true);
|
||||||
|
return C;
|
||||||
|
}
|
||||||
|
|
||||||
// Utility function for determining if a ConstantExpr is a CastOp or not. This
|
// Utility function for determining if a ConstantExpr is a CastOp or not. This
|
||||||
// can't be inline because we don't want to #include Instruction.h into
|
// can't be inline because we don't want to #include Instruction.h into
|
||||||
// Constant.h
|
// Constant.h
|
||||||
@ -1473,11 +1491,28 @@ Constant *ConstantExpr::getGetElementPtr(Constant *C, Value* const *Idxs,
|
|||||||
return getGetElementPtrTy(PointerType::get(Ty, As), C, Idxs, NumIdx);
|
return getGetElementPtrTy(PointerType::get(Ty, As), C, Idxs, NumIdx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Constant *ConstantExpr::getInBoundsGetElementPtr(Constant *C,
|
||||||
|
Value* const *Idxs,
|
||||||
|
unsigned NumIdx) {
|
||||||
|
Constant *Result = getGetElementPtr(C, Idxs, NumIdx);
|
||||||
|
// Set in bounds attribute, assuming constant folding didn't eliminate the
|
||||||
|
// GEP.
|
||||||
|
if (GEPOperator *GEP = dyn_cast<GEPOperator>(Result))
|
||||||
|
GEP->setIsInBounds(true);
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
Constant *ConstantExpr::getGetElementPtr(Constant *C, Constant* const *Idxs,
|
Constant *ConstantExpr::getGetElementPtr(Constant *C, Constant* const *Idxs,
|
||||||
unsigned NumIdx) {
|
unsigned NumIdx) {
|
||||||
return getGetElementPtr(C, (Value* const *)Idxs, NumIdx);
|
return getGetElementPtr(C, (Value* const *)Idxs, NumIdx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Constant *ConstantExpr::getInBoundsGetElementPtr(Constant *C,
|
||||||
|
Constant* const *Idxs,
|
||||||
|
unsigned NumIdx) {
|
||||||
|
return getInBoundsGetElementPtr(C, (Value* const *)Idxs, NumIdx);
|
||||||
|
}
|
||||||
|
|
||||||
Constant *
|
Constant *
|
||||||
ConstantExpr::getICmp(unsigned short pred, Constant* LHS, Constant* RHS) {
|
ConstantExpr::getICmp(unsigned short pred, Constant* LHS, Constant* RHS) {
|
||||||
assert(LHS->getType() == RHS->getType());
|
assert(LHS->getType() == RHS->getType());
|
||||||
|
@ -535,6 +535,13 @@ LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
|
|||||||
unwrap<Constant>(RHSConstant)));
|
unwrap<Constant>(RHSConstant)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant,
|
||||||
|
LLVMValueRef RHSConstant) {
|
||||||
|
return wrap(ConstantExpr::getNSWAdd(
|
||||||
|
unwrap<Constant>(LHSConstant),
|
||||||
|
unwrap<Constant>(RHSConstant)));
|
||||||
|
}
|
||||||
|
|
||||||
LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
|
LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
|
||||||
return wrap(ConstantExpr::getFAdd(
|
return wrap(ConstantExpr::getFAdd(
|
||||||
unwrap<Constant>(LHSConstant),
|
unwrap<Constant>(LHSConstant),
|
||||||
@ -576,6 +583,13 @@ LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
|
|||||||
unwrap<Constant>(RHSConstant)));
|
unwrap<Constant>(RHSConstant)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LLVMValueRef LLVMConstExactSDiv(LLVMValueRef LHSConstant,
|
||||||
|
LLVMValueRef RHSConstant) {
|
||||||
|
return wrap(ConstantExpr::getExactSDiv(
|
||||||
|
unwrap<Constant>(LHSConstant),
|
||||||
|
unwrap<Constant>(RHSConstant)));
|
||||||
|
}
|
||||||
|
|
||||||
LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
|
LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
|
||||||
return wrap(ConstantExpr::getFDiv(
|
return wrap(ConstantExpr::getFDiv(
|
||||||
unwrap<Constant>(LHSConstant),
|
unwrap<Constant>(LHSConstant),
|
||||||
@ -659,6 +673,14 @@ LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
|
|||||||
NumIndices));
|
NumIndices));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LLVMValueRef LLVMConstInBoundsGEP(LLVMValueRef ConstantVal,
|
||||||
|
LLVMValueRef *ConstantIndices,
|
||||||
|
unsigned NumIndices) {
|
||||||
|
Constant* Val = unwrap<Constant>(ConstantVal);
|
||||||
|
Constant** Idxs = unwrap<Constant>(ConstantIndices, NumIndices);
|
||||||
|
return wrap(ConstantExpr::getInBoundsGetElementPtr(Val, Idxs, NumIndices));
|
||||||
|
}
|
||||||
|
|
||||||
LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
|
LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
|
||||||
return wrap(ConstantExpr::getTrunc(
|
return wrap(ConstantExpr::getTrunc(
|
||||||
unwrap<Constant>(ConstantVal),
|
unwrap<Constant>(ConstantVal),
|
||||||
|
Reference in New Issue
Block a user