Skip to content

Commit 4b8f23e

Browse files
authored
[AArch64][SME] Remove immediate argument restriction for svldr and svstr (#68908)
The svldr_vnum_za and svstr_vnum_za builtins/intrinsics currently require that the vnum argument be an immediate, but since vnum is used to modify the base register via a mul and add, that restriction is not necessary. This patch removes that restriction.
1 parent 3d6e416 commit 4b8f23e

File tree

6 files changed

+40
-25
lines changed

6 files changed

+40
-25
lines changed

clang/include/clang/Basic/arm_sme.td

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,9 @@ defm SVLD1_ZA32 : ZALoad<"za32", "i", "aarch64_sme_ld1w", [ImmCheck<0, ImmCheck0
4444
defm SVLD1_ZA64 : ZALoad<"za64", "l", "aarch64_sme_ld1d", [ImmCheck<0, ImmCheck0_7>]>;
4545
defm SVLD1_ZA128 : ZALoad<"za128", "q", "aarch64_sme_ld1q", [ImmCheck<0, ImmCheck0_15>]>;
4646

47-
def SVLDR_VNUM_ZA : MInst<"svldr_vnum_za", "vmQi", "",
47+
def SVLDR_VNUM_ZA : MInst<"svldr_vnum_za", "vmQl", "",
4848
[IsOverloadNone, IsStreamingCompatible, IsSharedZA],
49-
MemEltTyDefault, "aarch64_sme_ldr",
50-
[ImmCheck<2, ImmCheck0_15>]>;
49+
MemEltTyDefault, "aarch64_sme_ldr">;
5150

5251
def SVLDR_ZA : MInst<"svldr_za", "vmQ", "",
5352
[IsOverloadNone, IsStreamingCompatible, IsSharedZA],
@@ -82,10 +81,9 @@ defm SVST1_ZA32 : ZAStore<"za32", "i", "aarch64_sme_st1w", [ImmCheck<0, ImmCheck
8281
defm SVST1_ZA64 : ZAStore<"za64", "l", "aarch64_sme_st1d", [ImmCheck<0, ImmCheck0_7>]>;
8382
defm SVST1_ZA128 : ZAStore<"za128", "q", "aarch64_sme_st1q", [ImmCheck<0, ImmCheck0_15>]>;
8483

85-
def SVSTR_VNUM_ZA : MInst<"svstr_vnum_za", "vm%i", "",
84+
def SVSTR_VNUM_ZA : MInst<"svstr_vnum_za", "vm%l", "",
8685
[IsOverloadNone, IsStreamingCompatible, IsSharedZA, IsPreservesZA],
87-
MemEltTyDefault, "aarch64_sme_str",
88-
[ImmCheck<2, ImmCheck0_15>]>;
86+
MemEltTyDefault, "aarch64_sme_str">;
8987

9088
def SVSTR_ZA : MInst<"svstr_za", "vm%", "",
9189
[IsOverloadNone, IsStreamingCompatible, IsSharedZA, IsPreservesZA],

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9694,11 +9694,6 @@ Value *CodeGenFunction::EmitSVEMaskedStore(const CallExpr *E,
96949694
return Store;
96959695
}
96969696

9697-
Value *CodeGenFunction::EmitTileslice(Value *Offset, Value *Base) {
9698-
llvm::Value *CastOffset = Builder.CreateIntCast(Offset, Int32Ty, false);
9699-
return Builder.CreateAdd(Base, CastOffset, "tileslice");
9700-
}
9701-
97029697
Value *CodeGenFunction::EmitSMELd1St1(const SVETypeFlags &TypeFlags,
97039698
SmallVectorImpl<Value *> &Ops,
97049699
unsigned IntID) {
@@ -9757,13 +9752,13 @@ Value *CodeGenFunction::EmitSMELdrStr(const SVETypeFlags &TypeFlags,
97579752
if (Ops.size() == 3) {
97589753
Function *Cntsb = CGM.getIntrinsic(Intrinsic::aarch64_sme_cntsb);
97599754
llvm::Value *CntsbCall = Builder.CreateCall(Cntsb, {}, "svlb");
9760-
llvm::Value *MulVL = Builder.CreateMul(
9761-
CntsbCall,
9762-
Builder.getInt64(cast<llvm::ConstantInt>(Ops[2])->getZExtValue()),
9763-
"mulvl");
9755+
9756+
llvm::Value *VecNum = Ops[2];
9757+
llvm::Value *MulVL = Builder.CreateMul(CntsbCall, VecNum, "mulvl");
97649758

97659759
Ops[1] = Builder.CreateGEP(Int8Ty, Ops[1], MulVL);
9766-
Ops[0] = EmitTileslice(Ops[0], Ops[2]);
9760+
Ops[0] = Builder.CreateAdd(
9761+
Ops[0], Builder.CreateIntCast(VecNum, Int32Ty, true), "tileslice");
97679762
Ops.erase(&Ops[2]);
97689763
}
97699764
Function *F = CGM.getIntrinsic(IntID, {});

clang/lib/CodeGen/CodeGenFunction.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4280,7 +4280,6 @@ class CodeGenFunction : public CodeGenTypeCache {
42804280
llvm::Value *EmitSVEMaskedStore(const CallExpr *,
42814281
SmallVectorImpl<llvm::Value *> &Ops,
42824282
unsigned BuiltinID);
4283-
llvm::Value *EmitTileslice(llvm::Value *Offset, llvm::Value *Base);
42844283
llvm::Value *EmitSVEPrefetchLoad(const SVETypeFlags &TypeFlags,
42854284
SmallVectorImpl<llvm::Value *> &Ops,
42864285
unsigned BuiltinID);

clang/test/CodeGen/aarch64-sme-intrinsics/acle_sme_ldr.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,22 @@ void test_svldr_vnum_za_1(uint32_t slice_base, const void *ptr) {
3434
// CHECK-NEXT: entry:
3535
// CHECK-NEXT: tail call void @llvm.aarch64.sme.ldr(i32 [[SLICE_BASE:%.*]], ptr [[PTR:%.*]])
3636
// CHECK-NEXT: ret void
37+
//
3738
void test_svldr_za(uint32_t slice_base, const void *ptr) {
3839
svldr_za(slice_base, ptr);
3940
}
41+
42+
// CHECK-C-LABEL: @test_svldr_vnum_za_var(
43+
// CHECK-CXX-LABEL: @_Z22test_svldr_vnum_za_varjPKvl(
44+
// CHECK-NEXT: entry:
45+
// CHECK-NEXT: [[SVLB:%.*]] = tail call i64 @llvm.aarch64.sme.cntsb()
46+
// CHECK-NEXT: [[MULVL:%.*]] = mul i64 [[SVLB]], [[VNUM:%.*]]
47+
// CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[PTR:%.*]], i64 [[MULVL]]
48+
// CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[VNUM:%.*]] to i32
49+
// CHECK-NEXT: [[TILESLICE:%.*]] = add i32 [[TMP1]], [[SLICE_BASE:%.*]]
50+
// CHECK-NEXT: tail call void @llvm.aarch64.sme.ldr(i32 [[TILESLICE]], ptr [[TMP0]])
51+
// CHECK-NEXT: ret void
52+
//
53+
void test_svldr_vnum_za_var(uint32_t slice_base, const void *ptr, int64_t vnum) {
54+
svldr_vnum_za(slice_base, ptr, vnum);
55+
}

clang/test/CodeGen/aarch64-sme-intrinsics/acle_sme_str.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,18 @@ void test_svstr_vnum_za_1(uint32_t slice_base, void *ptr) {
3838
void test_svstr_za(uint32_t slice_base, void *ptr) {
3939
svstr_za(slice_base, ptr);
4040
}
41+
42+
// CHECK-C-LABEL: @test_svstr_vnum_za_var(
43+
// CHECK-CXX-LABEL: @_Z22test_svstr_vnum_za_varjPvl(
44+
// CHECK-NEXT: entry:
45+
// CHECK-NEXT: [[SVLB:%.*]] = tail call i64 @llvm.aarch64.sme.cntsb()
46+
// CHECK-NEXT: [[MULVL:%.*]] = mul i64 [[SVLB]], [[VNUM:%.*]]
47+
// CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[PTR:%.*]], i64 [[MULVL]]
48+
// CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[VNUM:%.*]] to i32
49+
// CHECK-NEXT: [[TILESLICE:%.*]] = add i32 [[TMP1]], [[SLICE_BASE:%.*]]
50+
// CHECK-NEXT: tail call void @llvm.aarch64.sme.str(i32 [[TILESLICE]], ptr [[TMP0]])
51+
// CHECK-NEXT: ret void
52+
//
53+
void test_svstr_vnum_za_var(uint32_t slice_base, void *ptr, int64_t vnum) {
54+
svstr_vnum_za(slice_base, ptr, vnum);
55+
}

clang/test/Sema/aarch64-sme-intrinsics/acle_sme_imm.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -143,11 +143,6 @@ void test_range_0_15(uint32_t slice, svbool_t pg, void *ptr) {
143143
// expected-error@+1 {{argument value 16 is outside the valid range [0, 15]}}
144144
SVE_ACLE_FUNC(svst1_ver_vnum_za128,,,)(16, slice, pg, ptr, 1);
145145

146-
// expected-error@+1 {{argument value 16 is outside the valid range [0, 15]}}
147-
SVE_ACLE_FUNC(svldr_vnum_za,,,)(-1, ptr, 16);
148-
// expected-error@+1 {{argument value 18446744073709551615 is outside the valid range [0, 15]}}
149-
SVE_ACLE_FUNC(svstr_vnum_za,,,)(-1, ptr, -1);
150-
151146
// expected-error@+1 {{argument value 18446744073709551615 is outside the valid range [0, 15]}}
152147
SVE_ACLE_FUNC(svread_hor_za128, _s8, _m,)(svundef_s8(), pg, -1, slice);
153148
// expected-error@+1 {{argument value 16 is outside the valid range [0, 15]}}
@@ -171,9 +166,6 @@ void test_constant(uint64_t u64, svbool_t pg, void *ptr) {
171166
SVE_ACLE_FUNC(svld1_hor_vnum_za8,,,)(u64, 0, pg, ptr, u64); // expected-error {{argument to 'svld1_hor_vnum_za8' must be a constant integer}}
172167
SVE_ACLE_FUNC(svst1_hor_vnum_za32,,,)(u64, 0, pg, ptr, u64); // expected-error {{argument to 'svst1_hor_vnum_za32' must be a constant integer}}
173168

174-
SVE_ACLE_FUNC(svldr_vnum_za,,,)(u64, ptr, u64); // expected-error {{argument to 'svldr_vnum_za' must be a constant integer}}
175-
SVE_ACLE_FUNC(svstr_vnum_za,,,)(u64, ptr, u64); // expected-error {{argument to 'svstr_vnum_za' must be a constant integer}}
176-
177169
SVE_ACLE_FUNC(svread_ver_za16, _s16, _m,)(svundef_s16(), pg, u64, 0); // expected-error-re {{argument to 'svread_ver_za16{{.*}}_m' must be a constant integer}}
178170
SVE_ACLE_FUNC(svwrite_ver_za64, _s64, _m,)(u64, 0, pg, svundef_s64()); // expected-error-re {{argument to 'svwrite_ver_za64{{.*}}_m' must be a constant integer}}
179171
}

0 commit comments

Comments
 (0)