mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[GISel]: Remove redundant copies at the end of ISel
https://reviews.llvm.org/D42402 A lot of these copies are useless (copies b/w VRegs having the same regclass) and should be cleaned up. llvm-svn: 323291
This commit is contained in:
parent
d27dd1200a
commit
8339b2bebd
@ -159,6 +159,38 @@ bool InstructionSelect::runOnMachineFunction(MachineFunction &MF) {
|
||||
|
||||
const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
|
||||
|
||||
for (MachineBasicBlock &MBB : MF) {
|
||||
if (MBB.empty())
|
||||
continue;
|
||||
|
||||
// Try to find redundant copies b/w vregs of the same register class.
|
||||
bool ReachedBegin = false;
|
||||
for (auto MII = std::prev(MBB.end()), Begin = MBB.begin(); !ReachedBegin;) {
|
||||
// Select this instruction.
|
||||
MachineInstr &MI = *MII;
|
||||
|
||||
// And have our iterator point to the next instruction, if there is one.
|
||||
if (MII == Begin)
|
||||
ReachedBegin = true;
|
||||
else
|
||||
--MII;
|
||||
if (MI.getOpcode() != TargetOpcode::COPY)
|
||||
continue;
|
||||
unsigned SrcReg = MI.getOperand(1).getReg();
|
||||
unsigned DstReg = MI.getOperand(0).getReg();
|
||||
if (TargetRegisterInfo::isVirtualRegister(SrcReg) &&
|
||||
TargetRegisterInfo::isVirtualRegister(DstReg)) {
|
||||
MachineRegisterInfo &MRI = MF.getRegInfo();
|
||||
auto SrcRC = MRI.getRegClass(SrcReg);
|
||||
auto DstRC = MRI.getRegClass(DstReg);
|
||||
if (SrcRC == DstRC) {
|
||||
MRI.replaceRegWith(DstReg, SrcReg);
|
||||
MI.eraseFromParentAndMarkDBGValuesForRemoval();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Now that selection is complete, there are no more generic vregs. Verify
|
||||
// that the size of the now-constrained vreg is unchanged and that it has a
|
||||
// register class.
|
||||
|
@ -10,8 +10,7 @@ body: |
|
||||
|
||||
; CHECK-LABEL: name: bitcast_v2f32_to_s64
|
||||
; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY %x0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY [[COPY]]
|
||||
; CHECK: [[REV:%[0-9]+]]:fpr64 = REV64v2i32 [[COPY1]]
|
||||
; CHECK: [[REV:%[0-9]+]]:fpr64 = REV64v2i32 [[COPY]]
|
||||
; CHECK: %x0 = COPY [[REV]]
|
||||
%0:fpr(<2 x s32>) = COPY %x0
|
||||
%1:fpr(s64) = G_BITCAST %0
|
||||
|
@ -30,8 +30,7 @@ body: |
|
||||
|
||||
; CHECK-LABEL: name: bitcast_s32_gpr
|
||||
; CHECK: [[COPY:%[0-9]+]]:gpr32all = COPY %w0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:gpr32all = COPY [[COPY]]
|
||||
; CHECK: %w0 = COPY [[COPY1]]
|
||||
; CHECK: %w0 = COPY [[COPY]]
|
||||
%0(s32) = COPY %w0
|
||||
%1(s32) = G_BITCAST %0
|
||||
%w0 = COPY %1(s32)
|
||||
@ -52,8 +51,7 @@ body: |
|
||||
|
||||
; CHECK-LABEL: name: bitcast_s32_fpr
|
||||
; CHECK: [[COPY:%[0-9]+]]:fpr32 = COPY %s0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:fpr32 = COPY [[COPY]]
|
||||
; CHECK: %s0 = COPY [[COPY1]]
|
||||
; CHECK: %s0 = COPY [[COPY]]
|
||||
%0(s32) = COPY %s0
|
||||
%1(s32) = G_BITCAST %0
|
||||
%s0 = COPY %1(s32)
|
||||
@ -118,8 +116,7 @@ body: |
|
||||
|
||||
; CHECK-LABEL: name: bitcast_s64_gpr
|
||||
; CHECK: [[COPY:%[0-9]+]]:gpr64all = COPY %x0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:gpr64all = COPY [[COPY]]
|
||||
; CHECK: %x0 = COPY [[COPY1]]
|
||||
; CHECK: %x0 = COPY [[COPY]]
|
||||
%0(s64) = COPY %x0
|
||||
%1(s64) = G_BITCAST %0
|
||||
%x0 = COPY %1(s64)
|
||||
@ -140,8 +137,7 @@ body: |
|
||||
|
||||
; CHECK-LABEL: name: bitcast_s64_fpr
|
||||
; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY %d0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY [[COPY]]
|
||||
; CHECK: %d0 = COPY [[COPY1]]
|
||||
; CHECK: %d0 = COPY [[COPY]]
|
||||
%0(s64) = COPY %d0
|
||||
%1(s64) = G_BITCAST %0
|
||||
%d0 = COPY %1(s64)
|
||||
@ -205,8 +201,7 @@ body: |
|
||||
|
||||
; CHECK-LABEL: name: bitcast_s64_v2f32_fpr
|
||||
; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY %d0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY [[COPY]]
|
||||
; CHECK: %x0 = COPY [[COPY1]]
|
||||
; CHECK: %x0 = COPY [[COPY]]
|
||||
%0(s64) = COPY %d0
|
||||
%1(<2 x s32>) = G_BITCAST %0
|
||||
%x0 = COPY %1(<2 x s32>)
|
||||
@ -227,8 +222,7 @@ body: |
|
||||
|
||||
; CHECK-LABEL: name: bitcast_s64_v8i8_fpr
|
||||
; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY %d0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY [[COPY]]
|
||||
; CHECK: %x0 = COPY [[COPY1]]
|
||||
; CHECK: %x0 = COPY [[COPY]]
|
||||
%0(s64) = COPY %d0
|
||||
%1(<8 x s8>) = G_BITCAST %0
|
||||
%x0 = COPY %1(<8 x s8>)
|
||||
|
@ -37,7 +37,7 @@ registers:
|
||||
|
||||
# CHECK: body:
|
||||
# CHECK: bb.0:
|
||||
# CHECK: TBNZW %0, 0, %bb.1
|
||||
# CHECK: TBNZW %1, 0, %bb.1
|
||||
# CHECK: B %bb.0
|
||||
body: |
|
||||
bb.0:
|
||||
|
@ -34,8 +34,7 @@ body: |
|
||||
; CHECK-LABEL: name: anyext_s64_from_s32
|
||||
; CHECK: [[COPY:%[0-9]+]]:gpr32all = COPY %w0
|
||||
; CHECK: [[SUBREG_TO_REG:%[0-9]+]]:gpr64all = SUBREG_TO_REG 0, [[COPY]], %subreg.sub_32
|
||||
; CHECK: [[COPY1:%[0-9]+]]:gpr64all = COPY [[SUBREG_TO_REG]]
|
||||
; CHECK: %x0 = COPY [[COPY1]]
|
||||
; CHECK: %x0 = COPY [[SUBREG_TO_REG]]
|
||||
%0(s32) = COPY %w0
|
||||
%1(s64) = G_ANYEXT %0
|
||||
%x0 = COPY %1(s64)
|
||||
@ -56,8 +55,7 @@ body: |
|
||||
|
||||
; CHECK-LABEL: name: anyext_s32_from_s8
|
||||
; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY %w0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]
|
||||
; CHECK: [[COPY2:%[0-9]+]]:gpr32all = COPY [[COPY1]]
|
||||
; CHECK: [[COPY2:%[0-9]+]]:gpr32all = COPY [[COPY]]
|
||||
; CHECK: %w0 = COPY [[COPY2]]
|
||||
%2:gpr(s32) = COPY %w0
|
||||
%0(s8) = G_TRUNC %2
|
||||
@ -103,8 +101,7 @@ body: |
|
||||
|
||||
; CHECK-LABEL: name: zext_s32_from_s16
|
||||
; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY %w0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]
|
||||
; CHECK: [[UBFMWri:%[0-9]+]]:gpr32 = UBFMWri [[COPY1]], 0, 15
|
||||
; CHECK: [[UBFMWri:%[0-9]+]]:gpr32 = UBFMWri [[COPY]], 0, 15
|
||||
; CHECK: %w0 = COPY [[UBFMWri]]
|
||||
%2:gpr(s32) = COPY %w0
|
||||
%0(s16) = G_TRUNC %2
|
||||
@ -127,8 +124,7 @@ body: |
|
||||
|
||||
; CHECK-LABEL: name: zext_s32_from_s8
|
||||
; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY %w0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]
|
||||
; CHECK: [[UBFMWri:%[0-9]+]]:gpr32 = UBFMWri [[COPY1]], 0, 15
|
||||
; CHECK: [[UBFMWri:%[0-9]+]]:gpr32 = UBFMWri [[COPY]], 0, 15
|
||||
; CHECK: %w0 = COPY [[UBFMWri]]
|
||||
%2:gpr(s32) = COPY %w0
|
||||
%0(s16) = G_TRUNC %2
|
||||
@ -151,8 +147,7 @@ body: |
|
||||
|
||||
; CHECK-LABEL: name: zext_s16_from_s8
|
||||
; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY %w0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]
|
||||
; CHECK: [[UBFMWri:%[0-9]+]]:gpr32 = UBFMWri [[COPY1]], 0, 7
|
||||
; CHECK: [[UBFMWri:%[0-9]+]]:gpr32 = UBFMWri [[COPY]], 0, 7
|
||||
; CHECK: [[COPY2:%[0-9]+]]:gpr32all = COPY [[UBFMWri]]
|
||||
; CHECK: %w0 = COPY [[COPY2]]
|
||||
%2:gpr(s32) = COPY %w0
|
||||
@ -200,8 +195,7 @@ body: |
|
||||
|
||||
; CHECK-LABEL: name: sext_s32_from_s16
|
||||
; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY %w0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]
|
||||
; CHECK: [[SBFMWri:%[0-9]+]]:gpr32 = SBFMWri [[COPY1]], 0, 15
|
||||
; CHECK: [[SBFMWri:%[0-9]+]]:gpr32 = SBFMWri [[COPY]], 0, 15
|
||||
; CHECK: %w0 = COPY [[SBFMWri]]
|
||||
%2:gpr(s32) = COPY %w0
|
||||
%0(s16) = G_TRUNC %2
|
||||
@ -224,8 +218,7 @@ body: |
|
||||
|
||||
; CHECK-LABEL: name: sext_s32_from_s8
|
||||
; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY %w0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]
|
||||
; CHECK: [[SBFMWri:%[0-9]+]]:gpr32 = SBFMWri [[COPY1]], 0, 7
|
||||
; CHECK: [[SBFMWri:%[0-9]+]]:gpr32 = SBFMWri [[COPY]], 0, 7
|
||||
; CHECK: %w0 = COPY [[SBFMWri]]
|
||||
%2:gpr(s32) = COPY %w0
|
||||
%0(s8) = G_TRUNC %2
|
||||
@ -248,8 +241,7 @@ body: |
|
||||
|
||||
; CHECK-LABEL: name: sext_s16_from_s8
|
||||
; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY %w0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]
|
||||
; CHECK: [[SBFMWri:%[0-9]+]]:gpr32 = SBFMWri [[COPY1]], 0, 7
|
||||
; CHECK: [[SBFMWri:%[0-9]+]]:gpr32 = SBFMWri [[COPY]], 0, 7
|
||||
; CHECK: [[COPY2:%[0-9]+]]:gpr32all = COPY [[SBFMWri]]
|
||||
; CHECK: %w0 = COPY [[COPY2]]
|
||||
%2:gpr(s32) = COPY %w0
|
||||
|
@ -25,8 +25,7 @@ body: |
|
||||
liveins: %x0
|
||||
; CHECK-LABEL: name: inttoptr_p0_s64
|
||||
; CHECK: [[COPY:%[0-9]+]]:gpr64all = COPY %x0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:gpr64all = COPY [[COPY]]
|
||||
; CHECK: %x0 = COPY [[COPY1]]
|
||||
; CHECK: %x0 = COPY [[COPY]]
|
||||
%0(s64) = COPY %x0
|
||||
%1(p0) = G_INTTOPTR %0
|
||||
%x0 = COPY %1(p0)
|
||||
@ -45,8 +44,7 @@ body: |
|
||||
liveins: %x0
|
||||
; CHECK-LABEL: name: ptrtoint_s64_p0
|
||||
; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY %x0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY [[COPY]]
|
||||
; CHECK: %x0 = COPY [[COPY1]]
|
||||
; CHECK: %x0 = COPY [[COPY]]
|
||||
%0(p0) = COPY %x0
|
||||
%1(s64) = G_PTRTOINT %0
|
||||
%x0 = COPY %1(s64)
|
||||
|
@ -93,8 +93,7 @@ body: |
|
||||
; CHECK-LABEL: name: store_s16_gpr
|
||||
; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY %x0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY %w1
|
||||
; CHECK: [[COPY2:%[0-9]+]]:gpr32 = COPY [[COPY1]]
|
||||
; CHECK: STRHHui [[COPY2]], [[COPY]], 0 :: (store 2 into %ir.addr)
|
||||
; CHECK: STRHHui [[COPY1]], [[COPY]], 0 :: (store 2 into %ir.addr)
|
||||
%0(p0) = COPY %x0
|
||||
%2:gpr(s32) = COPY %w1
|
||||
%1(s16) = G_TRUNC %2
|
||||
@ -118,8 +117,7 @@ body: |
|
||||
; CHECK-LABEL: name: store_s8_gpr
|
||||
; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY %x0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY %w1
|
||||
; CHECK: [[COPY2:%[0-9]+]]:gpr32 = COPY [[COPY1]]
|
||||
; CHECK: STRBBui [[COPY2]], [[COPY]], 0 :: (store 1 into %ir.addr)
|
||||
; CHECK: STRBBui [[COPY1]], [[COPY]], 0 :: (store 1 into %ir.addr)
|
||||
%0(p0) = COPY %x0
|
||||
%2:gpr(s32) = COPY %w1
|
||||
%1(s8) = G_TRUNC %2
|
||||
@ -265,8 +263,7 @@ body: |
|
||||
; CHECK-LABEL: name: store_gep_64_s16_gpr
|
||||
; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY %x0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY %w1
|
||||
; CHECK: [[COPY2:%[0-9]+]]:gpr32 = COPY [[COPY1]]
|
||||
; CHECK: STRHHui [[COPY2]], [[COPY]], 32 :: (store 2 into %ir.addr)
|
||||
; CHECK: STRHHui [[COPY1]], [[COPY]], 32 :: (store 2 into %ir.addr)
|
||||
%0(p0) = COPY %x0
|
||||
%4:gpr(s32) = COPY %w1
|
||||
%1(s16) = G_TRUNC %4
|
||||
@ -293,8 +290,7 @@ body: |
|
||||
; CHECK-LABEL: name: store_gep_1_s8_gpr
|
||||
; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY %x0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY %w1
|
||||
; CHECK: [[COPY2:%[0-9]+]]:gpr32 = COPY [[COPY1]]
|
||||
; CHECK: STRBBui [[COPY2]], [[COPY]], 1 :: (store 1 into %ir.addr)
|
||||
; CHECK: STRBBui [[COPY1]], [[COPY]], 1 :: (store 1 into %ir.addr)
|
||||
%0(p0) = COPY %x0
|
||||
%4:gpr(s32) = COPY %w1
|
||||
%1(s8) = G_TRUNC %4
|
||||
|
@ -70,8 +70,7 @@ body: |
|
||||
|
||||
; CHECK-LABEL: name: trunc_s1_s32
|
||||
; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY %w0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]
|
||||
; CHECK: [[COPY2:%[0-9]+]]:gpr32all = COPY [[COPY1]]
|
||||
; CHECK: [[COPY2:%[0-9]+]]:gpr32all = COPY [[COPY]]
|
||||
; CHECK: %w0 = COPY [[COPY2]]
|
||||
%0(s32) = COPY %w0
|
||||
%1(s1) = G_TRUNC %0
|
||||
|
@ -304,11 +304,11 @@ registers:
|
||||
- { id: 9, class: gpr }
|
||||
|
||||
# CHECK: body:
|
||||
# CHECK: %wzr = ANDSWri %0, 0, implicit-def %nzcv
|
||||
# CHECK: %wzr = ANDSWri %10, 0, implicit-def %nzcv
|
||||
# CHECK: %3:gpr32 = CSELWr %1, %2, 1, implicit %nzcv
|
||||
# CHECK: %wzr = ANDSWri %0, 0, implicit-def %nzcv
|
||||
# CHECK: %wzr = ANDSWri %10, 0, implicit-def %nzcv
|
||||
# CHECK: %6:gpr64 = CSELXr %4, %5, 1, implicit %nzcv
|
||||
# CHECK: %wzr = ANDSWri %0, 0, implicit-def %nzcv
|
||||
# CHECK: %wzr = ANDSWri %10, 0, implicit-def %nzcv
|
||||
# CHECK: %9:gpr64 = CSELXr %7, %8, 1, implicit %nzcv
|
||||
body: |
|
||||
bb.0:
|
||||
|
@ -97,10 +97,9 @@ body: |
|
||||
; CHECK: [[VREG:%[0-9]+]]:gpr = COPY %r0
|
||||
|
||||
%1(s1) = G_TRUNC %0(s32)
|
||||
; CHECK: [[VREGTRUNC:%[0-9]+]]:gpr = COPY [[VREG]]
|
||||
|
||||
%2(s32) = G_ZEXT %1(s1)
|
||||
; CHECK: [[VREGEXT:%[0-9]+]]:gpr = ANDri [[VREGTRUNC]], 1, 14, %noreg, %noreg
|
||||
; CHECK: [[VREGEXT:%[0-9]+]]:gpr = ANDri [[VREG]], 1, 14, %noreg, %noreg
|
||||
|
||||
%r0 = COPY %2(s32)
|
||||
; CHECK: %r0 = COPY [[VREGEXT]]
|
||||
@ -127,10 +126,9 @@ body: |
|
||||
; CHECK: [[VREG:%[0-9]+]]:gpr = COPY %r0
|
||||
|
||||
%1(s1) = G_TRUNC %0(s32)
|
||||
; CHECK: [[VREGTRUNC:%[0-9]+]]:gpr = COPY [[VREG]]
|
||||
|
||||
%2(s32) = G_SEXT %1(s1)
|
||||
; CHECK: [[VREGAND:%[0-9]+]]:gpr = ANDri [[VREGTRUNC]], 1, 14, %noreg, %noreg
|
||||
; CHECK: [[VREGAND:%[0-9]+]]:gpr = ANDri [[VREG]], 1, 14, %noreg, %noreg
|
||||
; CHECK: [[VREGEXT:%[0-9]+]]:gpr = RSBri [[VREGAND]], 0, 14, %noreg, %noreg
|
||||
|
||||
%r0 = COPY %2(s32)
|
||||
@ -218,13 +216,11 @@ body: |
|
||||
; CHECK: [[VREG:%[0-9]+]]:gpr = COPY %r0
|
||||
|
||||
%1(s8) = G_TRUNC %0(s32)
|
||||
; CHECK: [[VREGTRUNC:%[0-9]+]]:gpr = COPY [[VREG]]
|
||||
|
||||
%2(s32) = G_ANYEXT %1(s8)
|
||||
; CHECK: [[VREGEXT:%[0-9]+]]:gpr = COPY [[VREGTRUNC]]
|
||||
|
||||
%r0 = COPY %2(s32)
|
||||
; CHECK: %r0 = COPY [[VREGEXT]]
|
||||
; CHECK: %r0 = COPY [[VREG]]
|
||||
|
||||
BX_RET 14, %noreg, implicit %r0
|
||||
; CHECK: BX_RET 14, %noreg, implicit %r0
|
||||
@ -248,13 +244,11 @@ body: |
|
||||
; CHECK: [[VREG:%[0-9]+]]:gpr = COPY %r0
|
||||
|
||||
%1(s16) = G_TRUNC %0(s32)
|
||||
; CHECK: [[VREGTRUNC:%[0-9]+]]:gpr = COPY [[VREG]]
|
||||
|
||||
%2(s32) = G_ANYEXT %1(s16)
|
||||
; CHECK: [[VREGEXT:%[0-9]+]]:gpr = COPY [[VREGTRUNC]]
|
||||
|
||||
%r0 = COPY %2(s32)
|
||||
; CHECK: %r0 = COPY [[VREGEXT]]
|
||||
; CHECK: %r0 = COPY [[VREG]]
|
||||
|
||||
BX_RET 14, %noreg, implicit %r0
|
||||
; CHECK: BX_RET 14, %noreg, implicit %r0
|
||||
@ -1220,7 +1214,7 @@ body: |
|
||||
; CHECK: STRBi12 %[[I8]], %[[P]], 0, 14, %noreg
|
||||
|
||||
G_STORE %2(s16), %0(p0) :: (store 2)
|
||||
; CHECK: STRH %[[I16]], %[[P]], %noreg, 0, 14, %noreg
|
||||
; CHECK: STRH %[[I32]], %[[P]], %noreg, 0, 14, %noreg
|
||||
|
||||
G_STORE %3(s32), %0(p0) :: (store 4)
|
||||
; CHECK: STRi12 %[[I32]], %[[P]], 0, 14, %noreg
|
||||
@ -1348,10 +1342,9 @@ body: |
|
||||
%0(s32) = COPY %r0
|
||||
%1(p0) = G_INTTOPTR %0(s32)
|
||||
; CHECK: [[INT:%[0-9]+]]:gpr = COPY %r0
|
||||
; CHECK: [[PTR:%[0-9]+]]:gpr = COPY [[INT]]
|
||||
|
||||
%r0 = COPY %1(p0)
|
||||
; CHECK: %r0 = COPY [[PTR]]
|
||||
; CHECK: %r0 = COPY [[INT]]
|
||||
|
||||
BX_RET 14, %noreg, implicit %r0
|
||||
...
|
||||
@ -1372,10 +1365,9 @@ body: |
|
||||
%0(p0) = COPY %r0
|
||||
%1(s32) = G_PTRTOINT %0(p0)
|
||||
; CHECK: [[PTR:%[0-9]+]]:gpr = COPY %r0
|
||||
; CHECK: [[INT:%[0-9]+]]:gpr = COPY [[PTR]]
|
||||
|
||||
%r0 = COPY %1(s32)
|
||||
; CHECK: %r0 = COPY [[INT]]
|
||||
; CHECK: %r0 = COPY [[PTR]]
|
||||
|
||||
BX_RET 14, %noreg, implicit %r0
|
||||
...
|
||||
@ -1402,10 +1394,9 @@ body: |
|
||||
; CHECK: [[VREGY:%[0-9]+]]:gpr = COPY %r1
|
||||
|
||||
%2(s1) = G_TRUNC %1(s32)
|
||||
; CHECK: [[VREGC:%[0-9]+]]:gpr = COPY [[VREGY]]
|
||||
|
||||
%3(s32) = G_SELECT %2(s1), %0, %1
|
||||
; CHECK: CMPri [[VREGC]], 0, 14, %noreg, implicit-def %cpsr
|
||||
; CHECK: CMPri [[VREGY]], 0, 14, %noreg, implicit-def %cpsr
|
||||
; CHECK: [[RES:%[0-9]+]]:gpr = MOVCCr [[VREGX]], [[VREGY]], 0, %cpsr
|
||||
|
||||
%r0 = COPY %3(s32)
|
||||
@ -1441,10 +1432,9 @@ body: |
|
||||
; CHECK: [[VREGC:%[0-9]+]]:gpr = COPY %r2
|
||||
|
||||
%3(s1) = G_TRUNC %2(s32)
|
||||
; CHECK: [[VREGD:%[0-9]+]]:gpr = COPY [[VREGC]]
|
||||
|
||||
%4(p0) = G_SELECT %3(s1), %0, %1
|
||||
; CHECK: CMPri [[VREGD]], 0, 14, %noreg, implicit-def %cpsr
|
||||
; CHECK: CMPri [[VREGC]], 0, 14, %noreg, implicit-def %cpsr
|
||||
; CHECK: [[RES:%[0-9]+]]:gpr = MOVCCr [[VREGX]], [[VREGY]], 0, %cpsr
|
||||
|
||||
%r0 = COPY %4(p0)
|
||||
@ -1472,10 +1462,9 @@ body: |
|
||||
%0(s32) = COPY %r0
|
||||
; CHECK: [[COND32:%[0-9]+]]:gpr = COPY %r0
|
||||
%1(s1) = G_TRUNC %0(s32)
|
||||
; CHECK: [[COND:%[0-9]+]]:gpr = COPY [[COND32]]
|
||||
|
||||
G_BRCOND %1(s1), %bb.1
|
||||
; CHECK: TSTri [[COND]], 1, 14, %noreg, implicit-def %cpsr
|
||||
; CHECK: TSTri [[COND32]], 1, 14, %noreg, implicit-def %cpsr
|
||||
; CHECK: Bcc %bb.1, 1, %cpsr
|
||||
G_BR %bb.2
|
||||
; CHECK: B %bb.2
|
||||
|
@ -38,8 +38,7 @@ body: |
|
||||
|
||||
; ALL-LABEL: name: test_zext_i1
|
||||
; ALL: [[COPY:%[0-9]+]]:gr8 = COPY %dil
|
||||
; ALL: [[COPY1:%[0-9]+]]:gr8 = COPY [[COPY]]
|
||||
; ALL: [[SUBREG_TO_REG:%[0-9]+]]:gr64 = SUBREG_TO_REG 0, [[COPY1]], %subreg.sub_8bit
|
||||
; ALL: [[SUBREG_TO_REG:%[0-9]+]]:gr64 = SUBREG_TO_REG 0, [[COPY]], %subreg.sub_8bit
|
||||
; ALL: [[AND64ri8_:%[0-9]+]]:gr64 = AND64ri8 [[SUBREG_TO_REG]], 1, implicit-def %eflags
|
||||
; ALL: %rax = COPY [[AND64ri8_]]
|
||||
; ALL: RET 0, implicit %rax
|
||||
|
@ -285,8 +285,7 @@ registers:
|
||||
# X32: %0:gr32_abcd = COPY %edi
|
||||
# X64: %0:gr32 = COPY %edi
|
||||
# ALL-NEXT: %1:gr8 = COPY %0.sub_8bit
|
||||
# ALL-NEXT: %2:gr8 = COPY %1
|
||||
# ALL-NEXT: %al = COPY %2
|
||||
# ALL-NEXT: %al = COPY %1
|
||||
# ALL-NEXT: RET 0, implicit %al
|
||||
body: |
|
||||
bb.1 (%ir-block.0):
|
||||
|
@ -24,15 +24,13 @@ body: |
|
||||
; AVX: [[DEF:%[0-9]+]]:vr128 = IMPLICIT_DEF
|
||||
; AVX: undef %2.sub_xmm:vr256 = COPY [[DEF]]
|
||||
; AVX: [[VINSERTF128rr:%[0-9]+]]:vr256 = VINSERTF128rr %2, [[DEF]], 1
|
||||
; AVX: [[COPY:%[0-9]+]]:vr256 = COPY [[VINSERTF128rr]]
|
||||
; AVX: %ymm0 = COPY [[COPY]]
|
||||
; AVX: %ymm0 = COPY [[VINSERTF128rr]]
|
||||
; AVX: RET 0, implicit %ymm0
|
||||
; AVX512VL-LABEL: name: test_merge
|
||||
; AVX512VL: [[DEF:%[0-9]+]]:vr128x = IMPLICIT_DEF
|
||||
; AVX512VL: undef %2.sub_xmm:vr256x = COPY [[DEF]]
|
||||
; AVX512VL: [[VINSERTF32x4Z256rr:%[0-9]+]]:vr256x = VINSERTF32x4Z256rr %2, [[DEF]], 1
|
||||
; AVX512VL: [[COPY:%[0-9]+]]:vr256x = COPY [[VINSERTF32x4Z256rr]]
|
||||
; AVX512VL: %ymm0 = COPY [[COPY]]
|
||||
; AVX512VL: %ymm0 = COPY [[VINSERTF32x4Z256rr]]
|
||||
; AVX512VL: RET 0, implicit %ymm0
|
||||
%0(<4 x s32>) = IMPLICIT_DEF
|
||||
%1(<8 x s32>) = G_MERGE_VALUES %0(<4 x s32>), %0(<4 x s32>)
|
||||
|
@ -27,8 +27,7 @@ body: |
|
||||
; ALL: [[VINSERTF32x4Zrr:%[0-9]+]]:vr512 = VINSERTF32x4Zrr %2, [[DEF]], 1
|
||||
; ALL: [[VINSERTF32x4Zrr1:%[0-9]+]]:vr512 = VINSERTF32x4Zrr [[VINSERTF32x4Zrr]], [[DEF]], 2
|
||||
; ALL: [[VINSERTF32x4Zrr2:%[0-9]+]]:vr512 = VINSERTF32x4Zrr [[VINSERTF32x4Zrr1]], [[DEF]], 3
|
||||
; ALL: [[COPY:%[0-9]+]]:vr512 = COPY [[VINSERTF32x4Zrr2]]
|
||||
; ALL: %zmm0 = COPY [[COPY]]
|
||||
; ALL: %zmm0 = COPY [[VINSERTF32x4Zrr2]]
|
||||
; ALL: RET 0, implicit %zmm0
|
||||
%0(<4 x s32>) = IMPLICIT_DEF
|
||||
%1(<16 x s32>) = G_MERGE_VALUES %0(<4 x s32>), %0(<4 x s32>), %0(<4 x s32>), %0(<4 x s32>)
|
||||
@ -51,8 +50,7 @@ body: |
|
||||
; ALL: [[DEF:%[0-9]+]]:vr256x = IMPLICIT_DEF
|
||||
; ALL: undef %2.sub_ymm:vr512 = COPY [[DEF]]
|
||||
; ALL: [[VINSERTF64x4Zrr:%[0-9]+]]:vr512 = VINSERTF64x4Zrr %2, [[DEF]], 1
|
||||
; ALL: [[COPY:%[0-9]+]]:vr512 = COPY [[VINSERTF64x4Zrr]]
|
||||
; ALL: %zmm0 = COPY [[COPY]]
|
||||
; ALL: %zmm0 = COPY [[VINSERTF64x4Zrr]]
|
||||
; ALL: RET 0, implicit %zmm0
|
||||
%0(<8 x s32>) = IMPLICIT_DEF
|
||||
%1(<16 x s32>) = G_MERGE_VALUES %0(<8 x s32>), %0(<8 x s32>)
|
||||
|
@ -48,8 +48,7 @@ body: |
|
||||
; CHECK-LABEL: name: trunc_i32toi1
|
||||
; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY %edi
|
||||
; CHECK: [[COPY1:%[0-9]+]]:gr8 = COPY [[COPY]].sub_8bit
|
||||
; CHECK: [[COPY2:%[0-9]+]]:gr8 = COPY [[COPY1]]
|
||||
; CHECK: %al = COPY [[COPY2]]
|
||||
; CHECK: %al = COPY [[COPY1]]
|
||||
; CHECK: RET 0, implicit %al
|
||||
%0(s32) = COPY %edi
|
||||
%1(s1) = G_TRUNC %0(s32)
|
||||
|
Loading…
Reference in New Issue
Block a user