Skip to content

Commit 811b98b

Browse files
committed
[AArch64][CodeGen] Fix illegal register aliasing bug for mops instrs
A bug was found where mops instructions were being generated that aliased the source and size registers. This is unpredictable behaviour. This patch usess the earlyclobber constraint on the input source register so that it doesn't alias with the size register. Also a test is introduced which tests affected instructions can't violate this constraint. Change-Id: I34debad21fe8a5f6c33e159b43a1e13d092764a0
1 parent 76782e2 commit 811b98b

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

llvm/lib/Target/AArch64/AArch64InstrInfo.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9486,7 +9486,7 @@ let Predicates = [HasMOPS], Defs = [NZCV], Size = 12, mayStore = 1 in {
94869486
let mayLoad = 0 in {
94879487
def MOPSMemorySetPseudo : Pseudo<(outs GPR64common:$Rd_wb, GPR64:$Rn_wb),
94889488
(ins GPR64common:$Rd, GPR64:$Rn, GPR64:$Rm),
9489-
[], "$Rd = $Rd_wb,$Rn = $Rn_wb">, Sched<[]>;
9489+
[], "$Rd = $Rd_wb,$Rn = $Rn_wb,@earlyclobber $Rn_wb">, Sched<[]>;
94909490
}
94919491
}
94929492
let Predicates = [HasMOPS, HasMTE], Defs = [NZCV], Size = 12, mayLoad = 0, mayStore = 1 in {
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// RUN: not llvm-mc -triple aarch64 -mattr=+mops < %s 2>&1 | FileCheck %s
2+
3+
setp [x0]!, x1!, x1
4+
setm [x0]!, x1!, x1
5+
sete [x0]!, x1!, x1
6+
7+
// CHECK: error: invalid SET instruction, source and size registers are the same
8+
// CHECK-NEXT: setp [x0]!, x1!, x1
9+
// CHECK-NEXT: ^
10+
// CHECK-NEXT: error: invalid SET instruction, source and size registers are the same
11+
// CHECK-NEXT: setm [x0]!, x1!, x1
12+
// CHECK-NEXT: ^
13+
// CHECK-NEXT: error: invalid SET instruction, source and size registers are the same
14+
// CHECK-NEXT: sete [x0]!, x1!, x1
15+
// CHECK-NEXT: ^

0 commit comments

Comments
 (0)