libgomp: Fix up bootstrap in libgomp/target.c due to false positive warning

> On 10/20/20 2:11 PM, Tobias Burnus wrote:
>
> > Unfortunately, the committed patch
> > (r11-4121-g1bfc07d150790fae93184a79a7cce897655cb37b)
> > causes build errors.
> >
> > The error seems to be provoked by function cloning – as the code
> > itself looks fine:
> > ...
> >  struct gomp_device_descr *devices_s
> >     = malloc (num_devices * sizeof (struct gomp_device_descr));
> > ...
> >   for (i = 0; i < num_devices; i++)
> >     if (!(devices[i].capabilities & GOMP_OFFLOAD_CAP_OPENMP_400))
> >       devices_s[num_devices_after_openmp++] = devices[i];
>
> gomp_target_init.part.0 ()
> {
> ...
> <bb 2>
>   devices_s_1 = malloc (0);
> ...
>   num_devices.16_67 = num_devices;
> ...
>   if (num_devices.16_67 > 0)
>     goto <bb 3>; [89.00%]
>   else
>     goto <bb 18>; [11.00%]
>
> Which seems to have an ordering problem.

This patch fixes the warning that breaks the bootstrap.

2020-10-20  Jakub Jelinek  <jakub@redhat.com>

	* target.c (gomp_target_init): Inside of the function, use automatic
	variables corresponding to num_devices, num_devices_openmp and devices
	global variables and update the globals only at the end of the
	function.
This commit is contained in:
Jakub Jelinek 2020-10-20 16:38:24 +02:00
parent 953277ba3f
commit 35f258f4bb

View file

@ -3279,10 +3279,9 @@ gomp_target_init (void)
const char *suffix = SONAME_SUFFIX (1);
const char *cur, *next;
char *plugin_name;
int i, new_num_devices;
num_devices = 0;
devices = NULL;
int i, new_num_devs;
int num_devs = 0, num_devs_openmp;
struct gomp_device_descr *devs = NULL;
if (gomp_target_offload_var == GOMP_TARGET_OFFLOAD_DISABLED)
return;
@ -3303,7 +3302,7 @@ gomp_target_init (void)
plugin_name = (char *) malloc (prefix_len + cur_len + suffix_len + 1);
if (!plugin_name)
{
num_devices = 0;
num_devs = 0;
break;
}
@ -3313,16 +3312,16 @@ gomp_target_init (void)
if (gomp_load_plugin_for_device (&current_device, plugin_name))
{
new_num_devices = current_device.get_num_devices_func ();
if (new_num_devices >= 1)
new_num_devs = current_device.get_num_devices_func ();
if (new_num_devs >= 1)
{
/* Augment DEVICES and NUM_DEVICES. */
devices = realloc (devices, (num_devices + new_num_devices)
* sizeof (struct gomp_device_descr));
if (!devices)
devs = realloc (devs, (num_devs + new_num_devs)
* sizeof (struct gomp_device_descr));
if (!devs)
{
num_devices = 0;
num_devs = 0;
free (plugin_name);
break;
}
@ -3332,12 +3331,12 @@ gomp_target_init (void)
current_device.type = current_device.get_type_func ();
current_device.mem_map.root = NULL;
current_device.state = GOMP_DEVICE_UNINITIALIZED;
for (i = 0; i < new_num_devices; i++)
for (i = 0; i < new_num_devs; i++)
{
current_device.target_id = i;
devices[num_devices] = current_device;
gomp_mutex_init (&devices[num_devices].lock);
num_devices++;
devs[num_devs] = current_device;
gomp_mutex_init (&devs[num_devs].lock);
num_devs++;
}
}
}
@ -3349,34 +3348,37 @@ gomp_target_init (void)
/* In DEVICES, sort the GOMP_OFFLOAD_CAP_OPENMP_400 ones first, and set
NUM_DEVICES_OPENMP. */
struct gomp_device_descr *devices_s
= malloc (num_devices * sizeof (struct gomp_device_descr));
if (!devices_s)
struct gomp_device_descr *devs_s
= malloc (num_devs * sizeof (struct gomp_device_descr));
if (!devs_s)
{
num_devices = 0;
free (devices);
devices = NULL;
num_devs = 0;
free (devs);
devs = NULL;
}
num_devices_openmp = 0;
for (i = 0; i < num_devices; i++)
if (devices[i].capabilities & GOMP_OFFLOAD_CAP_OPENMP_400)
devices_s[num_devices_openmp++] = devices[i];
int num_devices_after_openmp = num_devices_openmp;
for (i = 0; i < num_devices; i++)
if (!(devices[i].capabilities & GOMP_OFFLOAD_CAP_OPENMP_400))
devices_s[num_devices_after_openmp++] = devices[i];
free (devices);
devices = devices_s;
num_devs_openmp = 0;
for (i = 0; i < num_devs; i++)
if (devs[i].capabilities & GOMP_OFFLOAD_CAP_OPENMP_400)
devs_s[num_devs_openmp++] = devs[i];
int num_devs_after_openmp = num_devs_openmp;
for (i = 0; i < num_devs; i++)
if (!(devs[i].capabilities & GOMP_OFFLOAD_CAP_OPENMP_400))
devs_s[num_devs_after_openmp++] = devs[i];
free (devs);
devs = devs_s;
for (i = 0; i < num_devices; i++)
for (i = 0; i < num_devs; i++)
{
/* The 'devices' array can be moved (by the realloc call) until we have
found all the plugins, so registering with the OpenACC runtime (which
takes a copy of the pointer argument) must be delayed until now. */
if (devices[i].capabilities & GOMP_OFFLOAD_CAP_OPENACC_200)
goacc_register (&devices[i]);
if (devs[i].capabilities & GOMP_OFFLOAD_CAP_OPENACC_200)
goacc_register (&devs[i]);
}
num_devices = num_devs;
num_devices_openmp = num_devs_openmp;
devices = devs;
if (atexit (gomp_target_fini) != 0)
gomp_fatal ("atexit failed");
}