Hi. Sorry for the late reply. On 03/02, Richard Biener wrote: > On Thu, Feb 27, 2020 at 6:56 PM Giuliano Belinassi > <giuliano.belina...@usp.br> wrote: > > > > Hi, all. > > > > I am tying to fix an issue with a global variable in the parallel gcc > > project. For this, I am trying to move some global variables from > > tree-ssa-operands to struct function. One of this variable is a > > vec<tree*> type, and gengtype doesn't look so happy with it. > > I think the solution for this is to not move it to struct function > but instead have it local to function scope - the state is per > GIMPLE stmt we process and abstracting what is > cleaned up in cleanup_build_arrays() into a class we can > instantiate in the two callers is most appropriate. In theory > all the functions that access the state could move into the > class as methods as well but you can pass down the state > everywhere needed as well.
I implemented this strategy, but the issue remains. Therefore, the cause of it must be something else. Just to contextualize, in [1], I also implemented parallelism in ParallelGcc using a pipeline method for testing, where I split the set of GIMPLE Intra Procedural Optimizations into multiple sets, and assign each set to a thread. Then, the function passes through this pipeline. Now, I am trying to make this version pass the testsuite. There is a test in particular ('gcc.dg/20031102-1.c') that I am having difficulties finding the cause of the issue. if I run: /tmp/gcc10_parallel/usr/local/bin/gcc --param=num-threads=2 -O2 -c 20031102-1.c The crash message is: ``` <var_decl 0x7f443363c720 .MEM type <void_type 0x7f44334fb000 void VOID align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7f44334fb000 pointer_to_this <pointer_type 0x7f44334fb0b0>> used static ignored external VOID <built-in>:0:0 align:8 warn_if_not_align:0> In function ‘main’: cc1: error: virtual use of statement not up to date # VUSE <.MEM_1(D)> _2 = FooBar (); during GIMPLE pass: walloca cc1: internal compiler error: verify_ssa failed 0xfdb8fe verify_ssa(bool, bool) ../../gcc/gcc/tree-ssa.c:1208 0xcd3d08 execute_function_todo ../../gcc/gcc/passes.c:2017 0xcd49f2 execute_todo ../../gcc/gcc/passes.c:2064 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions. ``` Which is triggered by tree-ssa-operands.c:1066 in this branch, checking if build_vuse != use. Interestingly, this crash does not happens if: 1 - I set the number of threads to 1. 2 - I set the optimization level to O0, O1 or O3. 3 - I disable O2, but enable all flags enabled by O2 (gcc -O2 -Q --help=optimizer). 4 - I left the first 115 passes in the same thread with a parameter I implmemented (--param=num-threads=2 --param=break=116). Any value smaller that this causes the issue. The crash is also consistent, which means that it happens 100% of time. Any light concerning this issue is welcome. :) If anyone want to reproduce the issue, you can clone this branch, then compile with --disable-bootstrap --enable-language=c, and install it like trunk's GCC. [1] - https://gitlab.com/flusp/gcc/-/tree/giulianob_parallel_pipeline Thank you, Giuliano. > > Richard. > > > In this context, I am trying to add support to vec<tree*> to gengtype. > > Therefore, I first fixed a problem where gengtype couldn't find the > > tree union by: > > > > diff --git a/gcc/gengtype.c b/gcc/gengtype.c > > index 53317337cf8..6f4c77020ea 100644 > > --- a/gcc/gengtype.c > > +++ b/gcc/gengtype.c > > @@ -638,7 +638,10 @@ create_user_defined_type (const char *type_name, > > struct fil > > eloc *pos) > > /* Strip off the first '*' character (and any subsequent > > text). */ > > *(field_name + offset_to_star) = '\0'; > > > > - arg_type = find_structure (field_name, TYPE_STRUCT); > > + arg_type = resolve_typedef (field_name, pos); > > + if (!arg_type) > > + arg_type = find_structure (field_name, TYPE_STRUCT); > > + > > arg_type = create_pointer (arg_type); > > } > > else > > > > After this patch, gengtype seems to correctly detect vec<tree*> types, > > but then I face linking issues. At first, the compiler could not find > > gt_ggc_mx (vec<T> *v) and gt_pch_mx (vec<T> *v), therefore I implemented > > them both in gcc/vec.h: > > > > diff --git a/gcc/vec.h b/gcc/vec.h > > index 091056b37bc..dfa744b684e 100644 > > --- a/gcc/vec.h > > +++ b/gcc/vec.h > > @@ -1306,6 +1306,15 @@ vec<T, A, vl_embed>::quick_grow_cleared (unsigned > > len) > > vec_default_construct (address () + oldlen, growby); > > } > > > > +template<typename T> > > +void > > +gt_ggc_mx (vec<T> *v) > > +{ > > + extern void gt_ggc_mx (T &); > > + for (unsigned i = 0; i < v->length (); i++) > > + gt_ggc_mx ((*v)[i]); > > +} > > + > > /* Garbage collection support for vec<T, A, vl_embed>. */ > > > > template<typename T> > > @@ -1328,6 +1337,15 @@ gt_ggc_mx (vec<T, va_gc_atomic, vl_embed> *v > > ATTRIBUTE_UNUSED) > > > > /* PCH support for vec<T, A, vl_embed>. */ > > > > +template<typename T> > > +void > > +gt_pch_nx (vec<T> *v) > > +{ > > + extern void gt_pch_nx (T &); > > + for (unsigned i = 0; i < v->length (); i++) > > + gt_pch_nx ((*v)[i]); > > +} > > + > > template<typename T, typename A> > > void > > gt_pch_nx (vec<T, A, vl_embed> *v) > > @@ -1337,6 +1355,14 @@ gt_pch_nx (vec<T, A, vl_embed> *v) > > gt_pch_nx ((*v)[i]); > > } > > > > +template<typename T> > > +void > > +gt_pch_nx (vec<T *> *v, gt_pointer_operator op, void *cookie) > > +{ > > + for (unsigned i = 0; i < v->length (); i++) > > + op (&((*v)[i]), cookie); > > +} > > + > > template<typename T, typename A> > > void > > gt_pch_nx (vec<T *, A, vl_embed> *v, gt_pointer_operator op, void *cookie) > > @@ -1354,6 +1380,15 @@ gt_pch_nx (vec<T, A, vl_embed> *v, > > gt_pointer_operator op, void *cookie) > > gt_pch_nx (&((*v)[i]), op, cookie); > > } > > > > +template<typename T> > > +void > > +gt_pch_nx (vec<T> *v, gt_pointer_operator op, void *cookie) > > +{ > > + extern void gt_pch_nx (T *, gt_pointer_operator, void *); > > + for (unsigned i = 0; i < v->length (); i++) > > + gt_pch_nx (&((*v)[i]), op, cookie); > > +} > > + > > > > After that, I get linking errors because the linker can not find > > gt_ggc_mx (tree *&x) nor void gt_pch_nx (tree *&x). The thing > > is: it doesn't matter where I implement them, or if I declare > > them inline. I always get a linking error one way or another. > > > > Therefore, what should I do to correctly implement the support > > for vec<tree*> types? > > > > Thank you, > > Giuliano.