In the perhaps not-to-distant future, we might support gep instructions that
authorChris Lattner <sabre@nondot.org>
Sun, 4 Apr 2004 20:44:05 +0000 (20:44 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 4 Apr 2004 20:44:05 +0000 (20:44 +0000)
have non-long indices for sequential types.  In order to avoid trying to figure
out how the v9 backend works, we'll just hack it in the preselection pass.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12647 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/SparcV9/SparcV9PreSelection.cpp

index 9677b45a2e2709af61046db48ce4e69609e47273..2677d4ce26bf8e285859343036c4719e15bca1ec 100644 (file)
 #include "llvm/Module.h"
 #include "llvm/Pass.h"
 #include "llvm/Support/InstVisitor.h"
+#include "llvm/Support/GetElementPtrTypeIterator.h"
 #include "llvm/Target/TargetInstrInfo.h"
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/Transforms/Scalar.h"
 #include <algorithm>
-
-namespace llvm {
+using namespace llvm;
 
 namespace {
 
@@ -228,6 +228,23 @@ inline void PreSelection::visitInstruction(Instruction &I) {
 void PreSelection::visitGetElementPtrInst(GetElementPtrInst &I) { 
   Instruction* curI = &I;
 
+  // The Sparc backend doesn't handle array indexes that are not long types, so
+  // insert a cast from whatever it is to long, if the sequential type index is
+  // not a long already.
+  unsigned Idx = 1;
+  for (gep_type_iterator TI = gep_type_begin(I), E = gep_type_end(I); TI != E;
+       ++TI, ++Idx)
+    if (isa<SequentialType>(*TI) &&
+        I.getOperand(Idx)->getType() != Type::LongTy) {
+      Value *Op = I.getOperand(Idx);
+      if (Op->getType()->isUnsigned())    // Must sign extend!
+        Op = new CastInst(Op, Op->getType()->getSignedVersion(), "v9", &I);
+      if (Op->getType() != Type::LongTy)
+        Op = new CastInst(Op, Type::LongTy, "v9", &I);
+      I.setOperand(Idx, Op);
+    }
+
+
   // Decompose multidimensional array references
   if (I.getNumIndices() >= 2) {
     // DecomposeArrayRef() replaces I and deletes it, if successful,
@@ -251,8 +268,6 @@ void PreSelection::visitCallInst(CallInst &I) {
 
 /// createPreSelectionPass - Public entry point for the PreSelection pass
 ///
-FunctionPass* createPreSelectionPass(const TargetMachine &TM) {
+FunctionPass* llvm::createPreSelectionPass(const TargetMachine &TM) {
   return new PreSelection(TM);
 }
-
-} // End llvm namespace