mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-14 15:19:33 +00:00
Nasty bug in ARMBaseInstrInfo::produceSameValue(). The MachineConstantPoolEntry
entries being compared may not be ARMConstantPoolValue. Without checking whether they are ARMConstantPoolValue first, and if the stars and moons are aligned properly, the equality test may return true (when the first few words of two Constants' values happen to be identical) and very bad things can happen. rdar://9125354 llvm-svn: 128203
This commit is contained in:
parent
3314c920a5
commit
1502266aba
@ -1080,11 +1080,18 @@ bool ARMBaseInstrInfo::produceSameValue(const MachineInstr *MI0,
|
||||
int CPI1 = MO1.getIndex();
|
||||
const MachineConstantPoolEntry &MCPE0 = MCP->getConstants()[CPI0];
|
||||
const MachineConstantPoolEntry &MCPE1 = MCP->getConstants()[CPI1];
|
||||
ARMConstantPoolValue *ACPV0 =
|
||||
static_cast<ARMConstantPoolValue*>(MCPE0.Val.MachineCPVal);
|
||||
ARMConstantPoolValue *ACPV1 =
|
||||
static_cast<ARMConstantPoolValue*>(MCPE1.Val.MachineCPVal);
|
||||
return ACPV0->hasSameValue(ACPV1);
|
||||
bool isARMCP0 = MCPE0.isMachineConstantPoolEntry();
|
||||
bool isARMCP1 = MCPE1.isMachineConstantPoolEntry();
|
||||
if (isARMCP0 && isARMCP1) {
|
||||
ARMConstantPoolValue *ACPV0 =
|
||||
static_cast<ARMConstantPoolValue*>(MCPE0.Val.MachineCPVal);
|
||||
ARMConstantPoolValue *ACPV1 =
|
||||
static_cast<ARMConstantPoolValue*>(MCPE1.Val.MachineCPVal);
|
||||
return ACPV0->hasSameValue(ACPV1);
|
||||
} else if (!isARMCP0 && !isARMCP1) {
|
||||
return MCPE0.Val.ConstVal == MCPE1.Val.ConstVal;
|
||||
}
|
||||
return false;
|
||||
} else if (Opcode == ARM::PICLDR) {
|
||||
if (MI1->getOpcode() != Opcode)
|
||||
return false;
|
||||
|
Loading…
Reference in New Issue
Block a user