Skip to content

Commit 61f6915

Browse files
committed
[PowerPC] Sign extend comparison operand for signed atomic comparisons
As of 8dacca9, we sign extend the atomic loaded operand for signed subword comparisons. However, the assumption that the other operand is correctly sign extended doesn't always hold. This patch sign extends the other operand if it needs to be sign extended. This is a second fix for https://bugs.llvm.org/show_bug.cgi?id=30451 Differential revision: https://reviews.llvm.org/D94058
1 parent bc713f6 commit 61f6915

File tree

3 files changed

+418
-206
lines changed

3 files changed

+418
-206
lines changed

llvm/lib/Target/PowerPC/PPCISelLowering.cpp

Lines changed: 73 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10593,17 +10593,88 @@ PPCTargetLowering::EmitAtomicBinary(MachineInstr &MI, MachineBasicBlock *BB,
1059310593
return BB;
1059410594
}
1059510595

10596+
static bool isSignExtended(MachineInstr &MI, const PPCInstrInfo *TII) {
10597+
switch(MI.getOpcode()) {
10598+
default:
10599+
return false;
10600+
case PPC::COPY:
10601+
return TII->isSignExtended(MI);
10602+
case PPC::LHA:
10603+
case PPC::LHA8:
10604+
case PPC::LHAU:
10605+
case PPC::LHAU8:
10606+
case PPC::LHAUX:
10607+
case PPC::LHAUX8:
10608+
case PPC::LHAX:
10609+
case PPC::LHAX8:
10610+
case PPC::LWA:
10611+
case PPC::LWAUX:
10612+
case PPC::LWAX:
10613+
case PPC::LWAX_32:
10614+
case PPC::LWA_32:
10615+
case PPC::PLHA:
10616+
case PPC::PLHA8:
10617+
case PPC::PLHA8pc:
10618+
case PPC::PLHApc:
10619+
case PPC::PLWA:
10620+
case PPC::PLWA8:
10621+
case PPC::PLWA8pc:
10622+
case PPC::PLWApc:
10623+
case PPC::EXTSB:
10624+
case PPC::EXTSB8:
10625+
case PPC::EXTSB8_32_64:
10626+
case PPC::EXTSB8_rec:
10627+
case PPC::EXTSB_rec:
10628+
case PPC::EXTSH:
10629+
case PPC::EXTSH8:
10630+
case PPC::EXTSH8_32_64:
10631+
case PPC::EXTSH8_rec:
10632+
case PPC::EXTSH_rec:
10633+
case PPC::EXTSW:
10634+
case PPC::EXTSWSLI:
10635+
case PPC::EXTSWSLI_32_64:
10636+
case PPC::EXTSWSLI_32_64_rec:
10637+
case PPC::EXTSWSLI_rec:
10638+
case PPC::EXTSW_32:
10639+
case PPC::EXTSW_32_64:
10640+
case PPC::EXTSW_32_64_rec:
10641+
case PPC::EXTSW_rec:
10642+
case PPC::SRAW:
10643+
case PPC::SRAWI:
10644+
case PPC::SRAWI_rec:
10645+
case PPC::SRAW_rec:
10646+
return true;
10647+
}
10648+
return false;
10649+
}
10650+
1059610651
MachineBasicBlock *PPCTargetLowering::EmitPartwordAtomicBinary(
1059710652
MachineInstr &MI, MachineBasicBlock *BB,
1059810653
bool is8bit, // operation
1059910654
unsigned BinOpcode, unsigned CmpOpcode, unsigned CmpPred) const {
10655+
// This also handles ATOMIC_SWAP, indicated by BinOpcode==0.
10656+
const PPCInstrInfo *TII = Subtarget.getInstrInfo();
10657+
10658+
// If this is a signed comparison and the value being compared is not known
10659+
// to be sign extended, sign extend it here.
10660+
DebugLoc dl = MI.getDebugLoc();
10661+
MachineFunction *F = BB->getParent();
10662+
MachineRegisterInfo &RegInfo = F->getRegInfo();
10663+
Register incr = MI.getOperand(3).getReg();
10664+
bool IsSignExtended = Register::isVirtualRegister(incr) &&
10665+
isSignExtended(*RegInfo.getVRegDef(incr), TII);
10666+
10667+
if (CmpOpcode == PPC::CMPW && !IsSignExtended) {
10668+
Register ValueReg = RegInfo.createVirtualRegister(&PPC::GPRCRegClass);
10669+
BuildMI(*BB, MI, dl, TII->get(is8bit ? PPC::EXTSB : PPC::EXTSH), ValueReg)
10670+
.addReg(MI.getOperand(3).getReg());
10671+
MI.getOperand(3).setReg(ValueReg);
10672+
}
1060010673
// If we support part-word atomic mnemonics, just use them
1060110674
if (Subtarget.hasPartwordAtomics())
1060210675
return EmitAtomicBinary(MI, BB, is8bit ? 1 : 2, BinOpcode, CmpOpcode,
1060310676
CmpPred);
1060410677

10605-
// This also handles ATOMIC_SWAP, indicated by BinOpcode==0.
10606-
const TargetInstrInfo *TII = Subtarget.getInstrInfo();
1060710678
// In 64 bit mode we have to use 64 bits for addresses, even though the
1060810679
// lwarx/stwcx are 32 bits. With the 32-bit atomics we can use address
1060910680
// registers without caring whether they're 32 or 64, but here we're
@@ -10613,14 +10684,11 @@ MachineBasicBlock *PPCTargetLowering::EmitPartwordAtomicBinary(
1061310684
unsigned ZeroReg = is64bit ? PPC::ZERO8 : PPC::ZERO;
1061410685

1061510686
const BasicBlock *LLVM_BB = BB->getBasicBlock();
10616-
MachineFunction *F = BB->getParent();
1061710687
MachineFunction::iterator It = ++BB->getIterator();
1061810688

1061910689
Register dest = MI.getOperand(0).getReg();
1062010690
Register ptrA = MI.getOperand(1).getReg();
1062110691
Register ptrB = MI.getOperand(2).getReg();
10622-
Register incr = MI.getOperand(3).getReg();
10623-
DebugLoc dl = MI.getDebugLoc();
1062410692

1062510693
MachineBasicBlock *loopMBB = F->CreateMachineBasicBlock(LLVM_BB);
1062610694
MachineBasicBlock *loop2MBB =
@@ -10634,7 +10702,6 @@ MachineBasicBlock *PPCTargetLowering::EmitPartwordAtomicBinary(
1063410702
std::next(MachineBasicBlock::iterator(MI)), BB->end());
1063510703
exitMBB->transferSuccessorsAndUpdatePHIs(BB);
1063610704

10637-
MachineRegisterInfo &RegInfo = F->getRegInfo();
1063810705
const TargetRegisterClass *RC =
1063910706
is64bit ? &PPC::G8RCRegClass : &PPC::GPRCRegClass;
1064010707
const TargetRegisterClass *GPRC = &PPC::GPRCRegClass;

0 commit comments

Comments
 (0)