Skip to content

Commit ff48816

Browse files
[AArch64][SME] Tile slices to lazy-save/restore should be RDSVL. (#68403)
Instead of RDSVL * RDSVL.
1 parent e13bed4 commit ff48816

File tree

4 files changed

+13
-23
lines changed

4 files changed

+13
-23
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7367,10 +7367,9 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
73677367
SDValue NumZaSaveSlices;
73687368
if (!CalleeAttrs.preservesZA()) {
73697369
// Set up a lazy save mechanism by storing the runtime live slices
7370-
// (worst-case SVL*SVL) to the TPIDR2 stack object.
7371-
SDValue SVL = DAG.getNode(AArch64ISD::RDSVL, DL, MVT::i64,
7372-
DAG.getConstant(1, DL, MVT::i32));
7373-
NumZaSaveSlices = DAG.getNode(ISD::MUL, DL, MVT::i64, SVL, SVL);
7370+
// (worst-case SVL) to the TPIDR2 stack object.
7371+
NumZaSaveSlices = DAG.getNode(AArch64ISD::RDSVL, DL, MVT::i64,
7372+
DAG.getConstant(1, DL, MVT::i32));
73747373
} else if (CalleeAttrs.preservesZA()) {
73757374
NumZaSaveSlices = DAG.getConstant(0, DL, MVT::i64);
73767375
}

llvm/test/CodeGen/AArch64/sme-disable-gisel-fisel.ll

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,8 @@ define double @za_shared_caller_to_za_none_callee(double %x) nounwind noinline
251251
; CHECK-COMMON-NEXT: mov x29, sp
252252
; CHECK-COMMON-NEXT: sub sp, sp, #16
253253
; CHECK-COMMON-NEXT: rdsvl x8, #1
254-
; CHECK-COMMON-NEXT: mul x8, x8, x8
255254
; CHECK-COMMON-NEXT: mov x9, sp
256-
; CHECK-COMMON-NEXT: subs x9, x9, x8
255+
; CHECK-COMMON-NEXT: msub x9, x8, x8, x9
257256
; CHECK-COMMON-NEXT: mov sp, x9
258257
; CHECK-COMMON-NEXT: stur x9, [x29, #-16]
259258
; CHECK-COMMON-NEXT: sturh w8, [x29, #-8]
@@ -291,8 +290,7 @@ define fp128 @f128_call_za(fp128 %a, fp128 %b) "aarch64_pstate_za_shared" nounwi
291290
; CHECK-COMMON-NEXT: sub sp, sp, #16
292291
; CHECK-COMMON-NEXT: rdsvl x8, #1
293292
; CHECK-COMMON-NEXT: mov x9, sp
294-
; CHECK-COMMON-NEXT: mul x8, x8, x8
295-
; CHECK-COMMON-NEXT: sub x9, x9, x8
293+
; CHECK-COMMON-NEXT: msub x9, x8, x8, x9
296294
; CHECK-COMMON-NEXT: mov sp, x9
297295
; CHECK-COMMON-NEXT: stur x9, [x29, #-16]
298296
; CHECK-COMMON-NEXT: sub x9, x29, #16
@@ -352,8 +350,7 @@ define double @frem_call_za(double %a, double %b) "aarch64_pstate_za_shared" nou
352350
; CHECK-COMMON-NEXT: sub sp, sp, #16
353351
; CHECK-COMMON-NEXT: rdsvl x8, #1
354352
; CHECK-COMMON-NEXT: mov x9, sp
355-
; CHECK-COMMON-NEXT: mul x8, x8, x8
356-
; CHECK-COMMON-NEXT: sub x9, x9, x8
353+
; CHECK-COMMON-NEXT: msub x9, x8, x8, x9
357354
; CHECK-COMMON-NEXT: mov sp, x9
358355
; CHECK-COMMON-NEXT: stur x9, [x29, #-16]
359356
; CHECK-COMMON-NEXT: sub x9, x29, #16

llvm/test/CodeGen/AArch64/sme-lazy-save-call.ll

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ define void @test_lazy_save_1_callee() nounwind "aarch64_pstate_za_shared" {
1414
; CHECK-NEXT: sub sp, sp, #16
1515
; CHECK-NEXT: rdsvl x8, #1
1616
; CHECK-NEXT: mov x9, sp
17-
; CHECK-NEXT: mul x8, x8, x8
18-
; CHECK-NEXT: sub x9, x9, x8
17+
; CHECK-NEXT: msub x9, x8, x8, x9
1918
; CHECK-NEXT: mov sp, x9
2019
; CHECK-NEXT: stur x9, [x29, #-16]
2120
; CHECK-NEXT: sub x9, x29, #16
@@ -45,10 +44,9 @@ define void @test_lazy_save_2_callees() nounwind "aarch64_pstate_za_shared" {
4544
; CHECK-NEXT: stp x20, x19, [sp, #16] // 16-byte Folded Spill
4645
; CHECK-NEXT: mov x29, sp
4746
; CHECK-NEXT: sub sp, sp, #16
48-
; CHECK-NEXT: rdsvl x8, #1
49-
; CHECK-NEXT: mul x19, x8, x8
47+
; CHECK-NEXT: rdsvl x19, #1
5048
; CHECK-NEXT: mov x8, sp
51-
; CHECK-NEXT: sub x8, x8, x19
49+
; CHECK-NEXT: msub x8, x19, x19, x8
5250
; CHECK-NEXT: mov sp, x8
5351
; CHECK-NEXT: sub x20, x29, #16
5452
; CHECK-NEXT: stur x8, [x29, #-16]
@@ -92,8 +90,7 @@ define float @test_lazy_save_expanded_intrinsic(float %a) nounwind "aarch64_psta
9290
; CHECK-NEXT: sub sp, sp, #16
9391
; CHECK-NEXT: rdsvl x8, #1
9492
; CHECK-NEXT: mov x9, sp
95-
; CHECK-NEXT: mul x8, x8, x8
96-
; CHECK-NEXT: sub x9, x9, x8
93+
; CHECK-NEXT: msub x9, x8, x8, x9
9794
; CHECK-NEXT: mov sp, x9
9895
; CHECK-NEXT: stur x9, [x29, #-16]
9996
; CHECK-NEXT: sub x9, x29, #16
@@ -129,8 +126,7 @@ define void @test_lazy_save_and_conditional_smstart() nounwind "aarch64_pstate_z
129126
; CHECK-NEXT: sub sp, sp, #16
130127
; CHECK-NEXT: rdsvl x8, #1
131128
; CHECK-NEXT: mov x9, sp
132-
; CHECK-NEXT: mul x8, x8, x8
133-
; CHECK-NEXT: sub x9, x9, x8
129+
; CHECK-NEXT: msub x9, x8, x8, x9
134130
; CHECK-NEXT: mov sp, x9
135131
; CHECK-NEXT: stur x9, [x29, #-80]
136132
; CHECK-NEXT: sub x9, x29, #80

llvm/test/CodeGen/AArch64/sme-shared-za-interface.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ define void @disable_tailcallopt() "aarch64_pstate_za_shared" nounwind {
1212
; CHECK-NEXT: sub sp, sp, #16
1313
; CHECK-NEXT: rdsvl x8, #1
1414
; CHECK-NEXT: mov x9, sp
15-
; CHECK-NEXT: mul x8, x8, x8
16-
; CHECK-NEXT: sub x9, x9, x8
15+
; CHECK-NEXT: msub x9, x8, x8, x9
1716
; CHECK-NEXT: mov sp, x9
1817
; CHECK-NEXT: stur x9, [x29, #-16]
1918
; CHECK-NEXT: sub x9, x29, #16
@@ -44,8 +43,7 @@ define fp128 @f128_call_za(fp128 %a, fp128 %b) "aarch64_pstate_za_shared" nounwi
4443
; CHECK-NEXT: sub sp, sp, #16
4544
; CHECK-NEXT: rdsvl x8, #1
4645
; CHECK-NEXT: mov x9, sp
47-
; CHECK-NEXT: mul x8, x8, x8
48-
; CHECK-NEXT: sub x9, x9, x8
46+
; CHECK-NEXT: msub x9, x8, x8, x9
4947
; CHECK-NEXT: mov sp, x9
5048
; CHECK-NEXT: stur x9, [x29, #-16]
5149
; CHECK-NEXT: sub x9, x29, #16

0 commit comments

Comments
 (0)