1313
1414@discvar = dso_local global i64 0
1515
16- ; Make sure the components of blend(addr, imm) are recognized and passed to
17- ; PAC pseudo via separate operands to prevent substitution of the immediate
18- ; modifier.
16+ ; Make sure the components of blend(addr, imm) and integer constants are
17+ ; recognized and passed to PAC pseudo via separate operands to prevent
18+ ; substitution of the immediate modifier.
1919;
2020; MIR output of the instruction selector is inspected, as it is hard to reliably
2121; distinguish MOVKXi immediately followed by a pseudo from a standalone pseudo
2222; instruction carrying address and immediate modifiers in its separate operands
2323; by only observing the final asm output.
2424
25- define i64 @small_imm_disc (i64 %addr ) {
26- ; DAGISEL-LABEL: name: small_imm_disc
25+ define i64 @small_imm_disc_optimized (i64 %addr ) {
26+ ; DAGISEL-LABEL: name: small_imm_disc_optimized
2727 ; DAGISEL: bb.0.entry:
2828 ; DAGISEL-NEXT: liveins: $x0
2929 ; DAGISEL-NEXT: {{ $}}
@@ -34,7 +34,7 @@ define i64 @small_imm_disc(i64 %addr) {
3434 ; DAGISEL-NEXT: $x0 = COPY [[PAC]]
3535 ; DAGISEL-NEXT: RET_ReallyLR implicit $x0
3636 ;
37- ; GISEL-LABEL: name: small_imm_disc
37+ ; GISEL-LABEL: name: small_imm_disc_optimized
3838 ; GISEL: bb.1.entry:
3939 ; GISEL-NEXT: liveins: $x0
4040 ; GISEL-NEXT: {{ $}}
@@ -49,6 +49,35 @@ entry:
4949 ret i64 %signed
5050}
5151
52+ ; Without optimization, MOVi64imm may be used for small i64 constants as well.
53+ define i64 @small_imm_disc_non_optimized (i64 %addr ) noinline optnone {
54+ ; DAGISEL-LABEL: name: small_imm_disc_non_optimized
55+ ; DAGISEL: bb.0.entry:
56+ ; DAGISEL-NEXT: liveins: $x0
57+ ; DAGISEL-NEXT: {{ $}}
58+ ; DAGISEL-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
59+ ; DAGISEL-NEXT: [[COPY1:%[0-9]+]]:gpr64 = COPY killed [[COPY]]
60+ ; DAGISEL-NEXT: [[MOVi32imm:%[0-9]+]]:gpr32 = MOVi32imm 42
61+ ; DAGISEL-NEXT: [[SUBREG_TO_REG:%[0-9]+]]:gpr64noip = SUBREG_TO_REG 0, killed [[MOVi32imm]], %subreg.sub_32
62+ ; DAGISEL-NEXT: [[PAC:%[0-9]+]]:gpr64 = PAC [[COPY1]], 2, 42, killed $noreg, implicit-def dead $x17
63+ ; DAGISEL-NEXT: [[COPY2:%[0-9]+]]:gpr64all = COPY [[PAC]]
64+ ; DAGISEL-NEXT: $x0 = COPY [[COPY2]]
65+ ; DAGISEL-NEXT: RET_ReallyLR implicit $x0
66+ ;
67+ ; GISEL-LABEL: name: small_imm_disc_non_optimized
68+ ; GISEL: bb.1.entry:
69+ ; GISEL-NEXT: liveins: $x0
70+ ; GISEL-NEXT: {{ $}}
71+ ; GISEL-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
72+ ; GISEL-NEXT: [[MOVi64imm:%[0-9]+]]:gpr64noip = MOVi64imm 42
73+ ; GISEL-NEXT: [[PAC:%[0-9]+]]:gpr64 = PAC [[COPY]], 2, 42, $noreg, implicit-def dead $x17
74+ ; GISEL-NEXT: $x0 = COPY [[PAC]]
75+ ; GISEL-NEXT: RET_ReallyLR implicit $x0
76+ entry:
77+ %signed = call i64 @llvm.ptrauth.sign (i64 %addr , i32 2 , i64 42 )
78+ ret i64 %signed
79+ }
80+
5281define i64 @large_imm_disc_wreg (i64 %addr ) {
5382 ; DAGISEL-LABEL: name: large_imm_disc_wreg
5483 ; DAGISEL: bb.0.entry:
@@ -101,6 +130,41 @@ entry:
101130 ret i64 %signed
102131}
103132
133+ ; Make sure blend() is lowered as expected when optimization is disabled.
134+ define i64 @blended_disc_non_optimized (i64 %addr , i64 %addrdisc ) noinline optnone {
135+ ; DAGISEL-LABEL: name: blended_disc_non_optimized
136+ ; DAGISEL: bb.0.entry:
137+ ; DAGISEL-NEXT: liveins: $x0, $x1
138+ ; DAGISEL-NEXT: {{ $}}
139+ ; DAGISEL-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY $x1
140+ ; DAGISEL-NEXT: [[COPY1:%[0-9]+]]:gpr64 = COPY $x0
141+ ; DAGISEL-NEXT: [[COPY2:%[0-9]+]]:gpr64 = COPY killed [[COPY1]]
142+ ; DAGISEL-NEXT: [[COPY3:%[0-9]+]]:gpr64 = COPY killed [[COPY]]
143+ ; DAGISEL-NEXT: [[MOVKXi:%[0-9]+]]:gpr64 = MOVKXi [[COPY3]], 42, 48
144+ ; DAGISEL-NEXT: [[COPY4:%[0-9]+]]:gpr64noip = COPY [[MOVKXi]]
145+ ; DAGISEL-NEXT: [[COPY5:%[0-9]+]]:gpr64noip = COPY [[COPY3]]
146+ ; DAGISEL-NEXT: [[PAC:%[0-9]+]]:gpr64 = PAC [[COPY2]], 2, 42, [[COPY5]], implicit-def dead $x17
147+ ; DAGISEL-NEXT: [[COPY6:%[0-9]+]]:gpr64all = COPY [[PAC]]
148+ ; DAGISEL-NEXT: $x0 = COPY [[COPY6]]
149+ ; DAGISEL-NEXT: RET_ReallyLR implicit $x0
150+ ;
151+ ; GISEL-LABEL: name: blended_disc_non_optimized
152+ ; GISEL: bb.1.entry:
153+ ; GISEL-NEXT: liveins: $x0, $x1
154+ ; GISEL-NEXT: {{ $}}
155+ ; GISEL-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
156+ ; GISEL-NEXT: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
157+ ; GISEL-NEXT: [[MOVKXi:%[0-9]+]]:gpr64noip = MOVKXi [[COPY1]], 42, 48
158+ ; GISEL-NEXT: [[COPY2:%[0-9]+]]:gpr64noip = COPY [[COPY1]]
159+ ; GISEL-NEXT: [[PAC:%[0-9]+]]:gpr64 = PAC [[COPY]], 2, 42, [[COPY2]], implicit-def dead $x17
160+ ; GISEL-NEXT: $x0 = COPY [[PAC]]
161+ ; GISEL-NEXT: RET_ReallyLR implicit $x0
162+ entry:
163+ %disc = call i64 @llvm.ptrauth.blend (i64 %addrdisc , i64 42 )
164+ %signed = call i64 @llvm.ptrauth.sign (i64 %addr , i32 2 , i64 %disc )
165+ ret i64 %signed
166+ }
167+
104168define i64 @blend_and_sign_same_bb (i64 %addr ) {
105169 ; DAGISEL-LABEL: name: blend_and_sign_same_bb
106170 ; DAGISEL: bb.0.entry:
0 commit comments