QualType IdxTy = E->getIdx()->getType();
bool IdxSigned = IdxTy->isSignedIntegerType();
unsigned IdxBitwidth = cast<llvm::IntegerType>(Idx->getType())->getBitWidth();
- if (IdxBitwidth != LLVMPointerWidth)
- Idx = Builder.CreateIntCast(Idx, llvm::IntegerType::get(LLVMPointerWidth),
+
+ // If Pointer width is less than 32 than extend to 32.
+ unsigned IdxValidWidth = (LLVMPointerWidth < 32 ) ? 32 : LLVMPointerWidth;
+ if (IdxBitwidth != IdxValidWidth)
+ Idx = Builder.CreateIntCast(Idx, llvm::IntegerType::get(IdxValidWidth),
IdxSigned, "idxprom");
// We know that the pointer points to a type of the correct size, unless the
}
unsigned Width = cast<llvm::IntegerType>(Idx->getType())->getBitWidth();
- if (Width < CGF.LLVMPointerWidth) {
+ // Only 32 and 64 are valid index widths. So if a target has shorter
+ // pointe width, extend to 32 at least.
+ unsigned IdxValidWidth
+ = (CGF.LLVMPointerWidth < 32) ? 32 : CGF.LLVMPointerWidth;
+ if (Width < IdxValidWidth) {
// Zero or sign extend the pointer value based on whether the index is
// signed or not.
- const llvm::Type *IdxType = llvm::IntegerType::get(CGF.LLVMPointerWidth);
+ const llvm::Type *IdxType = llvm::IntegerType::get(IdxValidWidth);
if (IdxExp->getType()->isSignedIntegerType())
Idx = Builder.CreateSExt(Idx, IdxType, "idx.ext");
else
// pointer - int
Value *Idx = Ops.RHS;
unsigned Width = cast<llvm::IntegerType>(Idx->getType())->getBitWidth();
- if (Width < CGF.LLVMPointerWidth) {
+ unsigned IdxValidWidth
+ = (CGF.LLVMPointerWidth < 32) ? 32 : CGF.LLVMPointerWidth;
+ if (Width < IdxValidWidth) {
// Zero or sign extend the pointer value based on whether the index is
// signed or not.
- const llvm::Type *IdxType = llvm::IntegerType::get(CGF.LLVMPointerWidth);
+ const llvm::Type *IdxType = llvm::IntegerType::get(IdxValidWidth);
if (Ops.E->getRHS()->getType()->isSignedIntegerType())
Idx = Builder.CreateSExt(Idx, IdxType, "idx.ext");
else