This makes it less likely (for example through the PRE path) to trigger
target bugs like PR68273 where targets use type alignment of call
arguments to decide on the ABI.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

IMHO targets should still be fixed.

Richard.

2016-02-08  Richard Biener  <rguent...@suse.de>
        Jeff Law  <l...@redhat.com>

        PR target/68273
        * tree-ssanames.c (make_ssa_name_fn): Always use unqualified
        types for anonymous SSA names.

        * gcc.target/mips/pr68273.c: New testcase.

Index: gcc/tree-ssanames.c
===================================================================
--- gcc/tree-ssanames.c (revision 233208)
+++ gcc/tree-ssanames.c (working copy)
@@ -286,7 +286,7 @@ make_ssa_name_fn (struct function *fn, t
 
   if (TYPE_P (var))
     {
-      TREE_TYPE (t) = var;
+      TREE_TYPE (t) = TYPE_MAIN_VARIANT (var);
       SET_SSA_NAME_VAR_OR_IDENTIFIER (t, NULL_TREE);
     }
   else
Index: gcc/testsuite/gcc.target/mips/pr68273.c
===================================================================
--- gcc/testsuite/gcc.target/mips/pr68273.c     (revision 0)
+++ gcc/testsuite/gcc.target/mips/pr68273.c     (revision 0)
@@ -0,0 +1,79 @@
+/* { dg-do compile } */
+/* { dg-options "-w -fdump-rtl-expand" } */
+/* { dg-skip-if "" { *-*-* }  { } { "-O2" } } */
+
+extern char errbuf[];
+typedef struct Symbol
+{
+  char *name;
+}
+Symbol;
+typedef struct Tnode
+{
+}
+Tnode;
+typedef union Value
+{
+  long long i;
+}
+Value;
+typedef struct Entry
+{
+}
+Entry;
+typedef struct Table
+{
+}
+Table;
+typedef struct Node
+{
+  Tnode *typ;
+  int sto;
+  Value val;
+}
+Node;
+struct Scope
+{
+  Table *table;
+} *sp;
+static Node op (Node);
+Entry *p, *q;
+union YYSTYPE
+{
+  Symbol *sym;
+  Node rec;
+};
+typedef union YYSTYPE YYSTYPE;
+typedef short int yytype_int16;
+
+int
+yyparse (void)
+{
+  YYSTYPE yyval;
+  int yyn;
+  YYSTYPE *yyvsp;
+  while (1)
+    {
+      if (yyn == 34)
+       {
+         if ((yyvsp[-1].rec).sto & 0x10)
+           sprintf (errbuf, "invalid typedef qualifier for '%s'",
+                    (yyvsp[0].sym)->name);
+         p = enter (sp->table, (yyvsp[0].sym));
+       }
+      else
+       op ((yyvsp[0].rec));
+      *++yyvsp = yyval;
+    }
+}
+
+static Node
+op (Node q)
+{
+  integer (q.typ);
+  mgtype (q.typ);
+}
+
+
+/* { dg-final { scan-rtl-dump-times "\\\(set \\\(reg:SI 5 \\\$5\\\)" 2 
"expand" } }  */
+/* { dg-final { scan-rtl-dump-times "\\\(set \\\(reg:SI 6 \\\$6\\\)" 1 
"expand" } }  */

Reply via email to