mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-28 11:57:28 +00:00
Pull in r316035 from upstream llvm trunk (by Tim Northover):
AArch64: account for possible frame index operand in compares. If the address of a local is used in a comparison, AArch64 can fold the address-calculation into the comparison via "adds". Unfortunately, a couple of places (both hit in this one test) are not ready to deal with that yet and just assume the first source operand is a register. This should fix an assertion failure while building the test suite of www/firefox for AArch64. PR: 223048 MFC after: 3 days
This commit is contained in:
parent
fc203cd43e
commit
738eacb46b
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=324826
@ -940,6 +940,12 @@ bool AArch64InstrInfo::areMemAccessesTriviallyDisjoint(
|
||||
bool AArch64InstrInfo::analyzeCompare(const MachineInstr &MI, unsigned &SrcReg,
|
||||
unsigned &SrcReg2, int &CmpMask,
|
||||
int &CmpValue) const {
|
||||
// The first operand can be a frame index where we'd normally expect a
|
||||
// register.
|
||||
assert(MI.getNumOperands() >= 2 && "All AArch64 cmps should have 2 operands");
|
||||
if (!MI.getOperand(1).isReg())
|
||||
return false;
|
||||
|
||||
switch (MI.getOpcode()) {
|
||||
default:
|
||||
break;
|
||||
|
@ -167,6 +167,9 @@ AArch64RedundantCopyElimination::knownRegValInBlock(
|
||||
// CMP is an alias for SUBS with a dead destination register.
|
||||
case AArch64::SUBSWri:
|
||||
case AArch64::SUBSXri: {
|
||||
// Sometimes the first operand is a FrameIndex. Bail if tht happens.
|
||||
if (!PredI.getOperand(1).isReg())
|
||||
return None;
|
||||
MCPhysReg SrcReg = PredI.getOperand(1).getReg();
|
||||
|
||||
// Must not be a symbolic immediate.
|
||||
|
Loading…
Reference in New Issue
Block a user