summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2018-01-17 12:51:07 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2018-01-17 12:51:07 +0000
commitcb36f3d1200fec5c6cc02f1748128a5d8b4aa1a8 (patch)
treec41bd6d8ab3b10993f256eadcd36747518147da8
parenta1bab5a6ed624d81f01a94533246191918d0c015 (diff)
2018-01-17 Richard Biener <rguenther@suse.de>
Backport from mainline 2017-12-18 Richard Biener <rguenther@suse.de> PR tree-optimization/81877 * tree-ssa-loop-im.c (ref_indep_loop_p): Remove safelen parameters. (outermost_indep_loop): Adjust. (ref_indep_loop_p_1): Likewise. Remove safelen handling again. (can_sm_ref_p): Adjust. * g++.dg/torture/pr81877.C: New testcase. * g++.dg/vect/pr70729.cc: XFAIL. * g++.dg/vect/pr70729-nest.cc: XFAIL. 2017-12-08 Richard Biener <rguenther@suse.de> PR middle-end/81782 * tree-ssa-uninit.c (warn_uninitialized_vars): Properly handle accesses outside of zero-sized vars. * gcc.dg/uninit-pr81782.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256792 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog17
-rw-r--r--gcc/testsuite/ChangeLog15
-rw-r--r--gcc/testsuite/g++.dg/torture/pr81877.C22
-rw-r--r--gcc/testsuite/g++.dg/vect/pr70729-nest.cc2
-rw-r--r--gcc/testsuite/g++.dg/vect/pr70729.cc2
-rw-r--r--gcc/testsuite/gcc.dg/uninit-pr81782.c14
-rw-r--r--gcc/tree-ssa-loop-im.c53
-rw-r--r--gcc/tree-ssa-uninit.c4
8 files changed, 82 insertions, 47 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 009b7fcd2f00..ad7f159045af 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,20 @@
+2018-01-17 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2017-12-18 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/81877
+ * tree-ssa-loop-im.c (ref_indep_loop_p): Remove safelen parameters.
+ (outermost_indep_loop): Adjust.
+ (ref_indep_loop_p_1): Likewise. Remove safelen handling again.
+ (can_sm_ref_p): Adjust.
+
+ 2017-12-08 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/81782
+ * tree-ssa-uninit.c (warn_uninitialized_vars): Properly
+ handle accesses outside of zero-sized vars.
+
2018-01-17 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
Backport from mailine
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 533a92fca1c3..f674940a6a90 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,18 @@
+2018-01-17 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2017-12-18 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/81877
+ * g++.dg/torture/pr81877.C: New testcase.
+ * g++.dg/vect/pr70729.cc: XFAIL.
+ * g++.dg/vect/pr70729-nest.cc: XFAIL.
+
+ 2017-12-08 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/81782
+ * gcc.dg/uninit-pr81782.c: New testcase.
+
2018-01-17 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
Backport from mainline
diff --git a/gcc/testsuite/g++.dg/torture/pr81877.C b/gcc/testsuite/g++.dg/torture/pr81877.C
new file mode 100644
index 000000000000..dae23a3c0d2e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr81877.C
@@ -0,0 +1,22 @@
+/* { dg-do run } */
+
+void __attribute__((noinline,noclone)) g(int p, int *out)
+{
+ int x = 0, y;
+#pragma GCC ivdep
+ for (int i = 0; i < 100; i++)
+ {
+ int &r = p ? x : y;
+ r = 42;
+ out[i] = x;
+ }
+}
+
+int main()
+{
+ int out[100] = { 0 };
+ g (1, out);
+ if (out[0] != 42)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/vect/pr70729-nest.cc b/gcc/testsuite/g++.dg/vect/pr70729-nest.cc
index 96171e5ec94e..bbe4a5e2dba5 100644
--- a/gcc/testsuite/g++.dg/vect/pr70729-nest.cc
+++ b/gcc/testsuite/g++.dg/vect/pr70729-nest.cc
@@ -76,4 +76,4 @@ void Ss::foo (int n)
}
}
-// { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target x86_64-*-* i?86-*-* } } }
+// { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { xfail *-*-* } } }
diff --git a/gcc/testsuite/g++.dg/vect/pr70729.cc b/gcc/testsuite/g++.dg/vect/pr70729.cc
index ff868f7a41be..d5bdf49c4194 100644
--- a/gcc/testsuite/g++.dg/vect/pr70729.cc
+++ b/gcc/testsuite/g++.dg/vect/pr70729.cc
@@ -70,4 +70,4 @@ void Ss::foo (float *in, float w)
}
}
-// { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target x86_64-*-* i?86-*-* } } }
+// { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { xfail *-*-* } } }
diff --git a/gcc/testsuite/gcc.dg/uninit-pr81782.c b/gcc/testsuite/gcc.dg/uninit-pr81782.c
new file mode 100644
index 000000000000..7d1e90203f00
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/uninit-pr81782.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-Wmaybe-uninitialized" } */
+
+int
+foo (void)
+{
+ char empty_array[] = { };
+ int i, ret = 0;
+
+ for (i = 0; i < (int) (sizeof (empty_array) / sizeof (empty_array[0])); i++)
+ ret = empty_array[i]; /* { dg-bogus "uninitialized" } */
+
+ return ret;
+}
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
index 0d806da2a3ed..b259747481c3 100644
--- a/gcc/tree-ssa-loop-im.c
+++ b/gcc/tree-ssa-loop-im.c
@@ -197,7 +197,7 @@ static struct
static bitmap_obstack lim_bitmap_obstack;
static obstack mem_ref_obstack;
-static bool ref_indep_loop_p (struct loop *, im_mem_ref *, struct loop *);
+static bool ref_indep_loop_p (struct loop *, im_mem_ref *);
/* Minimum cost of an expensive expression. */
#define LIM_EXPENSIVE ((unsigned) PARAM_VALUE (PARAM_LIM_EXPENSIVE))
@@ -545,10 +545,10 @@ outermost_indep_loop (struct loop *outer, struct loop *loop, im_mem_ref *ref)
aloop != loop;
aloop = superloop_at_depth (loop, loop_depth (aloop) + 1))
if ((!ref->stored || !bitmap_bit_p (ref->stored, aloop->num))
- && ref_indep_loop_p (aloop, ref, loop))
+ && ref_indep_loop_p (aloop, ref))
return aloop;
- if (ref_indep_loop_p (loop, ref, loop))
+ if (ref_indep_loop_p (loop, ref))
return loop;
else
return NULL;
@@ -2111,20 +2111,13 @@ record_dep_loop (struct loop *loop, im_mem_ref *ref, bool stored_p)
}
/* Returns true if REF is independent on all other memory
- references in LOOP. REF_LOOP is where REF is accessed, SAFELEN is the
- safelen to apply. */
+ references in LOOP. */
static bool
-ref_indep_loop_p_1 (int safelen, struct loop *loop, im_mem_ref *ref,
- bool stored_p, struct loop *ref_loop)
+ref_indep_loop_p_1 (struct loop *loop, im_mem_ref *ref, bool stored_p)
{
stored_p |= (ref->stored && bitmap_bit_p (ref->stored, loop->num));
- if (loop->safelen > safelen
- /* Check that REF is accessed inside LOOP. */
- && (loop == ref_loop || flow_loop_nested_p (loop, ref_loop)))
- safelen = loop->safelen;
-
bool indep_p = true;
bitmap refs_to_check;
@@ -2135,32 +2128,6 @@ ref_indep_loop_p_1 (int safelen, struct loop *loop, im_mem_ref *ref,
if (bitmap_bit_p (refs_to_check, UNANALYZABLE_MEM_ID))
indep_p = false;
- else if (safelen > 1)
- {
- if (dump_file && (dump_flags & TDF_DETAILS))
- {
- fprintf (dump_file,"REF is independent due to safelen %d\n",
- safelen);
- print_generic_expr (dump_file, ref->mem.ref, TDF_SLIM);
- fprintf (dump_file, "\n");
- }
-
- /* We need to recurse to properly handle UNANALYZABLE_MEM_ID. */
- struct loop *inner = loop->inner;
- while (inner)
- {
- if (!ref_indep_loop_p_1 (safelen, inner, ref, stored_p, ref_loop))
- {
- indep_p = false;
- break;
- }
- inner = inner->next;
- }
-
- /* Avoid caching here as safelen depends on context and refs
- are shared between different contexts. */
- return indep_p;
- }
else
{
if (bitmap_bit_p (&ref->indep_loop, LOOP_DEP_BIT (loop->num, stored_p)))
@@ -2171,7 +2138,7 @@ ref_indep_loop_p_1 (int safelen, struct loop *loop, im_mem_ref *ref,
struct loop *inner = loop->inner;
while (inner)
{
- if (!ref_indep_loop_p_1 (safelen, inner, ref, stored_p, ref_loop))
+ if (!ref_indep_loop_p_1 (inner, ref, stored_p))
{
indep_p = false;
break;
@@ -2225,14 +2192,14 @@ ref_indep_loop_p_1 (int safelen, struct loop *loop, im_mem_ref *ref,
}
/* Returns true if REF is independent on all other memory references in
- LOOP. REF_LOOP is the loop where REF is accessed. */
+ LOOP. */
static bool
-ref_indep_loop_p (struct loop *loop, im_mem_ref *ref, struct loop *ref_loop)
+ref_indep_loop_p (struct loop *loop, im_mem_ref *ref)
{
gcc_checking_assert (MEM_ANALYZABLE (ref));
- return ref_indep_loop_p_1 (0, loop, ref, false, ref_loop);
+ return ref_indep_loop_p_1 (loop, ref, false);
}
/* Returns true if we can perform store motion of REF from LOOP. */
@@ -2268,7 +2235,7 @@ can_sm_ref_p (struct loop *loop, im_mem_ref *ref)
/* And it must be independent on all other memory references
in LOOP. */
- if (!ref_indep_loop_p (loop, ref, loop))
+ if (!ref_indep_loop_p (loop, ref))
return false;
return true;
diff --git a/gcc/tree-ssa-uninit.c b/gcc/tree-ssa-uninit.c
index e019ecc9d29e..90d2636b12a8 100644
--- a/gcc/tree-ssa-uninit.c
+++ b/gcc/tree-ssa-uninit.c
@@ -290,8 +290,8 @@ warn_uninitialized_vars (bool warn_possibly_uninitialized)
/* Do not warn if the access is fully outside of the
variable. */
if (ref.size != -1
- && ref.max_size == ref.size
- && (ref.offset + ref.size <= 0
+ && ((ref.max_size == ref.size
+ && ref.offset + ref.size <= 0)
|| (ref.offset >= 0
&& TREE_CODE (DECL_SIZE (base)) == INTEGER_CST
&& compare_tree_int (DECL_SIZE (base),