aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGExprScalar.cpp
diff options
context:
space:
mode:
authorSanjiv Gupta <sanjiv.gupta@microchip.com>2009-04-08 04:16:39 +0000
committerSanjiv Gupta <sanjiv.gupta@microchip.com>2009-04-08 04:16:39 +0000
commit75c47a5cdf480571a71935cf80d49f802fec15a3 (patch)
treec30a97af0ca74ad99bfccd6f08747eed4a8d5684 /lib/CodeGen/CGExprScalar.cpp
parent837e897660a527cfe2b443ae7303f6cc8ba99a83 (diff)
Pointer width on targets like PIC16 is 16-bit, while the valid index size to GEP is only 32 or 64. So promote index to 32 in such cases.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68590 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGExprScalar.cpp')
-rw-r--r--lib/CodeGen/CGExprScalar.cpp14
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp
index 225b70882e..3a24af4953 100644
--- a/lib/CodeGen/CGExprScalar.cpp
+++ b/lib/CodeGen/CGExprScalar.cpp
@@ -944,10 +944,14 @@ Value *ScalarExprEmitter::EmitAdd(const BinOpInfo &Ops) {
}
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
@@ -990,10 +994,12 @@ Value *ScalarExprEmitter::EmitSub(const BinOpInfo &Ops) {
// 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