[PATCH] D130984: [clang][AArch64][SVE] Add unary +/- operators for SVE types
This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG286d59ef6f71: [clang][AArch64][SVE] Add unary +/- operators for SVE types (authored by DavidTruby). Changed prior to commit: https://reviews.llvm.org/D130984?vs=449264=451409#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D130984/new/ https://reviews.llvm.org/D130984 Files: clang/lib/Sema/SemaExpr.cpp clang/test/CodeGen/aarch64-sve-vector-arith-ops.c clang/test/Sema/sizeless-1.c clang/test/SemaCXX/sizeless-1.cpp Index: clang/test/SemaCXX/sizeless-1.cpp === --- clang/test/SemaCXX/sizeless-1.cpp +++ clang/test/SemaCXX/sizeless-1.cpp @@ -199,10 +199,8 @@ global_int8_ptr -= 1; // expected-error {{arithmetic on a pointer to sizeless type}} global_int8_ptr - global_int8_ptr; // expected-error {{arithmetic on a pointer to sizeless type}} - +init_int8; // expected-error {{invalid argument type 'svint8_t'}} ++init_int8; // expected-error {{cannot increment value of type 'svint8_t'}} init_int8++; // expected-error {{cannot increment value of type 'svint8_t'}} - -init_int8; // expected-error {{invalid argument type 'svint8_t'}} --init_int8; // expected-error {{cannot decrement value of type 'svint8_t'}} init_int8--; // expected-error {{cannot decrement value of type 'svint8_t'}} !init_int8; // expected-error {{invalid argument type 'svint8_t'}} Index: clang/test/Sema/sizeless-1.c === --- clang/test/Sema/sizeless-1.c +++ clang/test/Sema/sizeless-1.c @@ -187,10 +187,8 @@ global_int8_ptr -= 1; // expected-error {{arithmetic on a pointer to sizeless type}} global_int8_ptr - global_int8_ptr; // expected-error {{arithmetic on a pointer to sizeless type}} - +init_int8; // expected-error {{invalid argument type 'svint8_t'}} ++init_int8; // expected-error {{cannot increment value of type 'svint8_t'}} init_int8++; // expected-error {{cannot increment value of type 'svint8_t'}} - -init_int8; // expected-error {{invalid argument type 'svint8_t'}} --init_int8; // expected-error {{cannot decrement value of type 'svint8_t'}} init_int8--; // expected-error {{cannot decrement value of type 'svint8_t'}} !init_int8; // expected-error {{invalid argument type 'svint8_t'}} Index: clang/test/CodeGen/aarch64-sve-vector-arith-ops.c === --- clang/test/CodeGen/aarch64-sve-vector-arith-ops.c +++ clang/test/CodeGen/aarch64-sve-vector-arith-ops.c @@ -1650,3 +1650,143 @@ svuint64_t rem_scalar_u64(svuint64_t a, uint64_t b) { return a % b; } + +// UNARY PROMOTION + +// CHECK-LABEL: @prom_i8( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svint8_t prom_i8(svint8_t a) { + return +a; +} + +// CHECK-LABEL: @prom_i16( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svint16_t prom_i16(svint16_t a) { + return +a; +} + +// CHECK-LABEL: @prom_i32( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svint32_t prom_i32(svint32_t a) { + return +a; +} + +// CHECK-LABEL: @prom_i64( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svint64_t prom_i64(svint64_t a) { + return +a; +} + +// CHECK-LABEL: @prom_u8( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svuint8_t prom_u8(svuint8_t a) { + return +a; +} + +// CHECK-LABEL: @prom_u16( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svuint16_t prom_u16(svuint16_t a) { + return +a; +} + +// CHECK-LABEL: @prom_u32( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svuint32_t prom_u32(svuint32_t a) { + return +a; +} + +// CHECK-LABEL: @prom_u64( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svuint64_t prom_u64(svuint64_t a) { + return +a; +} + +// UNARY NEGATION + +// CHECK-LABEL: @neg_i8( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svint8_t neg_i8(svint8_t a) { + return -a; +} + +// CHECK-LABEL: @neg_i16( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svint16_t neg_i16(svint16_t a) { + return -a; +} + +// CHECK-LABEL: @neg_i32( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svint32_t neg_i32(svint32_t a) { + return -a; +} + +// CHECK-LABEL: @neg_i64( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svint64_t neg_i64(svint64_t a) { + return -a; +} + +// CHECK-LABEL: @neg_u8( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] =
[PATCH] D130984: [clang][AArch64][SVE] Add unary +/- operators for SVE types
c-rhodes accepted this revision. c-rhodes added a comment. This revision is now accepted and ready to land. LGTM, just one minor comment Comment at: clang/test/CodeGen/aarch64-sve-vector-arith-ops.c:1654 + +// UNARY PROMOTION + should we add FP tests as well? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D130984/new/ https://reviews.llvm.org/D130984 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D130984: [clang][AArch64][SVE] Add unary +/- operators for SVE types
DavidTruby created this revision. Herald added subscribers: ctetreau, psnobl, kristof.beyls, tschuett. Herald added a reviewer: efriedma. Herald added a project: All. DavidTruby requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. This patch enables the unary promotion and negation operators on SVE types. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D130984 Files: clang/lib/Sema/SemaExpr.cpp clang/test/CodeGen/aarch64-sve-vector-arith-ops.c Index: clang/test/CodeGen/aarch64-sve-vector-arith-ops.c === --- clang/test/CodeGen/aarch64-sve-vector-arith-ops.c +++ clang/test/CodeGen/aarch64-sve-vector-arith-ops.c @@ -1650,3 +1650,143 @@ svuint64_t rem_scalar_u64(svuint64_t a, uint64_t b) { return a % b; } + +// UNARY PROMOTION + +// CHECK-LABEL: @prom_i8( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svint8_t prom_i8(svint8_t a) { + return +a; +} + +// CHECK-LABEL: @prom_i16( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svint16_t prom_i16(svint16_t a) { + return +a; +} + +// CHECK-LABEL: @prom_i32( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svint32_t prom_i32(svint32_t a) { + return +a; +} + +// CHECK-LABEL: @prom_i64( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svint64_t prom_i64(svint64_t a) { + return +a; +} + +// CHECK-LABEL: @prom_u8( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svuint8_t prom_u8(svuint8_t a) { + return +a; +} + +// CHECK-LABEL: @prom_u16( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svuint16_t prom_u16(svuint16_t a) { + return +a; +} + +// CHECK-LABEL: @prom_u32( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svuint32_t prom_u32(svuint32_t a) { + return +a; +} + +// CHECK-LABEL: @prom_u64( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svuint64_t prom_u64(svuint64_t a) { + return +a; +} + +// UNARY NEGATION + +// CHECK-LABEL: @neg_i8( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svint8_t neg_i8(svint8_t a) { + return -a; +} + +// CHECK-LABEL: @neg_i16( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svint16_t neg_i16(svint16_t a) { + return -a; +} + +// CHECK-LABEL: @neg_i32( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svint32_t neg_i32(svint32_t a) { + return -a; +} + +// CHECK-LABEL: @neg_i64( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svint64_t neg_i64(svint64_t a) { + return -a; +} + +// CHECK-LABEL: @neg_u8( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svuint8_t neg_u8(svuint8_t a) { + return -a; +} + +// CHECK-LABEL: @neg_u16( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svuint16_t neg_u16(svuint16_t a) { + return -a; +} + +// CHECK-LABEL: @neg_u32( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svuint32_t neg_u32(svuint32_t a) { + return -a; +} + +// CHECK-LABEL: @neg_u64( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svuint64_t neg_u64(svuint64_t a) { + return -a; +} Index: clang/lib/Sema/SemaExpr.cpp === --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -15605,6 +15605,8 @@ resultType->castAs()->getVectorKind() != VectorType::AltiVecBool)) break; +else if (resultType->isVLSTBuiltinType()) // SVE vectors allow + and - + break; else if (getLangOpts().CPlusPlus && // C++ [expr.unary.op]p6 Opc == UO_Plus && resultType->isPointerType()) ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits