[PATCH] D77591: [SveEmitter] Explicitly merge with zero/undef
This revision was automatically updated to reflect the committed changes. Closed by commit rG9986b3de26d3: [SveEmitter] Explicitly merge with zero/undef (authored by sdesmalen). Changed prior to commit: https://reviews.llvm.org/D77591?vs=255501&id=258760#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D77591/new/ https://reviews.llvm.org/D77591 Files: clang/include/clang/Basic/arm_sve.td clang/lib/CodeGen/CGBuiltin.cpp clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_abs.c clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_neg.c Index: clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_neg.c === --- /dev/null +++ clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_neg.c @@ -0,0 +1,197 @@ +// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s + +#include + +#ifdef SVE_OVERLOADED_FORMS +// A simple used,unused... macro, long enough to represent any SVE builtin. +#define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3 +#else +#define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4 +#endif + +svint8_t test_svneg_s8_z(svbool_t pg, svint8_t op) +{ + // CHECK-LABEL: test_svneg_s8_z + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv16i8( zeroinitializer, %pg, %op) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svneg,_s8,_z,)(pg, op); +} + +svint16_t test_svneg_s16_z(svbool_t pg, svint16_t op) +{ + // CHECK-LABEL: test_svneg_s16_z + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv8i16( zeroinitializer, %[[PG]], %op) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svneg,_s16,_z,)(pg, op); +} + +svint32_t test_svneg_s32_z(svbool_t pg, svint32_t op) +{ + // CHECK-LABEL: test_svneg_s32_z + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv4i32( zeroinitializer, %[[PG]], %op) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svneg,_s32,_z,)(pg, op); +} + +svint64_t test_svneg_s64_z(svbool_t pg, svint64_t op) +{ + // CHECK-LABEL: test_svneg_s64_z + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv2i64( zeroinitializer, %[[PG]], %op) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svneg,_s64,_z,)(pg, op); +} + +svint8_t test_svneg_s8_m(svint8_t inactive, svbool_t pg, svint8_t op) +{ + // CHECK-LABEL: test_svneg_s8_m + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv16i8( %inactive, %pg, %op) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svneg,_s8,_m,)(inactive, pg, op); +} + +svint16_t test_svneg_s16_m(svint16_t inactive, svbool_t pg, svint16_t op) +{ + // CHECK-LABEL: test_svneg_s16_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv8i16( %inactive, %[[PG]], %op) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svneg,_s16,_m,)(inactive, pg, op); +} + +svint32_t test_svneg_s32_m(svint32_t inactive, svbool_t pg, svint32_t op) +{ + // CHECK-LABEL: test_svneg_s32_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv4i32( %inactive, %[[PG]], %op) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svneg,_s32,_m,)(inactive, pg, op); +} + +svint64_t test_svneg_s64_m(svint64_t inactive, svbool_t pg, svint64_t op) +{ + // CHECK-LABEL: test_svneg_s64_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv2i64( %inactive, %[[PG]], %op) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svneg,_s64,_m,)(inactive, pg, op); +} + +svint8_t test_svneg_s8_x(svbool_t pg, svint8_t op) +{ + // CHECK-LABEL: test_svneg_s8_x + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv16i8( undef, %pg, %op) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svneg,_s8,_x,)(pg, op); +} + +svint16_t test_svneg_s16_x(svbool_t pg, svint16_t op) +{ + // CHECK-LABEL: test_svneg_s16_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv8i16( undef, %[[PG]], %op) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svneg,_s16,_x,)(pg, op); +} + +svint32_t test_svneg_s32_x(svbool_t pg, svint32_t op) +{ + // CHECK-L
[PATCH] D77591: [SveEmitter] Explicitly merge with zero/undef
efriedma accepted this revision. efriedma added a comment. This revision is now accepted and ready to land. LGTM Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D77591/new/ https://reviews.llvm.org/D77591 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D77591: [SveEmitter] Explicitly merge with zero/undef
sdesmalen created this revision. sdesmalen added reviewers: SjoerdMeijer, efriedma, rovka. Herald added a subscriber: tschuett. Herald added a project: clang. sdesmalen added a child revision: D77593: [SveEmitter] Implement zeroing of false lanes. Builtins that have the merge type MergeAnyExp or MergeZeroExp, merge into a 'undef' or 'zero' vector respectively, which enables the _x and _z behaviour for unary operations. This patch also adds builtins for svabs and svneg. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D77591 Files: clang/include/clang/Basic/arm_sve.td clang/lib/CodeGen/CGBuiltin.cpp clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_abs.c clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_neg.c Index: clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_neg.c === --- /dev/null +++ clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_neg.c @@ -0,0 +1,197 @@ +// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s + +#include + +#ifdef SVE_OVERLOADED_FORMS +// A simple used,unused... macro, long enough to represent any SVE builtin. +#define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3 +#else +#define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4 +#endif + +svint8_t test_svneg_s8_z(svbool_t pg, svint8_t op) +{ + // CHECK-LABEL: test_svneg_s8_z + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv16i8( zeroinitializer, %pg, %op) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svneg,_s8,_z,)(pg, op); +} + +svint16_t test_svneg_s16_z(svbool_t pg, svint16_t op) +{ + // CHECK-LABEL: test_svneg_s16_z + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv8i16( zeroinitializer, %[[PG]], %op) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svneg,_s16,_z,)(pg, op); +} + +svint32_t test_svneg_s32_z(svbool_t pg, svint32_t op) +{ + // CHECK-LABEL: test_svneg_s32_z + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv4i32( zeroinitializer, %[[PG]], %op) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svneg,_s32,_z,)(pg, op); +} + +svint64_t test_svneg_s64_z(svbool_t pg, svint64_t op) +{ + // CHECK-LABEL: test_svneg_s64_z + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv2i64( zeroinitializer, %[[PG]], %op) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svneg,_s64,_z,)(pg, op); +} + +svint8_t test_svneg_s8_m(svint8_t inactive, svbool_t pg, svint8_t op) +{ + // CHECK-LABEL: test_svneg_s8_m + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv16i8( %inactive, %pg, %op) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svneg,_s8,_m,)(inactive, pg, op); +} + +svint16_t test_svneg_s16_m(svint16_t inactive, svbool_t pg, svint16_t op) +{ + // CHECK-LABEL: test_svneg_s16_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv8i16( %inactive, %[[PG]], %op) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svneg,_s16,_m,)(inactive, pg, op); +} + +svint32_t test_svneg_s32_m(svint32_t inactive, svbool_t pg, svint32_t op) +{ + // CHECK-LABEL: test_svneg_s32_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv4i32( %inactive, %[[PG]], %op) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svneg,_s32,_m,)(inactive, pg, op); +} + +svint64_t test_svneg_s64_m(svint64_t inactive, svbool_t pg, svint64_t op) +{ + // CHECK-LABEL: test_svneg_s64_m + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv2i64( %inactive, %[[PG]], %op) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svneg,_s64,_m,)(inactive, pg, op); +} + +svint8_t test_svneg_s8_x(svbool_t pg, svint8_t op) +{ + // CHECK-LABEL: test_svneg_s8_x + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv16i8( undef, %pg, %op) + // CHECK: ret %[[INTRINSIC]] + return SVE_ACLE_FUNC(svneg,_s8,_x,)(pg, op); +} + +svint16_t test_svneg_s16_x(svbool_t pg, svint16_t op) +{ + // CHECK-LABEL: test_svneg_s16_x + // CHECK: %[[PG:.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) + // CHECK: %[[INTRINSIC:.*]] = call @llvm.aarch64.sve.neg.nxv8i16( undef, %[[PG]], %op) +