[llvm-commits] CVS: llvm/lib/Target/SparcV9/SparcV9PreSelection.cpp
Chris Lattner
lattner at cs.uiuc.edu
Sun Apr 4 15:45:01 PDT 2004
Changes in directory llvm/lib/Target/SparcV9:
SparcV9PreSelection.cpp updated: 1.30 -> 1.31
---
Log message:
In the perhaps not-to-distant future, we might support gep instructions that
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.
---
Diffs of the changes: (+20 -5)
Index: llvm/lib/Target/SparcV9/SparcV9PreSelection.cpp
diff -u llvm/lib/Target/SparcV9/SparcV9PreSelection.cpp:1.30 llvm/lib/Target/SparcV9/SparcV9PreSelection.cpp:1.31
--- llvm/lib/Target/SparcV9/SparcV9PreSelection.cpp:1.30 Fri Apr 2 11:52:29 2004
+++ llvm/lib/Target/SparcV9/SparcV9PreSelection.cpp Sun Apr 4 15:44:05 2004
@@ -24,12 +24,12 @@
#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 @@
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 @@
/// 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
More information about the llvm-commits
mailing list