mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-16 15:11:52 +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,
|
bool AArch64InstrInfo::analyzeCompare(const MachineInstr &MI, unsigned &SrcReg,
|
||||||
unsigned &SrcReg2, int &CmpMask,
|
unsigned &SrcReg2, int &CmpMask,
|
||||||
int &CmpValue) const {
|
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()) {
|
switch (MI.getOpcode()) {
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -167,6 +167,9 @@ AArch64RedundantCopyElimination::knownRegValInBlock(
|
|||||||
// CMP is an alias for SUBS with a dead destination register.
|
// CMP is an alias for SUBS with a dead destination register.
|
||||||
case AArch64::SUBSWri:
|
case AArch64::SUBSWri:
|
||||||
case AArch64::SUBSXri: {
|
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();
|
MCPhysReg SrcReg = PredI.getOperand(1).getReg();
|
||||||
|
|
||||||
// Must not be a symbolic immediate.
|
// Must not be a symbolic immediate.
|
||||||
|
Loading…
Reference in New Issue
Block a user