Skip to content

Commit 0a6887f

Browse files
committed
Pre-commit test (NFC)
1 parent a4e7d15 commit 0a6887f

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mtriple=aarch64 -mattr=+sve2 -verify-machineinstrs -stop-after=finalize-isel %s -o - | FileCheck %s
3+
4+
; Regression test for a bug where getTargetConstant(0) was used instead of
5+
; getConstant(0) in ScalarizeVecRes_LOOP_DEPENDENCE_MASK, causing instruction
6+
; selection to incorrectly generate CCMPXr (register form) with an immediate
7+
; operand instead of CCMPXi (immediate form).
8+
;
9+
; Before the fix, this produced invalid machine code that failed verification:
10+
; CCMPXr %2:gpr64common, 0, 4, 13, ...
11+
; ^ literal immediate in register operand slot
12+
;
13+
; Error: "*** Bad machine code: Expected a register operand. ***"
14+
;
15+
; After the fix, it correctly produces:
16+
; CCMPXi %2:gpr64common, 0, 4, 13, ...
17+
;
18+
; This test verifies that CCMPXi (immediate form) is selected, not CCMPXr.
19+
; Assembly output would look identical for both, so we must check machine IR.
20+
21+
define <1 x i1> @test_war_mask_ccmp(ptr %a, ptr %b) {
22+
; CHECK-LABEL: name: test_war_mask_ccmp
23+
; CHECK: bb.0.entry:
24+
; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
25+
; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
26+
; CHECK: [[SUBSXrr:%[0-9]+]]:gpr64common = SUBSXrr [[COPY1]], [[COPY]], implicit-def dead $nzcv
27+
; CHECK: [[SUBSXri:%[0-9]+]]:gpr64 = SUBSXri [[SUBSXrr]], 0, 0, implicit-def $nzcv
28+
; CHECK: CCMPXi [[SUBSXrr]], 0, 4, 13, implicit-def $nzcv, implicit $nzcv
29+
; CHECK: [[CSINCWr:%[0-9]+]]:gpr32 = CSINCWr $wzr, $wzr, 1, implicit $nzcv
30+
; CHECK: $w0 = COPY [[CSINCWr]]
31+
; CHECK: RET_ReallyLR implicit $w0
32+
entry:
33+
%0 = call <1 x i1> @llvm.loop.dependence.war.mask.v1i1(ptr %a, ptr %b, i64 1)
34+
ret <1 x i1> %0
35+
}
36+
37+
define <1 x i1> @test_raw_mask_ccmp(ptr %a, ptr %b) {
38+
; CHECK-LABEL: name: test_raw_mask_ccmp
39+
; CHECK: bb.0.entry:
40+
; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
41+
; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
42+
; CHECK: [[SUBSXrr:%[0-9]+]]:gpr64common = SUBSXrr [[COPY1]], [[COPY]], implicit-def dead $nzcv
43+
; CHECK: [[SUBSXri:%[0-9]+]]:gpr64 = SUBSXri [[SUBSXrr]], 0, 0, implicit-def $nzcv
44+
; CHECK: CCMPXi [[SUBSXrr]], 0, 4, 13, implicit-def $nzcv, implicit $nzcv
45+
; CHECK: [[CSINCWr:%[0-9]+]]:gpr32 = CSINCWr $wzr, $wzr, 1, implicit $nzcv
46+
; CHECK: $w0 = COPY [[CSINCWr]]
47+
; CHECK: RET_ReallyLR implicit $w0
48+
entry:
49+
%0 = call <1 x i1> @llvm.loop.dependence.raw.mask.v1i1(ptr %a, ptr %b, i64 1)
50+
ret <1 x i1> %0
51+
}
52+
53+
declare <1 x i1> @llvm.loop.dependence.war.mask.v1i1(ptr, ptr, i64)
54+
declare <1 x i1> @llvm.loop.dependence.raw.mask.v1i1(ptr, ptr, i64)
55+

0 commit comments

Comments
 (0)