Skip to content

Commit 916415b

Browse files
committed
[AArch64][SME] Make the overloaded svreinterpret_* functions streaming-compatible.
Otherwise these functions are not inlined when invoked from streaming functions. Reviewed By: paulwalker-arm Differential Revision: https://reviews.llvm.org/D159188
1 parent 702c3f5 commit 916415b

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed

clang/include/clang/Basic/Attr.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ class TargetArch<list<string> arches> : TargetSpec {
415415
let Arches = arches;
416416
}
417417
def TargetARM : TargetArch<["arm", "thumb", "armeb", "thumbeb"]>;
418-
def TargetAArch64 : TargetArch<["aarch64"]>;
418+
def TargetAArch64 : TargetArch<["aarch64", "aarch64_be", "aarch64_32"]>;
419419
def TargetAnyArm : TargetArch<!listconcat(TargetARM.Arches, TargetAArch64.Arches)>;
420420
def TargetAVR : TargetArch<["avr"]>;
421421
def TargetBPF : TargetArch<["bpfel", "bpfeb"]>;
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
2+
// REQUIRES: aarch64-registered-target
3+
// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s
4+
// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -S -O1 -Werror -Wall -emit-llvm -o - -x c++ %s | FileCheck %s -check-prefix=CPP-CHECK
5+
// RUN: %clang_cc1 -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s
6+
// RUN: %clang_cc1 -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve -S -O1 -Werror -Wall -emit-llvm -o - -x c++ %s | FileCheck %s -check-prefix=CPP-CHECK
7+
// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -S -O1 -Werror -Wall -o /dev/null %s
8+
9+
// Note: We need to run this test with '-O1' because oddly enough the svreinterpret is always inlined at -O0.
10+
11+
#include <arm_sve.h>
12+
13+
#ifdef SVE_OVERLOADED_FORMS
14+
// A simple used,unused... macro, long enough to represent any SVE builtin.
15+
#define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3
16+
#else
17+
#define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4
18+
#endif
19+
20+
// Test that svreinterpret is inlined (because it should be streaming-compatible)
21+
__attribute__((target("sme")))
22+
// CHECK-LABEL: @test_svreinterpret_s16_s8_from_streaming_mode(
23+
// CHECK-NEXT: entry:
24+
// CHECK-NEXT: [[TMP0:%.*]] = bitcast <vscale x 16 x i8> [[OP:%.*]] to <vscale x 8 x i16>
25+
// CHECK-NEXT: ret <vscale x 8 x i16> [[TMP0]]
26+
//
27+
// CPP-CHECK-LABEL: @_Z45test_svreinterpret_s16_s8_from_streaming_modeu10__SVInt8_t(
28+
// CPP-CHECK-NEXT: entry:
29+
// CPP-CHECK-NEXT: [[TMP0:%.*]] = bitcast <vscale x 16 x i8> [[OP:%.*]] to <vscale x 8 x i16>
30+
// CPP-CHECK-NEXT: ret <vscale x 8 x i16> [[TMP0]]
31+
//
32+
svint16_t test_svreinterpret_s16_s8_from_streaming_mode(svint8_t op) __arm_streaming {
33+
return SVE_ACLE_FUNC(svreinterpret_s16,_s8,,)(op);
34+
}
35+

clang/utils/TableGen/SveEmitter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1284,7 +1284,7 @@ void SVEEmitter::createHeader(raw_ostream &OS) {
12841284
if (ShortForm) {
12851285
OS << "__aio __attribute__((target(\"sve\"))) " << From.Type
12861286
<< " svreinterpret_" << From.Suffix;
1287-
OS << "(" << To.Type << " op) {\n";
1287+
OS << "(" << To.Type << " op) __arm_streaming_compatible {\n";
12881288
OS << " return __builtin_sve_reinterpret_" << From.Suffix << "_"
12891289
<< To.Suffix << "(op);\n";
12901290
OS << "}\n\n";

0 commit comments

Comments
 (0)