================
@@ -2245,6 +2245,17 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned 
BuiltinID, CallExpr *TheCall) {
 
     break;
   }
+  case Builtin::BI__builtin_hlsl_and: {
+    if (SemaRef.checkArgCount(TheCall, 2))
+      return true;
+    if (CheckVectorElementCallArgs(&SemaRef, TheCall))
+      return true;
+    ExprResult A = TheCall->getArg(0);
----------------
Icohedron wrote:

Oh! I think I understand now. I was mistakenly thinking that `and`  (defined in 
`hlsl_intrinsics.h`) and `__builtin_hlsl_and` were equivalent because they 
"alias".

Please correct me if I get anything wrong as I try to explain in my own words:

- The `and` function is just a front for the actual implementation which is the 
`__builtin_hlsl_and` builtin

  - When the `and` function is used in HLSL, the compiler will, among other 
things, insert the instructions for implicitly casting args into the correct 
types (in this case, bools or bool vectors)

  - Whereas the `__builtin_hlsl_and` function has a signature of `void(...)` as 
defined in `Builtins.td`, so no implicit casts will be inserted if the 
`__builtin_hlsl_and` is used instead

  - Meanwhile, `and` has no definition, hence when `and` is used, it must be 
replaced by `__builtin_hlsl_and` -- as specified by the 
`_HLSL_BUILTIN_ALIAS(__builtin_hlsl_and)` annotation preceding each of the 
`and` function declarations in `hlsl_intrinsics.h`.

- You suggest to check that the vector element type is a bool in `SemaHLSL.cpp` 
(which defines the semantics for `__builtin_hlsl_and`) just in case someone 
tries to use `__builtin_hlsl_and` instead of `and` and attempts to pass 
non-bool (vector) arguments to it

https://github.com/llvm/llvm-project/pull/127098
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to