diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-01-17 12:51:07 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-01-17 12:51:07 +0000 |
commit | cb36f3d1200fec5c6cc02f1748128a5d8b4aa1a8 (patch) | |
tree | c41bd6d8ab3b10993f256eadcd36747518147da8 | |
parent | a1bab5a6ed624d81f01a94533246191918d0c015 (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/ChangeLog | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 15 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr81877.C | 22 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/vect/pr70729-nest.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/vect/pr70729.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/uninit-pr81782.c | 14 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-im.c | 53 | ||||
-rw-r--r-- | gcc/tree-ssa-uninit.c | 4 |
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), |