From: Dan Gohman Date: Thu, 21 Aug 2008 17:25:26 +0000 (+0000) Subject: MVT::getMVT uses iPTR for pointer types, while we need the actual X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=7a0e6593d03bd2dd21c3ac7dcf189f1da86b16da;p=oota-llvm.git MVT::getMVT uses iPTR for pointer types, while we need the actual intptr_t type in this case. FastISel can now select simple getelementptr instructions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55125 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/SelectionDAG/FastISel.cpp b/lib/CodeGen/SelectionDAG/FastISel.cpp index b4271fe6d2c..71042ff277a 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(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 ba7e861600a..f74e97e4d3c 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) {