diff --git a/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp b/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp --- a/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp +++ b/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp @@ -1408,9 +1408,7 @@ } /// This lowering tries to look for G_PTR_ADD instructions and then converts -/// them to a standard G_ADD with a COPY on the source, and G_INTTOPTR on the -/// result. This is ok for address space 0 on AArch64 as p0 can be treated as -/// s64. +/// them to a standard G_ADD with a COPY on the source. /// /// The motivation behind this is to expose the add semantics to the imported /// tablegen patterns. We shouldn't need to check for uses being loads/stores, @@ -1422,7 +1420,6 @@ assert(I.getOpcode() == TargetOpcode::G_PTR_ADD && "Expected G_PTR_ADD"); Register DstReg = I.getOperand(0).getReg(); Register AddOp1Reg = I.getOperand(1).getReg(); - Register AddOp2Reg = I.getOperand(2).getReg(); const LLT PtrTy = MRI.getType(DstReg); if (PtrTy.getAddressSpace() != 0) return false; @@ -1434,23 +1431,14 @@ MachineIRBuilder MIB(I); const LLT s64 = LLT::scalar(64); auto PtrToInt = MIB.buildPtrToInt(s64, AddOp1Reg); - auto Add = MIB.buildAdd(s64, PtrToInt, AddOp2Reg); // Set regbanks on the registers. MRI.setRegBank(PtrToInt.getReg(0), RBI.getRegBank(AArch64::GPRRegBankID)); - MRI.setRegBank(Add.getReg(0), RBI.getRegBank(AArch64::GPRRegBankID)); - - // Now turn the %dst = G_PTR_ADD %base, off into: - // %dst = G_INTTOPTR %Add - I.setDesc(TII.get(TargetOpcode::G_INTTOPTR)); - I.getOperand(1).setReg(Add.getReg(0)); - I.RemoveOperand(2); - - // We need to manually call select on these because new instructions don't - // get added to the selection queue. - if (!select(*Add)) { - LLVM_DEBUG(dbgs() << "Failed to select G_ADD in convertPtrAddToAdd"); - return false; - } + + // Now turn the %dst(p0) = G_PTR_ADD %base, off into: + // %dst(s64) = G_ADD %intbase, off + I.setDesc(TII.get(TargetOpcode::G_ADD)); + MRI.setType(DstReg, s64); + I.getOperand(1).setReg(PtrToInt.getReg(0)); if (!select(*PtrToInt)) { LLVM_DEBUG(dbgs() << "Failed to select G_PTRTOINT in convertPtrAddToAdd"); return false; diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/load-addressing-modes.mir b/llvm/test/CodeGen/AArch64/GlobalISel/load-addressing-modes.mir --- a/llvm/test/CodeGen/AArch64/GlobalISel/load-addressing-modes.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/load-addressing-modes.mir @@ -93,11 +93,10 @@ ; CHECK: liveins: $x0, $x1 ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0 ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1 - ; CHECK: [[ADDXrr:%[0-9]+]]:gpr64 = ADDXrr [[COPY]], [[COPY1]] - ; CHECK: [[COPY2:%[0-9]+]]:gpr64common = COPY [[ADDXrr]] - ; CHECK: [[LDRXui:%[0-9]+]]:gpr64 = LDRXui [[COPY2]], 0 :: (load 8 from %ir.addr) - ; CHECK: [[COPY3:%[0-9]+]]:gpr64 = COPY [[COPY2]] - ; CHECK: [[ADDXrr1:%[0-9]+]]:gpr64 = ADDXrr [[COPY3]], [[LDRXui]] + ; CHECK: [[ADDXrr:%[0-9]+]]:gpr64common = ADDXrr [[COPY]], [[COPY1]] + ; CHECK: [[LDRXui:%[0-9]+]]:gpr64 = LDRXui [[ADDXrr]], 0 :: (load 8 from %ir.addr) + ; CHECK: [[COPY2:%[0-9]+]]:gpr64 = COPY [[ADDXrr]] + ; CHECK: [[ADDXrr1:%[0-9]+]]:gpr64 = ADDXrr [[COPY2]], [[LDRXui]] ; CHECK: $x0 = COPY [[ADDXrr1]] ; CHECK: RET_ReallyLR implicit $x0 %0:gpr(p0) = COPY $x0 @@ -387,13 +386,12 @@ ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0 ; CHECK: [[UBFMXri:%[0-9]+]]:gpr64common = UBFMXri [[COPY]], 61, 60 ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1 - ; CHECK: [[ADDXrr:%[0-9]+]]:gpr64 = ADDXrr [[COPY1]], [[UBFMXri]] - ; CHECK: [[COPY2:%[0-9]+]]:gpr64common = COPY [[ADDXrr]] - ; CHECK: [[LDRXui:%[0-9]+]]:gpr64 = LDRXui [[COPY2]], 0 :: (load 8 from %ir.addr) + ; CHECK: [[ADDXrr:%[0-9]+]]:gpr64common = ADDXrr [[COPY1]], [[UBFMXri]] + ; CHECK: [[LDRXui:%[0-9]+]]:gpr64 = LDRXui [[ADDXrr]], 0 :: (load 8 from %ir.addr) ; CHECK: [[ADDXri:%[0-9]+]]:gpr64common = ADDXri [[UBFMXri]], 3, 0 ; CHECK: [[ADDXrr1:%[0-9]+]]:gpr64 = ADDXrr [[LDRXui]], [[ADDXri]] - ; CHECK: [[COPY3:%[0-9]+]]:gpr64 = COPY [[COPY2]] - ; CHECK: [[ADDXrr2:%[0-9]+]]:gpr64 = ADDXrr [[COPY3]], [[ADDXrr1]] + ; CHECK: [[COPY2:%[0-9]+]]:gpr64 = COPY [[ADDXrr]] + ; CHECK: [[ADDXrr2:%[0-9]+]]:gpr64 = ADDXrr [[COPY2]], [[ADDXrr1]] ; CHECK: $x2 = COPY [[ADDXrr2]] ; CHECK: RET_ReallyLR implicit $x2 %0:gpr(s64) = COPY $x0 @@ -459,10 +457,9 @@ ; CHECK: liveins: $x0, $x1, $x2 ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0 ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1 - ; CHECK: [[ADDXrs:%[0-9]+]]:gpr64 = ADDXrs [[COPY1]], [[COPY]], 3 - ; CHECK: [[COPY2:%[0-9]+]]:gpr64sp = COPY [[ADDXrs]] - ; CHECK: [[LDRXui:%[0-9]+]]:gpr64 = LDRXui [[COPY2]], 0 :: (load 8 from %ir.addr) - ; CHECK: [[LDRXui1:%[0-9]+]]:gpr64 = LDRXui [[COPY2]], 0 :: (load 8 from %ir.addr) + ; CHECK: [[ADDXrs:%[0-9]+]]:gpr64common = ADDXrs [[COPY1]], [[COPY]], 3 + ; CHECK: [[LDRXui:%[0-9]+]]:gpr64 = LDRXui [[ADDXrs]], 0 :: (load 8 from %ir.addr) + ; CHECK: [[LDRXui1:%[0-9]+]]:gpr64 = LDRXui [[ADDXrs]], 0 :: (load 8 from %ir.addr) ; CHECK: [[ADDXrr:%[0-9]+]]:gpr64 = ADDXrr [[LDRXui]], [[LDRXui1]] ; CHECK: $x2 = COPY [[ADDXrr]] ; CHECK: RET_ReallyLR implicit $x2 diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/select.mir b/llvm/test/CodeGen/AArch64/GlobalISel/select.mir --- a/llvm/test/CodeGen/AArch64/GlobalISel/select.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/select.mir @@ -106,8 +106,8 @@ # CHECK: body: # CHECK: %0:gpr64 = COPY $x0 -# CHECK: %5:gpr32 = MOVi32imm 10000 -# CHECK: %1:gpr64 = SUBREG_TO_REG 0, %5, %subreg.sub_32 +# CHECK: %4:gpr32 = MOVi32imm 10000 +# CHECK: %1:gpr64 = SUBREG_TO_REG 0, %4, %subreg.sub_32 # CHECK: %{{[0-9]+}}:gpr64 = ADDXrr %0, %1 body: | bb.0: