On 29.08.23 18:28, Jakub Jelinek wrote:
One thing is that for C++ one needs to be careful about vars optimized
by NRV by the FE.
Thanks for the warning.
And, just from the gimplify_bind_expr function name,
(I forgot that one change in there which makes it look larger is that
I moved the stack handling below the variable cleaning as it makes sense
to GOMP_free before instead of after wiping the stack via
__builtin_stack_restore.)
I'm guessing you are adding the allocations at the start of surrounding
BIND_EXPR, is that where
we generally want to allocate them?
I actually started with this in a FE implementation, but that
does not work in general. I need to put the GOMP_alloc right
before the associated DECL_EXPR, otherwise, it will break for
code like:
omp_allocator_handle_t my_allocator = omp_low_lat_mem_alloc;
int n = 5;
pragma omp allocate(n) allocator(my_allocator)
int B[n]
where my_allocator strictly needs to be (initialized) before
GOMP_alloc and the 'n = 5' - but that needs in turn to happen
before the 'int B[n]' to make sure 'n' is allocated and has
the value 5.
Other option is on DECL_EXPR, e.g. for C++ right before they are
constructed, or for C initialized if they have initializer. Though, that
can have a drawback, one can e.g. in C (and I think in C++ too as long as
the vars don't need any kind of construction) jump across that
initialization and one would then bypass this allocation.
For your example, I get (the full gimple dump is below):
foo.c:7:11: warning: statement will never be executed [-Wswitch-unreachable]
7 | int j;
I wonder whether we should just error out as GCC does when using a VLA
at that place:
error: switch jumps into scope of identifier with variably modified type
(with a similar but modified msg wording.) In a sense, the 'allocate' is very
similar to VLA such that we should be able to piggyback on the VLA diagnostic.
Tobias
PS: The gimple dump for your program:
void foo (int i)
{
switch (i) <default: <D.2896>, case 42: <D.2895>>
{
int j [value-expr: *D.2899];
try
{
D.2899 = __builtin_GOMP_alloc (0, 4, 0B);
<D.2895>:
*D.2899 = 5;
use (D.2899);
goto <D.2897>;
<D.2896>:
*D.2899 = 24;
use (D.2899);
goto <D.2897>;
}
finally
{
__builtin_GOMP_free (D.2899, 0B);
}
}
<D.2897>:
}
-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634
München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas
Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht
München, HRB 106955