https://github.com/metkarpoonam updated https://github.com/llvm/llvm-project/pull/128979
>From 08e191213d3abfc6a5f2af7ba3db35055dd040eb Mon Sep 17 00:00:00 2001 From: Poonam Vilas Metkar <poonammet...@microsoft.com> Date: Wed, 26 Feb 2025 16:23:01 -0800 Subject: [PATCH 1/8] Format hlsl_intrinsics.h with clang-format --- clang/lib/Headers/hlsl/hlsl_intrinsics.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index 239d7a3f59b77..764cf671dce31 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -290,6 +290,24 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_and) bool4 and(bool4 x, bool4 y); // clang-format on +//===----------------------------------------------------------------------===// +// or builtins +//===----------------------------------------------------------------------===// + +/// \fn T or(T x, T y) +/// \brief Returns the bitwise OR of the two input values, \a x and \a y. +/// \param x The first input value and y The second input value. +/// +/// \returns The logically OR a vector and retuens bool vector. + +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) +bool or(bool, bool); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) +bool2 or(bool2, bool2); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) +bool3 or(bool3, bool3); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) +bool4 or(bool4, bool4); //===----------------------------------------------------------------------===// // any builtins //===----------------------------------------------------------------------===// >From eae4c9f114f43e314146ecd5569c631188f93bff Mon Sep 17 00:00:00 2001 From: Poonam Vilas Metkar <poonammet...@microsoft.com> Date: Wed, 26 Feb 2025 16:36:50 -0800 Subject: [PATCH 2/8] Include HLSL or_intrinsic, add codegen in CGBuiltin, and the corresponding tests in or.hlsl. Additionally, incorporate logical-operator-errors to handle both 'and' and 'or' semantic diagnostics. --- clang/include/clang/Basic/Builtins.td | 6 ++ clang/lib/CodeGen/CGBuiltin.cpp | 5 ++ clang/lib/Sema/SemaHLSL.cpp | 19 +++++ clang/test/CodeGenHLSL/builtins/or.hlsl | 85 +++++++++++++++++++ .../SemaHLSL/logical-operator-errors.hlsl | 27 ++++++ 5 files changed, 142 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/or.hlsl create mode 100644 clang/test/SemaHLSL/logical-operator-errors.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 598ae171b1389..f7027331cd6c5 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4783,6 +4783,12 @@ def HLSLAnd : LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } +def HLSLOr : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_or"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} + def HLSLAny : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_any"]; let Attributes = [NoThrow, Const]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 65fac01d58362..599e05819ec7c 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19492,6 +19492,11 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, Value *Op1 = EmitScalarExpr(E->getArg(1)); return Builder.CreateAnd(Op0, Op1, "hlsl.and"); } + case Builtin::BI__builtin_hlsl_or: { + Value *Op0 = EmitScalarExpr(E->getArg(0)); + Value *Op1 = EmitScalarExpr(E->getArg(1)); + return Builder.CreateOr(Op0, Op1, "hlsl.or"); + } case Builtin::BI__builtin_hlsl_any: { Value *Op0 = EmitScalarExpr(E->getArg(0)); return Builder.CreateIntrinsic( diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 283a9801fc707..c48512673be58 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -2305,6 +2305,25 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { TheCall->setType(ArgTyA); break; } + case Builtin::BI__builtin_hlsl_or: { + if (SemaRef.checkArgCount(TheCall, 2)) + return true; + if (CheckVectorElementCallArgs(&SemaRef, TheCall)) + return true; + + // Ensure input expr type is a scalar/vector and the same as the return type + if (CheckScalarOrVector(&SemaRef, TheCall, getASTContext().BoolTy, 0)) + return true; + + // Ensure input parameter type is bool + ExprResult A = TheCall->getArg(0); + QualType ArgTyA = A.get()->getType(); + + // return type is the same as the input type + TheCall->setType(ArgTyA); + + break; + } case Builtin::BI__builtin_hlsl_all: case Builtin::BI__builtin_hlsl_any: { if (SemaRef.checkArgCount(TheCall, 1)) diff --git a/clang/test/CodeGenHLSL/builtins/or.hlsl b/clang/test/CodeGenHLSL/builtins/or.hlsl new file mode 100644 index 0000000000000..0c21973bda17c --- /dev/null +++ b/clang/test/CodeGenHLSL/builtins/or.hlsl @@ -0,0 +1,85 @@ +// RUN: %clang_cc1 -finclude-default-header -triple \ +// RUN: dxil-pc-shadermodel6.3-library %s \ +// RUN: -emit-llvm -O1 -o - | FileCheck %s + +//CHECK-LABEL: define noundef i1 @_Z12test_or_boolbb( +//CHECK-SAME: i1 noundef [[X:%.*]], i1 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { +//CHECK-NEXT: [[ENTRY:.*:]] +//CHECK-NEXT: [[HLSL_OR:%.*]] = or i1 [[x]], [[y]] +//CHECK-NEXT: ret i1 [[HLSL_OR]] +//CHECK_NEXT: } +bool test_or_bool(bool x, bool y) +{ + return or(x, y); + +} + +//CHECK-LABEL: define noundef <2 x i1> @_Z13test_or_bool2Dv2_bS_( +//CHECK-SAME: <2 x i1> noundef [[X:%.*]], <2 x i1> noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] { +//CHECK-NEXT: [[ENTRY:.*:]] +//CHECK-NEXT: [[HLSL_OR:%.*]] = or <2 xi1> [[x]], [[y]] +//CHECK-NEXT: ret <2 x i1> [[HLSL_OR]] +//CHECK_NEXT: } +bool2 test_or_bool2(bool2 x, bool2 y) +{ + return or(x, y); +} + +//CHECK-LABEL: define noundef <3 x i1> @_Z13test_or_bool3Dv3_bS_( +//CHECK-SAME: <3 x i1> noundef [[X:%.*]], <3 x i1> noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] { +//CHECK-NEXT: [[ENTRY:.*:]] +//CHECK-NEXT: [[HLSL_OR:%.*]] = or <3 xi1> [[x]], [[y]] +//CHECK-NEXT: ret <3 x i1> [[HLSL_OR]] +//CHECK_NEXT: } +bool3 test_or_bool3(bool3 x, bool3 y) +{ + return or(x, y); +} + +//CHECK-LABEL: define noundef <4 x i1> @_Z13test_or_bool4Dv4_bS_( +//CHECK-SAME: <4 x i1> noundef [[X:%.*]], <4 x i1> noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] { +//CHECK-NEXT: [[ENTRY:.*:]] +//CHECK-NEXT: [[HLSL_OR:%.*]] = or <4 xi1> [[x]], [[y]] +//CHECK-NEXT: ret <4 x i1> [[HLSL_OR]] +//CHECK_NEXT: } +bool4 test_or_bool4(bool4 x, bool4 y) +{ + return or(x, y); +} + +//CHECK-LABEL: define noundef i1 @_Z11test_or_intii( +//CHECK-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] { +//CHECK-NEXT: [[ENTRY:.*:]] +//CHECK_NEXT: [[0:%.*]] = or i32 [[y]], [[x]] +//CHECK-NEXT: [[HLSL_OR:%.*]] = icmp ne i32 [[0]], 0 +//CHECK-NEXT: ret i1 [[HLSL_OR]] +//CHECK_NEXT: } +bool test_or_int(int x, int y) +{ + return or(x, y); +} + +//CHECK-LABEL: define noundef <4 x i1> @_Z12test_or_int4Dv4_iS_( +//CHECK-SAME: <4 x i32> noundef [[X:%.*]], <4 x i32> noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] { +//CHECK-NEXT: [[ENTRY:.*:]] +//CHECK_NEXT: [[0:%.*]] = or <4 x i32> [[y]], [[x]] +//CHECK-NEXT: [[HLSL_OR:%.*]] = icmp ne <4 x i32> [[0]], zeroinitializer +//CHECK-NEXT: ret <4 x i1> [[HLSL_OR]] +//CHECK_NEXT: } +bool4 test_or_int4(int4 x, int4 y) +{ + return or(x, y); +} + +//CHECK-LABEL: noundef <4 x i1> @_Z14test_or_float4Dv4_fS_( +//CHECK-SAME: <4 x float> noundef nofpclass(nan inf) [[X:%.*]], <4 x float> noundef nofpclass(nan inf) [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] { +//CHECK-NEXT: [[ENTRY:.*:]] +//CHECK-NEXT: [[TOBOOL:%.*]] = fcmp reassoc nnan ninf nsz arcp afn une <4 x float> [[X]], zeroinitializer +//CHECK-NEXT: [[TOBOOL1:%.*]] = fcmp reassoc nnan ninf nsz arcp afn une <4 x float> [[Y]], zeroinitializer +//CHECK-NEXT: [[HLSL_OR:%.*]] = or <4 x i1> [[TOBOOL]], [[TOBOOL1]] +//CHECK-NEXT: ret <4 x i1> [[HLSL_OR]] +//CHECK_NEXT: } +bool4 test_or_float4(float4 x, float4 y) +{ + return or(x, y); +} \ No newline at end of file diff --git a/clang/test/SemaHLSL/logical-operator-errors.hlsl b/clang/test/SemaHLSL/logical-operator-errors.hlsl new file mode 100644 index 0000000000000..41bf3c4b2f663 --- /dev/null +++ b/clang/test/SemaHLSL/logical-operator-errors.hlsl @@ -0,0 +1,27 @@ +// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -verify -DTEST_FUNC=__builtin_hlsl_or +// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -verify -DTEST_FUNC=__builtin_hlsl_and + + +bool test_too_few_arg(bool a) +{ + return TEST_FUNC(a); + // expected-error@-1 {{too few arguments to function call, expected 2, have 1}} +} + +bool test_too_many_arg(bool a) +{ + return TEST_FUNC(a, a, a); + // expected-error@-1 {{too many arguments to function call, expected 2, have 3}} +} + +bool2 test_mismatched_args(bool2 a, bool3 b) +{ + return TEST_FUNC(a, b); + // expected-error@-1 {{all arguments to}}{{.*}}{{must have the same type}} +} + +bool test_incorrect_type(int a) +{ + return TEST_FUNC(a, a); + // expected-error@-1{{invalid operand of type 'int' where 'bool' or a vector of such type is required}} +} \ No newline at end of file >From aa696040b21ba68862c39f913fcea76621fd46d8 Mon Sep 17 00:00:00 2001 From: Poonam Vilas Metkar <poonammet...@microsoft.com> Date: Wed, 26 Feb 2025 16:23:01 -0800 Subject: [PATCH 3/8] Format hlsl_intrinsics.h with clang-format --- clang/lib/Headers/hlsl/hlsl_intrinsics.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index 239d7a3f59b77..764cf671dce31 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -290,6 +290,24 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_and) bool4 and(bool4 x, bool4 y); // clang-format on +//===----------------------------------------------------------------------===// +// or builtins +//===----------------------------------------------------------------------===// + +/// \fn T or(T x, T y) +/// \brief Returns the bitwise OR of the two input values, \a x and \a y. +/// \param x The first input value and y The second input value. +/// +/// \returns The logically OR a vector and retuens bool vector. + +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) +bool or(bool, bool); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) +bool2 or(bool2, bool2); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) +bool3 or(bool3, bool3); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) +bool4 or(bool4, bool4); //===----------------------------------------------------------------------===// // any builtins //===----------------------------------------------------------------------===// >From 659f2fcce0e47182d6faa4db74e01d2734ee6a07 Mon Sep 17 00:00:00 2001 From: Poonam Vilas Metkar <poonammet...@microsoft.com> Date: Wed, 26 Feb 2025 16:36:50 -0800 Subject: [PATCH 4/8] Include HLSL or_intrinsic, add codegen in CGBuiltin, and the corresponding tests in or.hlsl. Additionally, incorporate logical-operator-errors to handle both 'and' and 'or' semantic diagnostics. --- clang/include/clang/Basic/Builtins.td | 6 ++ clang/lib/CodeGen/CGBuiltin.cpp | 5 ++ clang/lib/Sema/SemaHLSL.cpp | 19 +++++ clang/test/CodeGenHLSL/builtins/or.hlsl | 85 +++++++++++++++++++ .../SemaHLSL/logical-operator-errors.hlsl | 27 ++++++ 5 files changed, 142 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/or.hlsl create mode 100644 clang/test/SemaHLSL/logical-operator-errors.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 598ae171b1389..f7027331cd6c5 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4783,6 +4783,12 @@ def HLSLAnd : LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } +def HLSLOr : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_or"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} + def HLSLAny : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_any"]; let Attributes = [NoThrow, Const]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 65fac01d58362..599e05819ec7c 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19492,6 +19492,11 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, Value *Op1 = EmitScalarExpr(E->getArg(1)); return Builder.CreateAnd(Op0, Op1, "hlsl.and"); } + case Builtin::BI__builtin_hlsl_or: { + Value *Op0 = EmitScalarExpr(E->getArg(0)); + Value *Op1 = EmitScalarExpr(E->getArg(1)); + return Builder.CreateOr(Op0, Op1, "hlsl.or"); + } case Builtin::BI__builtin_hlsl_any: { Value *Op0 = EmitScalarExpr(E->getArg(0)); return Builder.CreateIntrinsic( diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 283a9801fc707..c48512673be58 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -2305,6 +2305,25 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { TheCall->setType(ArgTyA); break; } + case Builtin::BI__builtin_hlsl_or: { + if (SemaRef.checkArgCount(TheCall, 2)) + return true; + if (CheckVectorElementCallArgs(&SemaRef, TheCall)) + return true; + + // Ensure input expr type is a scalar/vector and the same as the return type + if (CheckScalarOrVector(&SemaRef, TheCall, getASTContext().BoolTy, 0)) + return true; + + // Ensure input parameter type is bool + ExprResult A = TheCall->getArg(0); + QualType ArgTyA = A.get()->getType(); + + // return type is the same as the input type + TheCall->setType(ArgTyA); + + break; + } case Builtin::BI__builtin_hlsl_all: case Builtin::BI__builtin_hlsl_any: { if (SemaRef.checkArgCount(TheCall, 1)) diff --git a/clang/test/CodeGenHLSL/builtins/or.hlsl b/clang/test/CodeGenHLSL/builtins/or.hlsl new file mode 100644 index 0000000000000..0c21973bda17c --- /dev/null +++ b/clang/test/CodeGenHLSL/builtins/or.hlsl @@ -0,0 +1,85 @@ +// RUN: %clang_cc1 -finclude-default-header -triple \ +// RUN: dxil-pc-shadermodel6.3-library %s \ +// RUN: -emit-llvm -O1 -o - | FileCheck %s + +//CHECK-LABEL: define noundef i1 @_Z12test_or_boolbb( +//CHECK-SAME: i1 noundef [[X:%.*]], i1 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { +//CHECK-NEXT: [[ENTRY:.*:]] +//CHECK-NEXT: [[HLSL_OR:%.*]] = or i1 [[x]], [[y]] +//CHECK-NEXT: ret i1 [[HLSL_OR]] +//CHECK_NEXT: } +bool test_or_bool(bool x, bool y) +{ + return or(x, y); + +} + +//CHECK-LABEL: define noundef <2 x i1> @_Z13test_or_bool2Dv2_bS_( +//CHECK-SAME: <2 x i1> noundef [[X:%.*]], <2 x i1> noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] { +//CHECK-NEXT: [[ENTRY:.*:]] +//CHECK-NEXT: [[HLSL_OR:%.*]] = or <2 xi1> [[x]], [[y]] +//CHECK-NEXT: ret <2 x i1> [[HLSL_OR]] +//CHECK_NEXT: } +bool2 test_or_bool2(bool2 x, bool2 y) +{ + return or(x, y); +} + +//CHECK-LABEL: define noundef <3 x i1> @_Z13test_or_bool3Dv3_bS_( +//CHECK-SAME: <3 x i1> noundef [[X:%.*]], <3 x i1> noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] { +//CHECK-NEXT: [[ENTRY:.*:]] +//CHECK-NEXT: [[HLSL_OR:%.*]] = or <3 xi1> [[x]], [[y]] +//CHECK-NEXT: ret <3 x i1> [[HLSL_OR]] +//CHECK_NEXT: } +bool3 test_or_bool3(bool3 x, bool3 y) +{ + return or(x, y); +} + +//CHECK-LABEL: define noundef <4 x i1> @_Z13test_or_bool4Dv4_bS_( +//CHECK-SAME: <4 x i1> noundef [[X:%.*]], <4 x i1> noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] { +//CHECK-NEXT: [[ENTRY:.*:]] +//CHECK-NEXT: [[HLSL_OR:%.*]] = or <4 xi1> [[x]], [[y]] +//CHECK-NEXT: ret <4 x i1> [[HLSL_OR]] +//CHECK_NEXT: } +bool4 test_or_bool4(bool4 x, bool4 y) +{ + return or(x, y); +} + +//CHECK-LABEL: define noundef i1 @_Z11test_or_intii( +//CHECK-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] { +//CHECK-NEXT: [[ENTRY:.*:]] +//CHECK_NEXT: [[0:%.*]] = or i32 [[y]], [[x]] +//CHECK-NEXT: [[HLSL_OR:%.*]] = icmp ne i32 [[0]], 0 +//CHECK-NEXT: ret i1 [[HLSL_OR]] +//CHECK_NEXT: } +bool test_or_int(int x, int y) +{ + return or(x, y); +} + +//CHECK-LABEL: define noundef <4 x i1> @_Z12test_or_int4Dv4_iS_( +//CHECK-SAME: <4 x i32> noundef [[X:%.*]], <4 x i32> noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] { +//CHECK-NEXT: [[ENTRY:.*:]] +//CHECK_NEXT: [[0:%.*]] = or <4 x i32> [[y]], [[x]] +//CHECK-NEXT: [[HLSL_OR:%.*]] = icmp ne <4 x i32> [[0]], zeroinitializer +//CHECK-NEXT: ret <4 x i1> [[HLSL_OR]] +//CHECK_NEXT: } +bool4 test_or_int4(int4 x, int4 y) +{ + return or(x, y); +} + +//CHECK-LABEL: noundef <4 x i1> @_Z14test_or_float4Dv4_fS_( +//CHECK-SAME: <4 x float> noundef nofpclass(nan inf) [[X:%.*]], <4 x float> noundef nofpclass(nan inf) [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] { +//CHECK-NEXT: [[ENTRY:.*:]] +//CHECK-NEXT: [[TOBOOL:%.*]] = fcmp reassoc nnan ninf nsz arcp afn une <4 x float> [[X]], zeroinitializer +//CHECK-NEXT: [[TOBOOL1:%.*]] = fcmp reassoc nnan ninf nsz arcp afn une <4 x float> [[Y]], zeroinitializer +//CHECK-NEXT: [[HLSL_OR:%.*]] = or <4 x i1> [[TOBOOL]], [[TOBOOL1]] +//CHECK-NEXT: ret <4 x i1> [[HLSL_OR]] +//CHECK_NEXT: } +bool4 test_or_float4(float4 x, float4 y) +{ + return or(x, y); +} \ No newline at end of file diff --git a/clang/test/SemaHLSL/logical-operator-errors.hlsl b/clang/test/SemaHLSL/logical-operator-errors.hlsl new file mode 100644 index 0000000000000..41bf3c4b2f663 --- /dev/null +++ b/clang/test/SemaHLSL/logical-operator-errors.hlsl @@ -0,0 +1,27 @@ +// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -verify -DTEST_FUNC=__builtin_hlsl_or +// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -verify -DTEST_FUNC=__builtin_hlsl_and + + +bool test_too_few_arg(bool a) +{ + return TEST_FUNC(a); + // expected-error@-1 {{too few arguments to function call, expected 2, have 1}} +} + +bool test_too_many_arg(bool a) +{ + return TEST_FUNC(a, a, a); + // expected-error@-1 {{too many arguments to function call, expected 2, have 3}} +} + +bool2 test_mismatched_args(bool2 a, bool3 b) +{ + return TEST_FUNC(a, b); + // expected-error@-1 {{all arguments to}}{{.*}}{{must have the same type}} +} + +bool test_incorrect_type(int a) +{ + return TEST_FUNC(a, a); + // expected-error@-1{{invalid operand of type 'int' where 'bool' or a vector of such type is required}} +} \ No newline at end of file >From a770cbfcaf22a465048a6551b845e7cdce5f3138 Mon Sep 17 00:00:00 2001 From: Poonam Vilas Metkar <poonammet...@microsoft.com> Date: Wed, 26 Feb 2025 17:16:22 -0800 Subject: [PATCH 5/8] Fix: logical-operator-errors.hlsl location --- clang/test/SemaHLSL/{ => BuiltIns}/logical-operator-errors.hlsl | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename clang/test/SemaHLSL/{ => BuiltIns}/logical-operator-errors.hlsl (100%) diff --git a/clang/test/SemaHLSL/logical-operator-errors.hlsl b/clang/test/SemaHLSL/BuiltIns/logical-operator-errors.hlsl similarity index 100% rename from clang/test/SemaHLSL/logical-operator-errors.hlsl rename to clang/test/SemaHLSL/BuiltIns/logical-operator-errors.hlsl >From cc26694fb2ad676760a87d104627bbf5cb0b403a Mon Sep 17 00:00:00 2001 From: Poonam Vilas Metkar <poonammet...@microsoft.com> Date: Wed, 26 Feb 2025 17:19:45 -0800 Subject: [PATCH 6/8] Remove and-errors.hlsl file; tests handled in logical-operator-errors.hlsl --- clang/test/SemaHLSL/BuiltIns/and-errors.hlsl | 22 -------------------- 1 file changed, 22 deletions(-) delete mode 100644 clang/test/SemaHLSL/BuiltIns/and-errors.hlsl diff --git a/clang/test/SemaHLSL/BuiltIns/and-errors.hlsl b/clang/test/SemaHLSL/BuiltIns/and-errors.hlsl deleted file mode 100644 index d9721140b9bf9..0000000000000 --- a/clang/test/SemaHLSL/BuiltIns/and-errors.hlsl +++ /dev/null @@ -1,22 +0,0 @@ -// RUN: %clang_cc1 -finclude-default-header -triple \ -// RUN: dxil-pc-shadermodel6.3-library %s -O1 -verify - -bool test_too_few_arg(bool a) { - return __builtin_hlsl_and(a); - // expected-error@-1 {{too few arguments to function call, expected 2, have 1}} -} - -bool test_too_many_arg(bool a) { - return __builtin_hlsl_and(a, a, a); - // expected-error@-1 {{too many arguments to function call, expected 2, have 3}} -} - -bool2 test_mismatched_args(bool2 a, bool3 b) { - return __builtin_hlsl_and(a, b); - // expected-error@-1 {{all arguments to '__builtin_hlsl_and' must have the same type}} -} - -bool test_incorrect_type(int a) { - return __builtin_hlsl_and(a, a); - // expected-error@-1{{invalid operand of type 'int' where 'bool' or a vector of such type is required}} -} >From d99e734b90de342ae673c993c45e48d16774181c Mon Sep 17 00:00:00 2001 From: Poonam Vilas Metkar <poonammet...@microsoft.com> Date: Wed, 26 Feb 2025 20:55:31 -0800 Subject: [PATCH 7/8] Address the review comments --- clang/lib/Headers/hlsl/hlsl_intrinsics.h | 4 ++-- clang/test/CodeGenHLSL/builtins/or.hlsl | 2 +- clang/test/SemaHLSL/BuiltIns/logical-operator-errors.hlsl | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index 764cf671dce31..e7dee43d674d8 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -298,8 +298,7 @@ bool4 and(bool4 x, bool4 y); /// \brief Returns the bitwise OR of the two input values, \a x and \a y. /// \param x The first input value and y The second input value. /// -/// \returns The logically OR a vector and retuens bool vector. - +/// \returns A boolean vector by performing a logical OR operation elementwise. _HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) bool or(bool, bool); _HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) @@ -308,6 +307,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) bool3 or(bool3, bool3); _HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) bool4 or(bool4, bool4); + //===----------------------------------------------------------------------===// // any builtins //===----------------------------------------------------------------------===// diff --git a/clang/test/CodeGenHLSL/builtins/or.hlsl b/clang/test/CodeGenHLSL/builtins/or.hlsl index 0c21973bda17c..28127bbfb88dc 100644 --- a/clang/test/CodeGenHLSL/builtins/or.hlsl +++ b/clang/test/CodeGenHLSL/builtins/or.hlsl @@ -82,4 +82,4 @@ bool4 test_or_int4(int4 x, int4 y) bool4 test_or_float4(float4 x, float4 y) { return or(x, y); -} \ No newline at end of file +} diff --git a/clang/test/SemaHLSL/BuiltIns/logical-operator-errors.hlsl b/clang/test/SemaHLSL/BuiltIns/logical-operator-errors.hlsl index 41bf3c4b2f663..601851ed82fd2 100644 --- a/clang/test/SemaHLSL/BuiltIns/logical-operator-errors.hlsl +++ b/clang/test/SemaHLSL/BuiltIns/logical-operator-errors.hlsl @@ -24,4 +24,4 @@ bool test_incorrect_type(int a) { return TEST_FUNC(a, a); // expected-error@-1{{invalid operand of type 'int' where 'bool' or a vector of such type is required}} -} \ No newline at end of file +} >From b72a19750927aed35fd6d777d732fb1e77ee2024 Mon Sep 17 00:00:00 2001 From: Poonam Vilas Metkar <poonammet...@microsoft.com> Date: Wed, 26 Feb 2025 22:03:18 -0800 Subject: [PATCH 8/8] Address review comments --- clang/lib/Headers/hlsl/hlsl_intrinsics.h | 14 +++++++++----- clang/lib/Sema/SemaHLSL.cpp | 3 +-- clang/test/CodeGenHLSL/builtins/or.hlsl | 3 +-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index e7dee43d674d8..5b625f785a3d3 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -294,11 +294,14 @@ bool4 and(bool4 x, bool4 y); // or builtins //===----------------------------------------------------------------------===// -/// \fn T or(T x, T y) -/// \brief Returns the bitwise OR of the two input values, \a x and \a y. -/// \param x The first input value and y The second input value. -/// -/// \returns A boolean vector by performing a logical OR operation elementwise. +/// \fn bool or(bool x, bbol y) +/// \brief Logically ors two boolean vectors elementwise and produces a bool +/// vector output. + +// TODO: Clean up clang-format marker once we've resolved +// https://github.com/llvm/llvm-project/issues/128979 +// +// clang-format off _HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) bool or(bool, bool); _HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) @@ -307,6 +310,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) bool3 or(bool3, bool3); _HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) bool4 or(bool4, bool4); +// clang-format on //===----------------------------------------------------------------------===// // any builtins diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index c48512673be58..733c1524bded0 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -2311,11 +2311,10 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { if (CheckVectorElementCallArgs(&SemaRef, TheCall)) return true; - // Ensure input expr type is a scalar/vector and the same as the return type + // Ensure input expr type is a scalar/vector of type Boolty if (CheckScalarOrVector(&SemaRef, TheCall, getASTContext().BoolTy, 0)) return true; - // Ensure input parameter type is bool ExprResult A = TheCall->getArg(0); QualType ArgTyA = A.get()->getType(); diff --git a/clang/test/CodeGenHLSL/builtins/or.hlsl b/clang/test/CodeGenHLSL/builtins/or.hlsl index 28127bbfb88dc..843c1bfc1eb79 100644 --- a/clang/test/CodeGenHLSL/builtins/or.hlsl +++ b/clang/test/CodeGenHLSL/builtins/or.hlsl @@ -8,10 +8,9 @@ //CHECK-NEXT: [[HLSL_OR:%.*]] = or i1 [[x]], [[y]] //CHECK-NEXT: ret i1 [[HLSL_OR]] //CHECK_NEXT: } -bool test_or_bool(bool x, bool y) +bool test_and_scalar(bool x, bool y) { return or(x, y); - } //CHECK-LABEL: define noundef <2 x i1> @_Z13test_or_bool2Dv2_bS_( _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits