Fix bug in emitGEPOperation with large struct-member offsets.
authorBrian Gaeke <gaeke@uiuc.edu>
Wed, 24 Nov 2004 04:07:33 +0000 (04:07 +0000)
committerBrian Gaeke <gaeke@uiuc.edu>
Wed, 24 Nov 2004 04:07:33 +0000 (04:07 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18201 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Sparc/SparcV8ISelSimple.cpp
lib/Target/SparcV8/SparcV8ISelSimple.cpp

index bca63dbf7b43cfdaf0bfa4bcd0449167bdfd0bcd..0ea1f4a2d8ac76eaa882a6a65d2952756471f85c 100644 (file)
@@ -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);
index bca63dbf7b43cfdaf0bfa4bcd0449167bdfd0bcd..0ea1f4a2d8ac76eaa882a6a65d2952756471f85c 100644 (file)
@@ -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);