diff --git a/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp b/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp index 5d37e929f8755..7e0012c694d6b 100644 --- a/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp +++ b/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp @@ -1041,6 +1041,11 @@ bool PPCInstrInfo::isCoalescableExtInstr(const MachineInstr &MI, case PPC::EXTSW_32: case PPC::EXTSW_32_64: SrcReg = MI.getOperand(1).getReg(); + // On 64-bit targets, extension can not be eliminated if the input is zero + // extended. The input before zero extention may be a negative value. + if (Subtarget.isPPC64() && + isZeroExtended(SrcReg, &MI.getMF()->getRegInfo())) + return false; DstReg = MI.getOperand(0).getReg(); SubIdx = PPC::sub_32; return true; diff --git a/llvm/test/CodeGen/PowerPC/pr74951.ll b/llvm/test/CodeGen/PowerPC/pr74951.ll index c1b2e3ee0dd68..c4c98fe870586 100644 --- a/llvm/test/CodeGen/PowerPC/pr74951.ll +++ b/llvm/test/CodeGen/PowerPC/pr74951.ll @@ -11,12 +11,12 @@ define noundef signext i32 @main() { ; CHECK-LABEL: main: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: ld r3, L..C0(r2) # @b -; CHECK-NEXT: lwz r3, 0(r3) -; CHECK-NEXT: andi. r4, r3, 65535 +; CHECK-NEXT: lwz r4, 0(r3) +; CHECK-NEXT: andi. r3, r4, 65535 +; CHECK-NEXT: extsw r3, r4 ; CHECK-NEXT: bne cr0, L..BB0_4 ; CHECK-NEXT: # %bb.1: # %lor.rhs.i.i -; CHECK-NEXT: extsw r4, r3 -; CHECK-NEXT: neg r5, r4 +; CHECK-NEXT: neg r5, r3 ; CHECK-NEXT: rldicl r5, r5, 1, 63 ; CHECK-NEXT: xori r5, r5, 1 ; CHECK-NEXT: cmpw r4, r5