The following fixes PR79673.

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

Richard.

2017-02-22  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/79673
        * tree-ssa-pre.c (compute_avail): Use wide_int_to_tree to
        convert the [TARGET_]MEM_REF offset INTEGER_CST, scrapping off
        irrelevant address-space qualifiers and avoiding a
        ADDR_SPACE_CONVERT_EXPR from fold_convert.

        * gcc.target/i386/pr79673.c: New testcase.

Index: gcc/tree-ssa-pre.c
===================================================================
--- gcc/tree-ssa-pre.c  (revision 245646)
+++ gcc/tree-ssa-pre.c  (working copy)
@@ -3986,21 +3990,21 @@ compute_avail (void)
                        {
                          ref->set = set;
                          if (ref1->opcode == MEM_REF)
-                           ref1->op0 = fold_convert (TREE_TYPE (ref2->op0),
-                                                     ref1->op0);
+                           ref1->op0 = wide_int_to_tree (TREE_TYPE (ref2->op0),
+                                                         ref1->op0);
                          else
-                           ref1->op2 = fold_convert (TREE_TYPE (ref2->op2),
-                                                     ref1->op2);
+                           ref1->op2 = wide_int_to_tree (TREE_TYPE (ref2->op2),
+                                                         ref1->op2);
                        }
                      else
                        {
                          ref->set = 0;
                          if (ref1->opcode == MEM_REF)
-                           ref1->op0 = fold_convert (ptr_type_node,
-                                                     ref1->op0);
+                           ref1->op0 = wide_int_to_tree (ptr_type_node,
+                                                         ref1->op0);
                          else
-                           ref1->op2 = fold_convert (ptr_type_node,
-                                                     ref1->op2);
+                           ref1->op2 = wide_int_to_tree (ptr_type_node,
+                                                         ref1->op2);
                        }
                      operands.release ();
 
Index: gcc/testsuite/gcc.target/i386/pr79673.c
===================================================================
--- gcc/testsuite/gcc.target/i386/pr79673.c     (nonexistent)
+++ gcc/testsuite/gcc.target/i386/pr79673.c     (working copy)
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+void used(double x);
+void usel(long x);
+void test(int c)
+{
+  if (c)
+    used(*((double __seg_gs *) 0));
+  else
+    usel(*((long __seg_gs *) 0));
+}

Reply via email to