diff options
author | Richard Biener <rguenther@suse.de> | 2016-02-10 12:46:33 +0000 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2016-02-10 12:46:33 +0000 |
commit | 684a9b116bed0cf8ac31d2041752b0c206015c72 (patch) | |
tree | cb6e744fe6c158fa16fa2ad7250600acb7a156a8 | |
parent | 1a65eb20f453885fb37025a3a08c30930a4d8219 (diff) |
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.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@233267 138bc75d-0d04-0410-961f-82ee72b054a4
-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 42e89c7dc22..23100e06003 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 6c8ebd5e090..298e8352369 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 a6dae769121..d103df13dcd 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 00e8d198723..a6d388c94f8 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 00000000000..37d1071c75a --- /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; +} + |