264 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 62// RUN: %clang_cc1 -triple riscv64-none-linux-gnu -target-feature +f -target-feature +d -target-feature +zve64d -mvscale-min=1 -mvscale-max=1 -O1 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-643// RUN: %clang_cc1 -triple riscv64-none-linux-gnu -target-feature +f -target-feature +d -target-feature +zve64d -mvscale-min=2 -mvscale-max=2 -O1 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-1284// RUN: %clang_cc1 -triple riscv64-none-linux-gnu -target-feature +f -target-feature +d -target-feature +zve64d -mvscale-min=4 -mvscale-max=4 -O1 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-2565 6// REQUIRES: riscv-registered-target7 8#include <stdint.h>9 10typedef __rvv_int8m1_t vint8m1_t;11typedef __rvv_uint8m1_t vuint8m1_t;12typedef __rvv_int16m1_t vint16m1_t;13typedef __rvv_uint16m1_t vuint16m1_t;14typedef __rvv_int32m1_t vint32m1_t;15typedef __rvv_uint32m1_t vuint32m1_t;16typedef __rvv_int64m1_t vint64m1_t;17typedef __rvv_uint64m1_t vuint64m1_t;18typedef __rvv_float32m1_t vfloat32m1_t;19typedef __rvv_float64m1_t vfloat64m1_t;20 21typedef __rvv_bool1_t vbool1_t;22typedef __rvv_bool2_t vbool2_t;23typedef __rvv_bool4_t vbool4_t;24typedef __rvv_bool8_t vbool8_t;25typedef __rvv_bool16_t vbool16_t;26typedef __rvv_bool32_t vbool32_t;27typedef __rvv_bool64_t vbool64_t;28 29typedef vint64m1_t fixed_int64m1_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen)));30typedef vfloat64m1_t fixed_float64m1_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen)));31typedef vbool1_t fixed_bool1_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen)));32typedef vbool2_t fixed_bool2_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen / 2)));33typedef vbool4_t fixed_bool4_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen / 4)));34typedef vbool8_t fixed_bool8_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen / 8)));35#if __riscv_v_fixed_vlen >= 12836typedef vbool16_t fixed_bool16_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen / 16)));37#endif38#if __riscv_v_fixed_vlen >= 25639typedef vbool32_t fixed_bool32_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen / 32)));40#endif41#if __riscv_v_fixed_vlen >= 51242typedef vbool64_t fixed_bool64_t __attribute__((riscv_rvv_vector_bits(__riscv_v_fixed_vlen / 64)));43#endif44 45#define DEFINE_STRUCT(ty) \46 struct struct_##ty { \47 fixed_##ty##_t x, y[3]; \48 } struct_##ty;49 50DEFINE_STRUCT(int64m1)51DEFINE_STRUCT(float64m1)52DEFINE_STRUCT(bool1)53DEFINE_STRUCT(bool2)54DEFINE_STRUCT(bool4)55DEFINE_STRUCT(bool8)56#if __riscv_v_fixed_vlen >= 12857DEFINE_STRUCT(bool16)58#endif59#if __riscv_v_fixed_vlen >= 25660DEFINE_STRUCT(bool32)61#endif62#if __riscv_v_fixed_vlen >= 51263DEFINE_STRUCT(bool64)64#endif65 66//===----------------------------------------------------------------------===//67// int6468//===----------------------------------------------------------------------===//69 70// CHECK-64-LABEL: define dso_local <vscale x 1 x i64> @read_int64m1(71// CHECK-64-SAME: ptr noundef readonly captures(none) [[S:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {72// CHECK-64-NEXT: [[ENTRY:.*:]]73// CHECK-64-NEXT: [[Y:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 874// CHECK-64-NEXT: [[TMP0:%.*]] = load <1 x i64>, ptr [[Y]], align 8, !tbaa [[CHAR_TBAA10:![0-9]+]]75// CHECK-64-NEXT: [[CAST_SCALABLE:%.*]] = tail call <vscale x 1 x i64> @llvm.vector.insert.nxv1i64.v1i64(<vscale x 1 x i64> poison, <1 x i64> [[TMP0]], i64 0)76// CHECK-64-NEXT: ret <vscale x 1 x i64> [[CAST_SCALABLE]]77//78// CHECK-128-LABEL: define dso_local <vscale x 1 x i64> @read_int64m1(79// CHECK-128-SAME: ptr noundef readonly captures(none) [[S:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {80// CHECK-128-NEXT: [[ENTRY:.*:]]81// CHECK-128-NEXT: [[Y:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 1682// CHECK-128-NEXT: [[TMP0:%.*]] = load <2 x i64>, ptr [[Y]], align 8, !tbaa [[CHAR_TBAA10:![0-9]+]]83// CHECK-128-NEXT: [[CAST_SCALABLE:%.*]] = tail call <vscale x 1 x i64> @llvm.vector.insert.nxv1i64.v2i64(<vscale x 1 x i64> poison, <2 x i64> [[TMP0]], i64 0)84// CHECK-128-NEXT: ret <vscale x 1 x i64> [[CAST_SCALABLE]]85//86// CHECK-256-LABEL: define dso_local <vscale x 1 x i64> @read_int64m1(87// CHECK-256-SAME: ptr noundef readonly captures(none) [[S:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {88// CHECK-256-NEXT: [[ENTRY:.*:]]89// CHECK-256-NEXT: [[Y:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 3290// CHECK-256-NEXT: [[TMP0:%.*]] = load <4 x i64>, ptr [[Y]], align 8, !tbaa [[CHAR_TBAA10:![0-9]+]]91// CHECK-256-NEXT: [[CAST_SCALABLE:%.*]] = tail call <vscale x 1 x i64> @llvm.vector.insert.nxv1i64.v4i64(<vscale x 1 x i64> poison, <4 x i64> [[TMP0]], i64 0)92// CHECK-256-NEXT: ret <vscale x 1 x i64> [[CAST_SCALABLE]]93//94vint64m1_t read_int64m1(struct struct_int64m1 *s) {95 return s->y[0];96}97 98// CHECK-64-LABEL: define dso_local void @write_int64m1(99// CHECK-64-SAME: ptr noundef writeonly captures(none) initializes((8, 16)) [[S:%.*]], <vscale x 1 x i64> [[X:%.*]]) local_unnamed_addr #[[ATTR2:[0-9]+]] {100// CHECK-64-NEXT: [[ENTRY:.*:]]101// CHECK-64-NEXT: [[CAST_FIXED:%.*]] = tail call <1 x i64> @llvm.vector.extract.v1i64.nxv1i64(<vscale x 1 x i64> [[X]], i64 0)102// CHECK-64-NEXT: [[Y:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 8103// CHECK-64-NEXT: store <1 x i64> [[CAST_FIXED]], ptr [[Y]], align 8, !tbaa [[CHAR_TBAA10]]104// CHECK-64-NEXT: ret void105//106// CHECK-128-LABEL: define dso_local void @write_int64m1(107// CHECK-128-SAME: ptr noundef writeonly captures(none) initializes((16, 32)) [[S:%.*]], <vscale x 1 x i64> [[X:%.*]]) local_unnamed_addr #[[ATTR2:[0-9]+]] {108// CHECK-128-NEXT: [[ENTRY:.*:]]109// CHECK-128-NEXT: [[CAST_FIXED:%.*]] = tail call <2 x i64> @llvm.vector.extract.v2i64.nxv1i64(<vscale x 1 x i64> [[X]], i64 0)110// CHECK-128-NEXT: [[Y:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 16111// CHECK-128-NEXT: store <2 x i64> [[CAST_FIXED]], ptr [[Y]], align 8, !tbaa [[CHAR_TBAA10]]112// CHECK-128-NEXT: ret void113//114// CHECK-256-LABEL: define dso_local void @write_int64m1(115// CHECK-256-SAME: ptr noundef writeonly captures(none) initializes((32, 64)) [[S:%.*]], <vscale x 1 x i64> [[X:%.*]]) local_unnamed_addr #[[ATTR2:[0-9]+]] {116// CHECK-256-NEXT: [[ENTRY:.*:]]117// CHECK-256-NEXT: [[CAST_FIXED:%.*]] = tail call <4 x i64> @llvm.vector.extract.v4i64.nxv1i64(<vscale x 1 x i64> [[X]], i64 0)118// CHECK-256-NEXT: [[Y:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 32119// CHECK-256-NEXT: store <4 x i64> [[CAST_FIXED]], ptr [[Y]], align 8, !tbaa [[CHAR_TBAA10]]120// CHECK-256-NEXT: ret void121//122void write_int64m1(struct struct_int64m1 *s, vint64m1_t x) {123 s->y[0] = x;124}125 126//===----------------------------------------------------------------------===//127// float64128//===----------------------------------------------------------------------===//129 130// CHECK-64-LABEL: define dso_local <vscale x 1 x double> @read_float64m1(131// CHECK-64-SAME: ptr noundef readonly captures(none) [[S:%.*]]) local_unnamed_addr #[[ATTR0]] {132// CHECK-64-NEXT: [[ENTRY:.*:]]133// CHECK-64-NEXT: [[Y:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 8134// CHECK-64-NEXT: [[TMP0:%.*]] = load <1 x double>, ptr [[Y]], align 8, !tbaa [[CHAR_TBAA10]]135// CHECK-64-NEXT: [[CAST_SCALABLE:%.*]] = tail call <vscale x 1 x double> @llvm.vector.insert.nxv1f64.v1f64(<vscale x 1 x double> poison, <1 x double> [[TMP0]], i64 0)136// CHECK-64-NEXT: ret <vscale x 1 x double> [[CAST_SCALABLE]]137//138// CHECK-128-LABEL: define dso_local <vscale x 1 x double> @read_float64m1(139// CHECK-128-SAME: ptr noundef readonly captures(none) [[S:%.*]]) local_unnamed_addr #[[ATTR0]] {140// CHECK-128-NEXT: [[ENTRY:.*:]]141// CHECK-128-NEXT: [[Y:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 16142// CHECK-128-NEXT: [[TMP0:%.*]] = load <2 x double>, ptr [[Y]], align 8, !tbaa [[CHAR_TBAA10]]143// CHECK-128-NEXT: [[CAST_SCALABLE:%.*]] = tail call <vscale x 1 x double> @llvm.vector.insert.nxv1f64.v2f64(<vscale x 1 x double> poison, <2 x double> [[TMP0]], i64 0)144// CHECK-128-NEXT: ret <vscale x 1 x double> [[CAST_SCALABLE]]145//146// CHECK-256-LABEL: define dso_local <vscale x 1 x double> @read_float64m1(147// CHECK-256-SAME: ptr noundef readonly captures(none) [[S:%.*]]) local_unnamed_addr #[[ATTR0]] {148// CHECK-256-NEXT: [[ENTRY:.*:]]149// CHECK-256-NEXT: [[Y:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 32150// CHECK-256-NEXT: [[TMP0:%.*]] = load <4 x double>, ptr [[Y]], align 8, !tbaa [[CHAR_TBAA10]]151// CHECK-256-NEXT: [[CAST_SCALABLE:%.*]] = tail call <vscale x 1 x double> @llvm.vector.insert.nxv1f64.v4f64(<vscale x 1 x double> poison, <4 x double> [[TMP0]], i64 0)152// CHECK-256-NEXT: ret <vscale x 1 x double> [[CAST_SCALABLE]]153//154vfloat64m1_t read_float64m1(struct struct_float64m1 *s) {155 return s->y[0];156}157 158// CHECK-64-LABEL: define dso_local void @write_float64m1(159// CHECK-64-SAME: ptr noundef writeonly captures(none) initializes((8, 16)) [[S:%.*]], <vscale x 1 x double> [[X:%.*]]) local_unnamed_addr #[[ATTR2]] {160// CHECK-64-NEXT: [[ENTRY:.*:]]161// CHECK-64-NEXT: [[CAST_FIXED:%.*]] = tail call <1 x double> @llvm.vector.extract.v1f64.nxv1f64(<vscale x 1 x double> [[X]], i64 0)162// CHECK-64-NEXT: [[Y:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 8163// CHECK-64-NEXT: store <1 x double> [[CAST_FIXED]], ptr [[Y]], align 8, !tbaa [[CHAR_TBAA10]]164// CHECK-64-NEXT: ret void165//166// CHECK-128-LABEL: define dso_local void @write_float64m1(167// CHECK-128-SAME: ptr noundef writeonly captures(none) initializes((16, 32)) [[S:%.*]], <vscale x 1 x double> [[X:%.*]]) local_unnamed_addr #[[ATTR2]] {168// CHECK-128-NEXT: [[ENTRY:.*:]]169// CHECK-128-NEXT: [[CAST_FIXED:%.*]] = tail call <2 x double> @llvm.vector.extract.v2f64.nxv1f64(<vscale x 1 x double> [[X]], i64 0)170// CHECK-128-NEXT: [[Y:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 16171// CHECK-128-NEXT: store <2 x double> [[CAST_FIXED]], ptr [[Y]], align 8, !tbaa [[CHAR_TBAA10]]172// CHECK-128-NEXT: ret void173//174// CHECK-256-LABEL: define dso_local void @write_float64m1(175// CHECK-256-SAME: ptr noundef writeonly captures(none) initializes((32, 64)) [[S:%.*]], <vscale x 1 x double> [[X:%.*]]) local_unnamed_addr #[[ATTR2]] {176// CHECK-256-NEXT: [[ENTRY:.*:]]177// CHECK-256-NEXT: [[CAST_FIXED:%.*]] = tail call <4 x double> @llvm.vector.extract.v4f64.nxv1f64(<vscale x 1 x double> [[X]], i64 0)178// CHECK-256-NEXT: [[Y:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 32179// CHECK-256-NEXT: store <4 x double> [[CAST_FIXED]], ptr [[Y]], align 8, !tbaa [[CHAR_TBAA10]]180// CHECK-256-NEXT: ret void181//182void write_float64m1(struct struct_float64m1 *s, vfloat64m1_t x) {183 s->y[0] = x;184}185 186//===----------------------------------------------------------------------===//187// bool188//===----------------------------------------------------------------------===//189 190// CHECK-64-LABEL: define dso_local <vscale x 64 x i1> @read_bool1(191// CHECK-64-SAME: ptr noundef readonly captures(none) [[S:%.*]]) local_unnamed_addr #[[ATTR0]] {192// CHECK-64-NEXT: [[ENTRY:.*:]]193// CHECK-64-NEXT: [[Y:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 8194// CHECK-64-NEXT: [[TMP0:%.*]] = load <8 x i8>, ptr [[Y]], align 8, !tbaa [[CHAR_TBAA10]]195// CHECK-64-NEXT: [[CAST_SCALABLE:%.*]] = tail call <vscale x 8 x i8> @llvm.vector.insert.nxv8i8.v8i8(<vscale x 8 x i8> poison, <8 x i8> [[TMP0]], i64 0)196// CHECK-64-NEXT: [[TMP1:%.*]] = bitcast <vscale x 8 x i8> [[CAST_SCALABLE]] to <vscale x 64 x i1>197// CHECK-64-NEXT: ret <vscale x 64 x i1> [[TMP1]]198//199// CHECK-128-LABEL: define dso_local <vscale x 64 x i1> @read_bool1(200// CHECK-128-SAME: ptr noundef readonly captures(none) [[S:%.*]]) local_unnamed_addr #[[ATTR0]] {201// CHECK-128-NEXT: [[ENTRY:.*:]]202// CHECK-128-NEXT: [[Y:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 16203// CHECK-128-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr [[Y]], align 8, !tbaa [[CHAR_TBAA10]]204// CHECK-128-NEXT: [[CAST_SCALABLE:%.*]] = tail call <vscale x 8 x i8> @llvm.vector.insert.nxv8i8.v16i8(<vscale x 8 x i8> poison, <16 x i8> [[TMP0]], i64 0)205// CHECK-128-NEXT: [[TMP1:%.*]] = bitcast <vscale x 8 x i8> [[CAST_SCALABLE]] to <vscale x 64 x i1>206// CHECK-128-NEXT: ret <vscale x 64 x i1> [[TMP1]]207//208// CHECK-256-LABEL: define dso_local <vscale x 64 x i1> @read_bool1(209// CHECK-256-SAME: ptr noundef readonly captures(none) [[S:%.*]]) local_unnamed_addr #[[ATTR0]] {210// CHECK-256-NEXT: [[ENTRY:.*:]]211// CHECK-256-NEXT: [[Y:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 32212// CHECK-256-NEXT: [[TMP0:%.*]] = load <32 x i8>, ptr [[Y]], align 8, !tbaa [[CHAR_TBAA10]]213// CHECK-256-NEXT: [[CAST_SCALABLE:%.*]] = tail call <vscale x 8 x i8> @llvm.vector.insert.nxv8i8.v32i8(<vscale x 8 x i8> poison, <32 x i8> [[TMP0]], i64 0)214// CHECK-256-NEXT: [[TMP1:%.*]] = bitcast <vscale x 8 x i8> [[CAST_SCALABLE]] to <vscale x 64 x i1>215// CHECK-256-NEXT: ret <vscale x 64 x i1> [[TMP1]]216//217vbool1_t read_bool1(struct struct_bool1 *s) {218 return s->y[0];219}220 221// CHECK-64-LABEL: define dso_local void @write_bool1(222// CHECK-64-SAME: ptr noundef writeonly captures(none) initializes((8, 16)) [[S:%.*]], <vscale x 64 x i1> [[X:%.*]]) local_unnamed_addr #[[ATTR2]] {223// CHECK-64-NEXT: [[ENTRY:.*:]]224// CHECK-64-NEXT: [[TMP0:%.*]] = bitcast <vscale x 64 x i1> [[X]] to <vscale x 8 x i8>225// CHECK-64-NEXT: [[CAST_FIXED:%.*]] = tail call <8 x i8> @llvm.vector.extract.v8i8.nxv8i8(<vscale x 8 x i8> [[TMP0]], i64 0)226// CHECK-64-NEXT: [[Y:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 8227// CHECK-64-NEXT: store <8 x i8> [[CAST_FIXED]], ptr [[Y]], align 8, !tbaa [[CHAR_TBAA10]]228// CHECK-64-NEXT: ret void229//230// CHECK-128-LABEL: define dso_local void @write_bool1(231// CHECK-128-SAME: ptr noundef writeonly captures(none) initializes((16, 32)) [[S:%.*]], <vscale x 64 x i1> [[X:%.*]]) local_unnamed_addr #[[ATTR2]] {232// CHECK-128-NEXT: [[ENTRY:.*:]]233// CHECK-128-NEXT: [[TMP0:%.*]] = bitcast <vscale x 64 x i1> [[X]] to <vscale x 8 x i8>234// CHECK-128-NEXT: [[CAST_FIXED:%.*]] = tail call <16 x i8> @llvm.vector.extract.v16i8.nxv8i8(<vscale x 8 x i8> [[TMP0]], i64 0)235// CHECK-128-NEXT: [[Y:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 16236// CHECK-128-NEXT: store <16 x i8> [[CAST_FIXED]], ptr [[Y]], align 8, !tbaa [[CHAR_TBAA10]]237// CHECK-128-NEXT: ret void238//239// CHECK-256-LABEL: define dso_local void @write_bool1(240// CHECK-256-SAME: ptr noundef writeonly captures(none) initializes((32, 64)) [[S:%.*]], <vscale x 64 x i1> [[X:%.*]]) local_unnamed_addr #[[ATTR2]] {241// CHECK-256-NEXT: [[ENTRY:.*:]]242// CHECK-256-NEXT: [[TMP0:%.*]] = bitcast <vscale x 64 x i1> [[X]] to <vscale x 8 x i8>243// CHECK-256-NEXT: [[CAST_FIXED:%.*]] = tail call <32 x i8> @llvm.vector.extract.v32i8.nxv8i8(<vscale x 8 x i8> [[TMP0]], i64 0)244// CHECK-256-NEXT: [[Y:%.*]] = getelementptr inbounds nuw i8, ptr [[S]], i64 32245// CHECK-256-NEXT: store <32 x i8> [[CAST_FIXED]], ptr [[Y]], align 8, !tbaa [[CHAR_TBAA10]]246// CHECK-256-NEXT: ret void247//248void write_bool1(struct struct_bool1 *s, vbool1_t x) {249 s->y[0] = x;250}251//.252// CHECK-64: [[META8:![0-9]+]] = !{!"omnipotent char", [[META9:![0-9]+]], i64 0}253// CHECK-64: [[META9]] = !{!"Simple C/C++ TBAA"}254// CHECK-64: [[CHAR_TBAA10]] = !{[[META8]], [[META8]], i64 0}255//.256// CHECK-128: [[META8:![0-9]+]] = !{!"omnipotent char", [[META9:![0-9]+]], i64 0}257// CHECK-128: [[META9]] = !{!"Simple C/C++ TBAA"}258// CHECK-128: [[CHAR_TBAA10]] = !{[[META8]], [[META8]], i64 0}259//.260// CHECK-256: [[META8:![0-9]+]] = !{!"omnipotent char", [[META9:![0-9]+]], i64 0}261// CHECK-256: [[META9]] = !{!"Simple C/C++ TBAA"}262// CHECK-256: [[CHAR_TBAA10]] = !{[[META8]], [[META8]], i64 0}263//.264