Skip to content

Commit c66db23

Browse files
krasimirggyuxuanchen1997
authored andcommitted
Revert "[AArch64] Remove superfluous sxtw in peephole opt (#96293)"
Summary: This reverts commit 7f2a5df. It appears that after this, llc segfaults on the following code: ``` target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32" target triple = "aarch64--linux-eabi" define i32 @f(i32 %0) { entry: %1 = sext i32 %0 to i64 br label %A A: %2 = trunc i64 %1 to i32 %a69.us = sub i32 0, %2 %a69.us.fr = freeze i32 %a69.us %3 = zext i32 %a69.us.fr to i64 br label %B B: %t = icmp eq i64 0, %3 br i1 %t, label %A, label %B } ``` assert.h assertion failed at .../llvm/lib/CodeGen/LiveVariables.cpp:159 in void llvm::LiveVariables::HandleVirtRegUse(Register, MachineBasicBlock *, MachineInstr &): MRI->getVRegDef(Reg) && "Register use before def!" Test Plan: Reviewers: Subscribers: Tasks: Tags: Differential Revision: https://phabricator.intern.facebook.com/D60250934
1 parent 35d034d commit c66db23

File tree

3 files changed

+8
-82
lines changed

3 files changed

+8
-82
lines changed

llvm/lib/Target/AArch64/AArch64MIPeepholeOpt.cpp

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ struct AArch64MIPeepholeOpt : public MachineFunctionPass {
128128
bool visitINSviGPR(MachineInstr &MI, unsigned Opc);
129129
bool visitINSvi64lane(MachineInstr &MI);
130130
bool visitFMOVDr(MachineInstr &MI);
131-
bool visitCopy(MachineInstr &MI);
132131
bool runOnMachineFunction(MachineFunction &MF) override;
133132

134133
StringRef getPassName() const override {
@@ -691,34 +690,6 @@ bool AArch64MIPeepholeOpt::visitFMOVDr(MachineInstr &MI) {
691690
return true;
692691
}
693692

694-
// Across a basic-block we might have in i32 extract from a value that only
695-
// operates on upper bits (for example a sxtw). We can replace the COPY with a
696-
// new version skipping the sxtw.
697-
bool AArch64MIPeepholeOpt::visitCopy(MachineInstr &MI) {
698-
Register InputReg = MI.getOperand(1).getReg();
699-
if (MI.getOperand(1).getSubReg() != AArch64::sub_32 ||
700-
!MRI->hasOneNonDBGUse(InputReg))
701-
return false;
702-
703-
MachineInstr *SrcMI = MRI->getUniqueVRegDef(InputReg);
704-
MachineInstr *CopyMI = SrcMI;
705-
while (SrcMI && SrcMI->isFullCopy() &&
706-
MRI->hasOneNonDBGUse(SrcMI->getOperand(1).getReg()))
707-
SrcMI = MRI->getUniqueVRegDef(SrcMI->getOperand(1).getReg());
708-
709-
if (!SrcMI || SrcMI->getOpcode() != AArch64::SBFMXri ||
710-
SrcMI->getOperand(2).getImm() != 0 || SrcMI->getOperand(3).getImm() != 31)
711-
return false;
712-
713-
Register SrcReg = SrcMI->getOperand(1).getReg();
714-
MRI->constrainRegClass(SrcReg, MRI->getRegClass(InputReg));
715-
MI.getOperand(1).setReg(SrcReg);
716-
if (CopyMI != SrcMI)
717-
CopyMI->eraseFromParent();
718-
SrcMI->eraseFromParent();
719-
return true;
720-
}
721-
722693
bool AArch64MIPeepholeOpt::runOnMachineFunction(MachineFunction &MF) {
723694
if (skipFunction(MF.getFunction()))
724695
return false;
@@ -800,9 +771,6 @@ bool AArch64MIPeepholeOpt::runOnMachineFunction(MachineFunction &MF) {
800771
case AArch64::FMOVDr:
801772
Changed |= visitFMOVDr(MI);
802773
break;
803-
case AArch64::COPY:
804-
Changed |= visitCopy(MI);
805-
break;
806774
}
807775
}
808776
}

llvm/lib/Target/AArch64/peephole-sxtw.mir

Lines changed: 0 additions & 46 deletions
This file was deleted.

llvm/test/CodeGen/AArch64/aarch64-mull-masks.ll

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,8 @@ define i64 @smull_ldrsw_shift(ptr %x0, i64 %x1) {
281281
; CHECK-LABEL: smull_ldrsw_shift:
282282
; CHECK: // %bb.0: // %entry
283283
; CHECK-NEXT: ldrsw x8, [x0]
284-
; CHECK-NEXT: smull x0, w8, w1
284+
; CHECK-NEXT: sxtw x9, w1
285+
; CHECK-NEXT: smull x0, w8, w9
285286
; CHECK-NEXT: ret
286287
entry:
287288
%ext64 = load i32, ptr %x0
@@ -489,7 +490,8 @@ define i64 @smaddl_ldrsw_shift(ptr %x0, i64 %x1, i64 %x2) {
489490
; CHECK-LABEL: smaddl_ldrsw_shift:
490491
; CHECK: // %bb.0: // %entry
491492
; CHECK-NEXT: ldrsw x8, [x0]
492-
; CHECK-NEXT: smaddl x0, w8, w1, x2
493+
; CHECK-NEXT: sxtw x9, w1
494+
; CHECK-NEXT: smaddl x0, w8, w9, x2
493495
; CHECK-NEXT: ret
494496
entry:
495497
%ext64 = load i32, ptr %x0
@@ -652,7 +654,8 @@ define i64 @smnegl_ldrsw_shift(ptr %x0, i64 %x1) {
652654
; CHECK-LABEL: smnegl_ldrsw_shift:
653655
; CHECK: // %bb.0: // %entry
654656
; CHECK-NEXT: ldrsw x8, [x0]
655-
; CHECK-NEXT: smnegl x0, w8, w1
657+
; CHECK-NEXT: sxtw x9, w1
658+
; CHECK-NEXT: smnegl x0, w8, w9
656659
; CHECK-NEXT: ret
657660
entry:
658661
%ext64 = load i32, ptr %x0
@@ -815,7 +818,8 @@ define i64 @smsubl_ldrsw_shift(ptr %x0, i64 %x1, i64 %x2) {
815818
; CHECK-LABEL: smsubl_ldrsw_shift:
816819
; CHECK: // %bb.0: // %entry
817820
; CHECK-NEXT: ldrsw x8, [x0]
818-
; CHECK-NEXT: smsubl x0, w8, w1, x2
821+
; CHECK-NEXT: sxtw x9, w1
822+
; CHECK-NEXT: smsubl x0, w8, w9, x2
819823
; CHECK-NEXT: ret
820824
entry:
821825
%ext64 = load i32, ptr %x0

0 commit comments

Comments
 (0)