From 0081070cfdab646dcecc7455cdd1285a379cb4dd Mon Sep 17 00:00:00 2001 From: Juergen Ributzka Date: Wed, 15 Oct 2014 04:55:48 +0000 Subject: [PATCH] Revert "[FastISel][AArch64] Add custom lowering for GEPs." This breaks our internal build bots. Reverting it to get the bots green again. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219776 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/AArch64/AArch64FastISel.cpp | 85 ------------------- .../CodeGen/AArch64/arm64-fast-isel-alloca.ll | 5 +- test/CodeGen/AArch64/fast-isel-gep.ll | 18 ---- 3 files changed, 3 insertions(+), 105 deletions(-) delete mode 100644 test/CodeGen/AArch64/fast-isel-gep.ll diff --git a/lib/Target/AArch64/AArch64FastISel.cpp b/lib/Target/AArch64/AArch64FastISel.cpp index b074be9419c..faf8ded4541 100644 --- a/lib/Target/AArch64/AArch64FastISel.cpp +++ b/lib/Target/AArch64/AArch64FastISel.cpp @@ -134,7 +134,6 @@ private: bool selectBitCast(const Instruction *I); bool selectFRem(const Instruction *I); bool selectSDiv(const Instruction *I); - bool selectGetElementPtr(const Instruction *I); // Utility helper routines. bool isTypeLegal(Type *Ty, MVT &VT); @@ -4542,88 +4541,6 @@ bool AArch64FastISel::selectSDiv(const Instruction *I) { return true; } -bool AArch64FastISel::selectGetElementPtr(const Instruction *I) { - unsigned N = getRegForValue(I->getOperand(0)); - if (!N) - return false; - bool NIsKill = hasTrivialKill(I->getOperand(0)); - - // Keep a running tab of the total offset to coalesce multiple N = N + Offset - // into a single N = N + TotalOffset. - uint64_t TotalOffs = 0; - Type *Ty = I->getOperand(0)->getType(); - MVT VT = TLI.getPointerTy(); - for (auto OI = std::next(I->op_begin()), E = I->op_end(); OI != E; ++OI) { - const Value *Idx = *OI; - if (auto *StTy = dyn_cast(Ty)) { - unsigned Field = cast(Idx)->getZExtValue(); - // N = N + Offset - if (Field) - TotalOffs += DL.getStructLayout(StTy)->getElementOffset(Field); - Ty = StTy->getElementType(Field); - } else { - Ty = cast(Ty)->getElementType(); - // If this is a constant subscript, handle it quickly. - if (const auto *CI = dyn_cast(Idx)) { - if (CI->isZero()) - continue; - // N = N + Offset - TotalOffs += - DL.getTypeAllocSize(Ty) * cast(CI)->getSExtValue(); - continue; - } - if (TotalOffs) { - N = emitAddSub_ri(/*UseAdd=*/true, VT, N, NIsKill, TotalOffs); - if (!N) { - unsigned C = fastEmit_i(VT, VT, ISD::Constant, TotalOffs); - if (!C) - return false; - N = emitAddSub_rr(/*UseAdd=*/true, VT, N, NIsKill, C, true); - if (!N) - return false; - } - NIsKill = true; - TotalOffs = 0; - } - - // N = N + Idx * ElementSize; - uint64_t ElementSize = DL.getTypeAllocSize(Ty); - std::pair Pair = getRegForGEPIndex(Idx); - unsigned IdxN = Pair.first; - bool IdxNIsKill = Pair.second; - if (!IdxN) - return false; - - if (ElementSize != 1) { - unsigned C = fastEmit_i(VT, VT, ISD::Constant, ElementSize); - if (!C) - return false; - IdxN = emitMul_rr(VT, IdxN, IdxNIsKill, C, true); - if (!IdxN) - return false; - IdxNIsKill = true; - } - N = fastEmit_rr(VT, VT, ISD::ADD, N, NIsKill, IdxN, IdxNIsKill); - if (!N) - return false; - } - } - if (TotalOffs) { - N = emitAddSub_ri(/*UseAdd=*/true, VT, N, NIsKill, TotalOffs); - if (!N) { - unsigned C = fastEmit_i(VT, VT, ISD::Constant, TotalOffs); - if (!C) - return false; - N = emitAddSub_rr(/*UseAdd=*/true, VT, N, NIsKill, C, true); - if (!N) - return false; - } - } - - updateValueMap(I, N); - return true; -} - bool AArch64FastISel::fastSelectInstruction(const Instruction *I) { switch (I->getOpcode()) { default: @@ -4695,8 +4612,6 @@ bool AArch64FastISel::fastSelectInstruction(const Instruction *I) { return selectRet(I); case Instruction::FRem: return selectFRem(I); - case Instruction::GetElementPtr: - return selectGetElementPtr(I); } // fall-back to target-independent instruction selection. diff --git a/test/CodeGen/AArch64/arm64-fast-isel-alloca.ll b/test/CodeGen/AArch64/arm64-fast-isel-alloca.ll index a8417027ce2..34394b2af0a 100644 --- a/test/CodeGen/AArch64/arm64-fast-isel-alloca.ll +++ b/test/CodeGen/AArch64/arm64-fast-isel-alloca.ll @@ -15,8 +15,9 @@ define void @main() nounwind { entry: ; CHECK: main ; CHECK: mov x29, sp -; CHECK: mov [[REG:x[0-9]+]], sp -; CHECK-NEXT: add x0, [[REG]], #8 +; CHECK: mov x[[REG:[0-9]+]], sp +; CHECK-NEXT: orr x[[REG1:[0-9]+]], xzr, #0x8 +; CHECK-NEXT: add x0, x[[REG]], x[[REG1]] %E = alloca %struct.S2Ty, align 4 %B = getelementptr inbounds %struct.S2Ty* %E, i32 0, i32 1 call void @takeS1(%struct.S1Ty* %B) diff --git a/test/CodeGen/AArch64/fast-isel-gep.ll b/test/CodeGen/AArch64/fast-isel-gep.ll deleted file mode 100644 index d72019801ba..00000000000 --- a/test/CodeGen/AArch64/fast-isel-gep.ll +++ /dev/null @@ -1,18 +0,0 @@ -; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel -fast-isel-abort -verify-machineinstrs < %s | FileCheck %s - -%struct.foo = type { i32, i64, float, double } - -define double* @test_struct(%struct.foo* %f) { -; CHECK-LABEL: test_struct -; CHECK: add x0, x0, #24 - %1 = getelementptr inbounds %struct.foo* %f, i64 0, i32 3 - ret double* %1 -} - -define i32* @test_array(i32* %a, i64 %i) { -; CHECK-LABEL: test_array -; CHECK: orr [[REG:x[0-9]+]], xzr, #0x4 -; CHECK-NEXT: madd x0, x1, [[REG]], x0 - %1 = getelementptr inbounds i32* %a, i64 %i - ret i32* %1 -} -- 2.34.1