From 31e575901f146b9e114b77341760657322b9a20f Mon Sep 17 00:00:00 2001 From: Brian Gaeke Date: Wed, 24 Nov 2004 04:07:33 +0000 Subject: [PATCH] Fix bug in emitGEPOperation with large struct-member offsets. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18201 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Sparc/SparcV8ISelSimple.cpp | 14 ++++++++++++-- lib/Target/SparcV8/SparcV8ISelSimple.cpp | 14 ++++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/lib/Target/Sparc/SparcV8ISelSimple.cpp b/lib/Target/Sparc/SparcV8ISelSimple.cpp index bca63dbf7b4..0ea1f4a2d8a 100644 --- a/lib/Target/Sparc/SparcV8ISelSimple.cpp +++ b/lib/Target/Sparc/SparcV8ISelSimple.cpp @@ -1059,8 +1059,18 @@ void V8ISel::emitGEPOperation (MachineBasicBlock *MBB, unsigned memberOffset = TD.getStructLayout (StTy)->MemberOffsets[fieldIndex]; // Emit an ADD to add memberOffset to the basePtr. - BuildMI (*MBB, IP, V8::ADDri, 2, - nextBasePtrReg).addReg (basePtrReg).addZImm (memberOffset); + // We might have to copy memberOffset into a register first, if it's + // big. + if (memberOffset + 4096 < 8191) { + BuildMI (*MBB, IP, V8::ADDri, 2, + nextBasePtrReg).addReg (basePtrReg).addSImm (memberOffset); + } else { + unsigned offsetReg = makeAnotherReg (Type::IntTy); + copyConstantToRegister (MBB, IP, + ConstantInt::get(Type::IntTy, memberOffset), offsetReg); + BuildMI (*MBB, IP, V8::ADDrr, 2, + nextBasePtrReg).addReg (basePtrReg).addReg (offsetReg); + } // The next type is the member of the structure selected by the // index. Ty = StTy->getElementType (fieldIndex); diff --git a/lib/Target/SparcV8/SparcV8ISelSimple.cpp b/lib/Target/SparcV8/SparcV8ISelSimple.cpp index bca63dbf7b4..0ea1f4a2d8a 100644 --- a/lib/Target/SparcV8/SparcV8ISelSimple.cpp +++ b/lib/Target/SparcV8/SparcV8ISelSimple.cpp @@ -1059,8 +1059,18 @@ void V8ISel::emitGEPOperation (MachineBasicBlock *MBB, unsigned memberOffset = TD.getStructLayout (StTy)->MemberOffsets[fieldIndex]; // Emit an ADD to add memberOffset to the basePtr. - BuildMI (*MBB, IP, V8::ADDri, 2, - nextBasePtrReg).addReg (basePtrReg).addZImm (memberOffset); + // We might have to copy memberOffset into a register first, if it's + // big. + if (memberOffset + 4096 < 8191) { + BuildMI (*MBB, IP, V8::ADDri, 2, + nextBasePtrReg).addReg (basePtrReg).addSImm (memberOffset); + } else { + unsigned offsetReg = makeAnotherReg (Type::IntTy); + copyConstantToRegister (MBB, IP, + ConstantInt::get(Type::IntTy, memberOffset), offsetReg); + BuildMI (*MBB, IP, V8::ADDrr, 2, + nextBasePtrReg).addReg (basePtrReg).addReg (offsetReg); + } // The next type is the member of the structure selected by the // index. Ty = StTy->getElementType (fieldIndex); -- 2.34.1