diff options
-rw-r--r-- | lib/CodeGen/SelectionDAG/FastISel.cpp | 16 | ||||
-rw-r--r-- | test/CodeGen/X86/fast-isel.ll | 7 |
2 files changed, 13 insertions, 10 deletions
diff --git a/lib/CodeGen/SelectionDAG/FastISel.cpp b/lib/CodeGen/SelectionDAG/FastISel.cpp index b4271fe..71042ff 100644 --- a/lib/CodeGen/SelectionDAG/FastISel.cpp +++ b/lib/CodeGen/SelectionDAG/FastISel.cpp @@ -74,7 +74,7 @@ bool FastISel::SelectGetElementPtr(Instruction *I, return false; const Type *Ty = I->getOperand(0)->getType(); - MVT VT = MVT::getMVT(Ty, /*HandleUnknown=*/false); + MVT::SimpleValueType VT = TLI.getPointerTy().getSimpleVT(); for (GetElementPtrInst::op_iterator OI = I->op_begin()+1, E = I->op_end(); OI != E; ++OI) { Value *Idx = *OI; @@ -85,7 +85,7 @@ bool FastISel::SelectGetElementPtr(Instruction *I, uint64_t Offs = TD.getStructLayout(StTy)->getElementOffset(Field); // FIXME: This can be optimized by combining the add with a // subsequent one. - N = FastEmit_ri_(VT.getSimpleVT(), ISD::ADD, N, Offs, VT.getSimpleVT()); + N = FastEmit_ri_(VT, ISD::ADD, N, Offs, VT); if (N == 0) // Unhandled operand. Halt "fast" selection and bail. return false; @@ -99,7 +99,7 @@ bool FastISel::SelectGetElementPtr(Instruction *I, if (CI->getZExtValue() == 0) continue; uint64_t Offs = TD.getABITypeSize(Ty)*cast<ConstantInt>(CI)->getSExtValue(); - N = FastEmit_ri_(VT.getSimpleVT(), ISD::ADD, N, Offs, VT.getSimpleVT()); + N = FastEmit_ri_(VT, ISD::ADD, N, Offs, VT); if (N == 0) // Unhandled operand. Halt "fast" selection and bail. return false; @@ -117,21 +117,21 @@ bool FastISel::SelectGetElementPtr(Instruction *I, // it. MVT IdxVT = MVT::getMVT(Idx->getType(), /*HandleUnknown=*/false); if (IdxVT.bitsLT(VT)) - IdxN = FastEmit_r(VT.getSimpleVT(), ISD::SIGN_EXTEND, IdxN); + IdxN = FastEmit_r(VT, ISD::SIGN_EXTEND, IdxN); else if (IdxVT.bitsGT(VT)) - IdxN = FastEmit_r(VT.getSimpleVT(), ISD::TRUNCATE, IdxN); + IdxN = FastEmit_r(VT, ISD::TRUNCATE, IdxN); if (IdxN == 0) // Unhandled operand. Halt "fast" selection and bail. return false; // FIXME: If multiple is power of two, turn it into a shift. The // optimization should be in FastEmit_ri? - IdxN = FastEmit_ri_(VT.getSimpleVT(), ISD::MUL, IdxN, - ElementSize, VT.getSimpleVT()); + IdxN = FastEmit_ri_(VT, ISD::MUL, IdxN, + ElementSize, VT); if (IdxN == 0) // Unhandled operand. Halt "fast" selection and bail. return false; - N = FastEmit_rr(VT.getSimpleVT(), ISD::ADD, N, IdxN); + N = FastEmit_rr(VT, ISD::ADD, N, IdxN); if (N == 0) // Unhandled operand. Halt "fast" selection and bail. return false; diff --git a/test/CodeGen/X86/fast-isel.ll b/test/CodeGen/X86/fast-isel.ll index ba7e861..f74e97e 100644 --- a/test/CodeGen/X86/fast-isel.ll +++ b/test/CodeGen/X86/fast-isel.ll @@ -3,10 +3,11 @@ ; This tests very minimal fast-isel functionality. -define i32 @foo(i32* %p, i32* %q) { +define i32* @foo(i32* %p, i32* %q, i32** %z) { entry: %r = load i32* %p %s = load i32* %q + %y = load i32** %z br label %fast fast: @@ -17,10 +18,12 @@ fast: %t4 = or i32 %t3, %s %t5 = xor i32 %t4, %s %t6 = add i32 %t5, 2 + %t7 = getelementptr i32* %y, i32 1 + %t8 = getelementptr i32* %t7, i32 %t6 br label %exit exit: - ret i32 %t6 + ret i32* %t8 } define double @bar(double* %p, double* %q) { |