On April 19, 2019 10:52:50 AM GMT+02:00, Jakub Jelinek <ja...@redhat.com> wrote: >Hi! > >We use SSA_NAMEs even for vector types which have BLKmode, e.g. neither >x86 >nor sparc targets have V1SFmode and thus such VECTOR_TYPEs have >BLKmode. >In some cases outof ssa subpass calls get_temp_reg, but that will >gen_reg_rtx (BLKmode) in that case, which is something that doesn't >really >work. The following patch fixes it by using a stack slot for the >BLKmode >SSA_NAMEs instead. > >Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. Richard. >2019-04-19 Jakub Jelinek <ja...@redhat.com> > > PR middle-end/90139 > * tree-outof-ssa.c (get_temp_reg): If reg_mode is BLKmode, return > assign_temp instead of gen_reg_rtx. > > * gcc.c-torture/compile/pr90139.c: New test. > >--- gcc/tree-outof-ssa.c.jj 2019-03-19 07:46:45.136798336 +0100 >+++ gcc/tree-outof-ssa.c 2019-04-18 15:40:33.801698542 +0200 >@@ -653,6 +653,8 @@ get_temp_reg (tree name) > tree type = TREE_TYPE (name); > int unsignedp; > machine_mode reg_mode = promote_ssa_mode (name, &unsignedp); >+ if (reg_mode == BLKmode) >+ return assign_temp (type, 0, 0); > rtx x = gen_reg_rtx (reg_mode); > if (POINTER_TYPE_P (type)) > mark_reg_pointer (x, TYPE_ALIGN (TREE_TYPE (type))); >--- gcc/testsuite/gcc.c-torture/compile/pr90139.c.jj 2019-04-18 >15:39:16.121974160 +0200 >+++ gcc/testsuite/gcc.c-torture/compile/pr90139.c 2019-04-18 >15:37:08.947062569 +0200 >@@ -0,0 +1,20 @@ >+/* PR middle-end/90139 */ >+ >+typedef float __attribute__((vector_size (sizeof (float)))) V; >+void bar (int, V *); >+int l; >+ >+void >+foo (void) >+{ >+ V n, b, o; >+ while (1) >+ switch (l) >+ { >+ case 0: >+ o = n; >+ n = b; >+ b = o; >+ bar (1, &o); >+ } >+} > > Jakub