diff options
author | Richard Biener <rguenther@suse.de> | 2016-02-10 12:46:33 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-02-10 12:46:33 +0000 |
commit | 24a179f835ec7ce4376071d3744ecd0083841ae7 (patch) | |
tree | cb6e744fe6c158fa16fa2ad7250600acb7a156a8 /gcc | |
parent | 066c14c940a7a20f53216f0e05a85c429e5e33ea (diff) | |
download | gcc-24a179f835ec7ce4376071d3744ecd0083841ae7.zip gcc-24a179f835ec7ce4376071d3744ecd0083841ae7.tar.gz gcc-24a179f835ec7ce4376071d3744ecd0083841ae7.tar.bz2 |
re PR tree-optimization/69726 (Bogus warnings with -O3 -Wuninitialized because dead code after if-conversion)
2016-02-10 Richard Biener <rguenther@suse.de>
PR tree-optimization/69726
* passes.def: Add DCE pass before late uninit.
* match.pd: Add A ? B : (!A ? C : X) -> A ? B : C patterns to
really fixup if-conversions job.
* gcc.dg/uninit-22.c: New testcase.
From-SVN: r233267
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/match.pd | 23 | ||||
-rw-r--r-- | gcc/passes.def | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/uninit-22.c | 69 |
5 files changed, 107 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 42e89c7..23100e0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-02-10 Richard Biener <rguenther@suse.de> + + PR tree-optimization/69726 + * passes.def: Add DCE pass before late uninit. + * match.pd: Add A ? B : (!A ? C : X) -> A ? B : C patterns to + really fixup if-conversions job. + 2016-02-10 Wilco Dijkstra <wdijkstr@arm.com> * config/arm/arm.c (arm_cortex_a53_tune): Enable AES fusion. diff --git a/gcc/match.pd b/gcc/match.pd index 6c8ebd5..298e835 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1717,6 +1717,29 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (simplify (cnd @0 @1 (cnd @0 @2 @3)) (cnd @0 @1 @3)) + /* A ? B : (!A ? C : X) -> A ? B : C. */ + /* ??? This matches embedded conditions open-coded because genmatch + would generate matching code for conditions in separate stmts only. + The following is still important to merge then and else arm cases + from if-conversion. */ + (simplify + (cnd @0 @1 (cnd @2 @3 @4)) + (if (COMPARISON_CLASS_P (@0) + && COMPARISON_CLASS_P (@2) + && invert_tree_comparison + (TREE_CODE (@0), HONOR_NANS (TREE_OPERAND (@0, 0))) == TREE_CODE (@2) + && operand_equal_p (TREE_OPERAND (@0, 0), TREE_OPERAND (@2, 0), 0) + && operand_equal_p (TREE_OPERAND (@0, 1), TREE_OPERAND (@2, 1), 0)) + (cnd @0 @1 @3))) + (simplify + (cnd @0 (cnd @1 @2 @3) @4) + (if (COMPARISON_CLASS_P (@0) + && COMPARISON_CLASS_P (@1) + && invert_tree_comparison + (TREE_CODE (@0), HONOR_NANS (TREE_OPERAND (@0, 0))) == TREE_CODE (@1) + && operand_equal_p (TREE_OPERAND (@0, 0), TREE_OPERAND (@1, 0), 0) + && operand_equal_p (TREE_OPERAND (@0, 1), TREE_OPERAND (@1, 1), 0)) + (cnd @0 @3 @4))) /* A ? B : B -> B. */ (simplify diff --git a/gcc/passes.def b/gcc/passes.def index a6dae76..d103df1 100644 --- a/gcc/passes.def +++ b/gcc/passes.def @@ -322,15 +322,11 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_fold_builtins); NEXT_PASS (pass_optimize_widening_mul); NEXT_PASS (pass_tail_calls); - /* FIXME: If DCE is not run before checking for uninitialized uses, + /* If DCE is not run before checking for uninitialized uses, we may get false warnings (e.g., testsuite/gcc.dg/uninit-5.c). However, this also causes us to misdiagnose cases that should be - real warnings (e.g., testsuite/gcc.dg/pr18501.c). - - To fix the false positives in uninit-5.c, we would have to - account for the predicates protecting the set and the use of each - variable. Using a representation like Gated Single Assignment - may help. */ + real warnings (e.g., testsuite/gcc.dg/pr18501.c). */ + NEXT_PASS (pass_dce); /* Split critical edges before late uninit warning to reduce the number of false positives from it. */ NEXT_PASS (pass_split_crit_edges); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 00e8d19..a6d388c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-02-10 Richard Biener <rguenther@suse.de> + + PR tree-optimization/69726 + * gcc.dg/uninit-22.c: New testcase. + 2016-02-09 Andrew Pinski <apinski@cavium.com> PR tree-opt/69282 diff --git a/gcc/testsuite/gcc.dg/uninit-22.c b/gcc/testsuite/gcc.dg/uninit-22.c new file mode 100644 index 0000000..37d1071 --- /dev/null +++ b/gcc/testsuite/gcc.dg/uninit-22.c @@ -0,0 +1,69 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -Wuninitialized --param vect-max-version-for-alias-checks=20" } */ + +#include <stdint.h> + +#define A1 2896 /* (1/sqrt(2))<<12 */ +#define A2 2217 +#define A3 3784 +#define A4 -5352 + +#define IDCT_TRANSFORM(dest,s0,s1,s2,s3,s4,s5,s6,s7,d0,d1,d2,d3,d4,d5,d6,d7,munge,src) {\ + const int a0 = (src)[s0] + (src)[s4]; \ + const int a1 = (src)[s0] - (src)[s4]; \ + const int a2 = (src)[s2] + (src)[s6]; \ + const int a3 = (A1*((src)[s2] - (src)[s6])) >> 11; \ + const int a4 = (src)[s5] + (src)[s3]; \ + const int a5 = (src)[s5] - (src)[s3]; \ + const int a6 = (src)[s1] + (src)[s7]; \ + const int a7 = (src)[s1] - (src)[s7]; \ + const int b0 = a4 + a6; \ + const int b1 = (A3*(a5 + a7)) >> 11; \ + const int b2 = ((A4*a5) >> 11) - b0 + b1; \ + const int b3 = (A1*(a6 - a4) >> 11) - b2; \ + const int b4 = ((A2*a7) >> 11) + b3 - b1; \ + (dest)[d0] = munge(a0+a2 +b0); \ + (dest)[d1] = munge(a1+a3-a2+b2); \ + (dest)[d2] = munge(a1-a3+a2+b3); \ + (dest)[d3] = munge(a0-a2 -b4); \ + (dest)[d4] = munge(a0-a2 +b4); \ + (dest)[d5] = munge(a1-a3+a2-b3); \ + (dest)[d6] = munge(a1+a3-a2-b2); \ + (dest)[d7] = munge(a0+a2 -b0); \ +} + +#define MUNGE_NONE(x) (x) +#define IDCT_COL(dest,src) IDCT_TRANSFORM(dest,0,8,16,24,32,40,48,56,0,8,16,24,32,40,48,56,MUNGE_NONE,src) + +#define MUNGE_ROW(x) (((x) + 0x7F)>>8) +#define IDCT_ROW(dest,src) IDCT_TRANSFORM(dest,0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,MUNGE_ROW,src) + +static inline void bink_idct_col(int *dest, const int32_t *src) +{ + if ((src[8]|src[16]|src[24]|src[32]|src[40]|src[48]|src[56])==0) { + dest[0] = + dest[8] = + dest[16] = + dest[24] = + dest[32] = + dest[40] = + dest[48] = + dest[56] = src[0]; + } else { + IDCT_COL(dest, src); + } +} + +int bink_idct_put_c(uint8_t *dest, int linesize, int32_t *block) +{ + int i; + int temp[64]; + for (i = 0; i < 8; i++) + bink_idct_col(&temp[i], &block[i]); + for (i = 0; i < 8; i++) { + IDCT_ROW( (&dest[i*linesize]), (&temp[8*i]) ); + } + + return 0; +} + |