[PATCH] D150985: [clang] Allow fp in atomic fetch max/min builtins
Yaxun Liu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed May 31 11:53:52 PDT 2023
yaxunl marked 4 inline comments as done.
yaxunl added inline comments.
================
Comment at: clang/lib/Sema/SemaChecking.cpp:6576-6578
if (!ValType->isFloatingType())
return false;
+ if (!(AllowedType & AOAVT_FP))
----------------
tra wrote:
> Collapse into a single if statement: `if (!(ValType->isFloatingType() && (AllowedType & AOAVT_FP)))`
will do
================
Comment at: clang/lib/Sema/SemaChecking.cpp:6588
+ if (!IsAllowedValueType(ValType, ArithAllows)) {
+ assert(ArithAllows & AOAVT_Integer);
+ auto DID = ArithAllows & AOAVT_FP
----------------
tra wrote:
> Why do we expect a failed `IsAllowedValueType` check to fail only if we were allowed integers? Is that because we assume that all atomic instructions support integers?
>
> If that's the case, I'd hoist the assertion and apply it right after we're done setting `ArithAllows`. Alternatively, we could discard `AOAVT_Integer` and call the enum `ArithOpExtraValueType`. Tracking a bit that's always set does not buy us much, though it does make the code a bit more uniform. Up to you.
>
>
>
we assume integer is always allowed. AOAVT_Integer is for uniformity. I will change the enum to ArithOpExtraValueType and remove AOAVT_Integer
================
Comment at: clang/test/Sema/atomic-ops.c:134
int *I, const int *CI,
int **P, float *D, struct S *s1, struct S *s2) {
__c11_atomic_init(I, 5); // expected-error {{pointer to _Atomic}}
----------------
tra wrote:
> I wonder why we have this inconsistency in the non-atomic arguments.
> We don't actually have any double variants and the argument `D` is actually a `float *`, even though the naming convention used suggests that it should've been either a `double *` or should be called `F`.
>
will rename it to F and add double *D
================
Comment at: clang/test/Sema/atomic-ops.c:218
__atomic_fetch_sub(s1, 3, memory_order_seq_cst); // expected-error {{must be a pointer to integer, pointer or supported floating point type}}
- __atomic_fetch_min(D, 3, memory_order_seq_cst); // expected-error {{must be a pointer to integer}}
- __atomic_fetch_max(P, 3, memory_order_seq_cst); // expected-error {{must be a pointer to integer}}
+ __atomic_fetch_min(D, 3, memory_order_seq_cst);
+ __atomic_fetch_max(P, 3, memory_order_seq_cst); // expected-error {{must be a pointer to integer or supported floating point type}}
----------------
tra wrote:
> We seem to be missing the tests for `double *` here, too.
will add it
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D150985/new/
https://reviews.llvm.org/D150985
More information about the cfe-commits
mailing list