mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-03 11:08:32 +00:00
Recommit r231324 with a fix to the ARM execution domain code
to disable lane switching if we don't actually have the instruction set we want to switch to. Models the earlier check above the conditional for the pass. The testcase is one that triggered with the assert that's added as part of the fix, use it to avoid adding a new testcase as it highlights the same problem. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231539 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
85ef565b6e
commit
5dc2251b4e
@ -4115,19 +4115,21 @@ enum ARMExeDomain {
|
||||
//
|
||||
std::pair<uint16_t, uint16_t>
|
||||
ARMBaseInstrInfo::getExecutionDomain(const MachineInstr *MI) const {
|
||||
// VMOVD, VMOVRS and VMOVSR are VFP instructions, but can be changed to NEON
|
||||
// if they are not predicated.
|
||||
if (MI->getOpcode() == ARM::VMOVD && !isPredicated(MI))
|
||||
return std::make_pair(ExeVFP, (1<<ExeVFP) | (1<<ExeNEON));
|
||||
|
||||
// CortexA9 is particularly picky about mixing the two and wants these
|
||||
// converted.
|
||||
if (Subtarget.isCortexA9() && !isPredicated(MI) &&
|
||||
(MI->getOpcode() == ARM::VMOVRS ||
|
||||
MI->getOpcode() == ARM::VMOVSR ||
|
||||
MI->getOpcode() == ARM::VMOVS))
|
||||
return std::make_pair(ExeVFP, (1<<ExeVFP) | (1<<ExeNEON));
|
||||
// If we don't have access to NEON instructions then we won't be able
|
||||
// to swizzle anything to the NEON domain. Check to make sure.
|
||||
if (Subtarget.hasNEON()) {
|
||||
// VMOVD, VMOVRS and VMOVSR are VFP instructions, but can be changed to NEON
|
||||
// if they are not predicated.
|
||||
if (MI->getOpcode() == ARM::VMOVD && !isPredicated(MI))
|
||||
return std::make_pair(ExeVFP, (1 << ExeVFP) | (1 << ExeNEON));
|
||||
|
||||
// CortexA9 is particularly picky about mixing the two and wants these
|
||||
// converted.
|
||||
if (Subtarget.isCortexA9() && !isPredicated(MI) &&
|
||||
(MI->getOpcode() == ARM::VMOVRS || MI->getOpcode() == ARM::VMOVSR ||
|
||||
MI->getOpcode() == ARM::VMOVS))
|
||||
return std::make_pair(ExeVFP, (1 << ExeVFP) | (1 << ExeNEON));
|
||||
}
|
||||
// No other instructions can be swizzled, so just determine their domain.
|
||||
unsigned Domain = MI->getDesc().TSFlags & ARMII::DomainMask;
|
||||
|
||||
@ -4220,6 +4222,9 @@ ARMBaseInstrInfo::setExecutionDomain(MachineInstr *MI, unsigned Domain) const {
|
||||
// Zap the predicate operands.
|
||||
assert(!isPredicated(MI) && "Cannot predicate a VORRd");
|
||||
|
||||
// Make sure we've got NEON instructions.
|
||||
assert(Subtarget.hasNEON() && "VORRd requires NEON");
|
||||
|
||||
// Source instruction is %DDst = VMOVD %DSrc, 14, %noreg (; implicits)
|
||||
DstReg = MI->getOperand(0).getReg();
|
||||
SrcReg = MI->getOperand(1).getReg();
|
||||
|
@ -358,9 +358,7 @@ void ARMPassConfig::addPreRegAlloc() {
|
||||
void ARMPassConfig::addPreSched2() {
|
||||
if (getOptLevel() != CodeGenOpt::None) {
|
||||
addPass(createARMLoadStoreOptimizationPass());
|
||||
|
||||
if (getARMSubtarget().hasNEON())
|
||||
addPass(createExecutionDependencyFixPass(&ARM::DPRRegClass));
|
||||
addPass(createExecutionDependencyFixPass(&ARM::DPRRegClass));
|
||||
}
|
||||
|
||||
// Expand some pseudo instructions into multiple instructions to allow
|
||||
|
@ -1,5 +1,9 @@
|
||||
; RUN: llc < %s -mtriple=arm-apple-ios -mattr=+v6,+vfp2 | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=arm-apple-ios -mattr=+v6,+vfp2 | FileCheck --check-prefix=DOMAIN %s
|
||||
|
||||
; The execution domain checking code would translate vmovs to vorr whether or not
|
||||
; we had NEON instructions. Verify we don't if we're not compiled with NEON.
|
||||
; DOMAIN-NOT: vorr
|
||||
@quant_coef = external global [6 x [4 x [4 x i32]]] ; <[6 x [4 x [4 x i32]]]*> [#uses=1]
|
||||
@dequant_coef = external global [6 x [4 x [4 x i32]]] ; <[6 x [4 x [4 x i32]]]*> [#uses=1]
|
||||
@A = external global [4 x [4 x i32]] ; <[4 x [4 x i32]]*> [#uses=1]
|
||||
|
Loading…
x
Reference in New Issue
Block a user