Skip to content

Commit 229ab5a

Browse files
authored
[AArch64] Drop flags from BSP pseudos (llvm#151856)
This prevents cases where some of the operands match from hitting verifier errors with kill flags. These nodes should have been removed earlier in most cases. Fixes the direct issue from llvm#149380. llvm#151855 cleans up the codegen.
1 parent 7e8a251 commit 229ab5a

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

llvm/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1236,14 +1236,20 @@ bool AArch64ExpandPseudo::expandMI(MachineBasicBlock &MBB,
12361236
.add(MI.getOperand(3));
12371237
transferImpOps(MI, I, I);
12381238
} else {
1239+
unsigned RegState =
1240+
getRenamableRegState(MI.getOperand(1).isRenamable()) |
1241+
getKillRegState(
1242+
MI.getOperand(1).isKill() &&
1243+
MI.getOperand(1).getReg() != MI.getOperand(2).getReg() &&
1244+
MI.getOperand(1).getReg() != MI.getOperand(3).getReg());
12391245
BuildMI(MBB, MBBI, MI.getDebugLoc(),
12401246
TII->get(Opcode == AArch64::BSPv8i8 ? AArch64::ORRv8i8
12411247
: AArch64::ORRv16i8))
12421248
.addReg(DstReg,
12431249
RegState::Define |
12441250
getRenamableRegState(MI.getOperand(0).isRenamable()))
1245-
.add(MI.getOperand(1))
1246-
.add(MI.getOperand(1));
1251+
.addReg(MI.getOperand(1).getReg(), RegState)
1252+
.addReg(MI.getOperand(1).getReg(), RegState);
12471253
auto I2 =
12481254
BuildMI(MBB, MBBI, MI.getDebugLoc(),
12491255
TII->get(Opcode == AArch64::BSPv8i8 ? AArch64::BSLv8i8

llvm/test/CodeGen/AArch64/bsp_implicit_ops.mir

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,23 @@ body: |
9696
$q25 = ORRv16i8 $q3, killed $q3
9797
RET_ReallyLR implicit $q22
9898
...
99+
---
100+
name: DoubleOp
101+
tracksRegLiveness: true
102+
body: |
103+
bb.0.entry:
104+
liveins: $q2
105+
106+
; CHECK-LABEL: name: DoubleOp
107+
; CHECK: liveins: $q2
108+
; CHECK-NEXT: {{ $}}
109+
; CHECK-NEXT: renamable $q0 = MOVIv8i16 1, 0
110+
; CHECK-NEXT: renamable $q1 = ORRv16i8 renamable $q2, renamable $q2
111+
; CHECK-NEXT: renamable $q1 = BSLv16i8 killed renamable $q1, renamable $q2, renamable $q0
112+
; CHECK-NEXT: renamable $q0 = SQADDv8i16 killed renamable $q1, killed renamable $q0
113+
; CHECK-NEXT: RET undef $lr, implicit $q0
114+
renamable $q0 = MOVIv8i16 1, 0
115+
renamable $q1 = BSPv16i8 killed renamable $q2, renamable $q2, renamable $q0
116+
renamable $q0 = SQADDv8i16 killed renamable $q1, killed renamable $q0
117+
RET_ReallyLR implicit $q0
118+
...

0 commit comments

Comments
 (0)