https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121922
Bug ID: 121922
Summary: wrong code for "declare variant" replacement involving
user/condition selector
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Keywords: openmp
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: sandra at gcc dot gnu.org
Target Milestone: ---
Created attachment 62371
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=62371&action=edit
test case borked-flag.c
The attached test case compiled with
x86_64-linux-gnu-gcc -S -fopenmp -fdump-tree-gimple borked-flag.c
produces this output from the gimplifier (where the declare variant replacement
happens):
void doit ()
{
int iftmp.0;
int iftmp.2;
int iftmp.3;
flag = 0;
flag.1_1 = flag;
if (flag.1_1 > 1) goto <D.3116>; else goto <D.3117>;
<D.3116>:
iftmp.0 = test_with_flag ();
goto <D.3118>;
<D.3117>:
iftmp.0 = test ();
<D.3118>:
if (iftmp.0 != 0) goto <D.3119>; else goto <D.3120>;
<D.3119>:
__builtin_abort ();
<D.3120>:
flag = 1;
if (flag.1_1 > 1) goto <D.3122>; else goto <D.3123>;
<D.3122>:
iftmp.2 = test_with_flag ();
goto <D.3124>;
<D.3123>:
iftmp.2 = test ();
<D.3124>:
if (iftmp.2 != 0) goto <D.3125>; else goto <D.3126>;
<D.3125>:
__builtin_abort ();
<D.3126>:
flag = 42;
if (flag.1_1 > 1) goto <D.3128>; else goto <D.3129>;
<D.3128>:
iftmp.3 = test_with_flag ();
goto <D.3130>;
<D.3129>:
iftmp.3 = test ();
<D.3130>:
if (iftmp.3 != 42) goto <D.3131>; else goto <D.3132>;
<D.3131>:
__builtin_abort ();
<D.3132>:
}
Note that it's properly setting "flag" before each call to the variant function
per the explicit assignments in the original code, but all the variant call
expansions for the dynamic selector are testing "flag.1_1" -- which only gets
set once at the beginning of the function.
Using g++ instead of gcc produces the same output. This is surely happening in
the gimplifier or the support functions in omp-general.cc.