------- Comment #11 from dorit at il dot ibm dot com 2006-02-28 08:26 ------- Created an attachment (id=10935) --> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=10935&action=view) tentative patch
I get a similar error message when trying to bootstrap mainline with vectorization enabled: /home/dorit/mainline_svn/build2/./prev-gcc/xgcc -B/home/dorit/mainline_svn/build2/./prev-gcc/ -B/home/dorit/mainline_svn2/ppc64-yellowdog-linux/bin/ -c -g -O2 -ftree-vectorize -maltivec -DIN_GCC -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -Wold-style-definition -Wmissing-format-attribute -Werror -fno-common -DHAVE_CONFIG_H -I. -I. -I../../gcc/gcc -I../../gcc/gcc/. -I../../gcc/gcc/../include -I../../gcc/gcc/../libcpp/include -I../../gcc/gcc/../libdecnumber -I../libdecnumber ../../gcc/gcc/recog.c -o recog.o ../../gcc/gcc/recog.c: In function âconstrain_operandsâ: ../../gcc/gcc/recog.c:2270: internal compiler error: tree check: expected ssa_name, have struct_field_tag in verify_ssa, at tree-ssa.c:735 make[3]: *** [recog.o] Error 1 make[3]: Leaving directory `/home/dorit/mainline_svn/build2/gcc' make[2]: *** [all-stage2-gcc] Error 2 make[2]: Leaving directory `/home/dorit/mainline_svn/build2' make[1]: *** [stage2-bubble] Error 2 make[1]: Leaving directory `/home/dorit/mainline_svn/build2' make: *** [bootstrap] Error 2 Following Zdenek's observations, I tried the attached patch. It solves this failure above in recog.c, but it fails bootstrap with vectorization enabled later on. (It does pass regular bootstrap on ppc-linux). So this patch needs to be further examined, but I wonder if it fixes this PR (I can't reproduce it)? About the patch: new_type_alias() originally looked like this: TAG <- new tag for ptr; if (var has subvars){ foreach subvar add the subvar as may-alias of TAG. } else{ get the may-aliases of var; if (|may-aliases| == 1) set the (single) may-alias of var as the new tag of ptr; else if (|may-aliases| == 0) add var as may-alias of the TAG; else /* |may-aliases| > 1 */ add the may-aliases of var as may-aliases of TAG; } What I did is basically factored out the 'else' part into a separate function, and called that function also in the 'if' part, for each subvar; this way, we don't add the subvar as may-alias of TAG if the subvar itself has may-aliases, but add its may-aliases instead: new version of new_type_alias(): TAG <- new tag for ptr; if (var has subvars){ foreach subvar add_may_aliases_for_new_tag (TAG, subvar) } else{ add_may_aliases_for_new_tag (TAG, var) } add_may_aliases_for_new_tag (TAG, var) { get the may-aliases of var; if (|may-aliases| == 1) set the (single) may-alias of var as the new tag of ptr; else if (|may-aliases| == 0) add var as may-alias of the TAG; else /* |may-aliases| > 1 */ add the may-aliases of var as may-aliases of TAG; } Makes sense to anyone? -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26197