diff options
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/fold-const.c | 8 | ||||
-rw-r--r-- | gcc/gimplify.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tree-ssa/pr31307.C | 40 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr24689.c | 24 | ||||
-rw-r--r-- | gcc/tree-ssa-ccp.c | 4 |
7 files changed, 91 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 372f42fd246..d8a3c651c2b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2007-04-12 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/24689 + PR tree-optimization/31307 + * fold-const.c (operand_equal_p): Compare INTEGER_CST array + indices by value. + * gimplify.c (canonicalize_addr_expr): To be consistent with + gimplify_compound_lval only set operands two and three of + ARRAY_REFs if they are not gimple_min_invariant. This makes + it never at this place. + * tree-ssa-ccp.c (maybe_fold_offset_to_array_ref): Likewise. + 2007-04-11 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> * pa.c (pa_som_asm_init_sections): Ensure that cfun->machine is not diff --git a/gcc/fold-const.c b/gcc/fold-const.c index ceaa4464f5b..857065f1344 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -2884,9 +2884,13 @@ operand_equal_p (tree arg0, tree arg1, unsigned int flags) case ARRAY_REF: case ARRAY_RANGE_REF: - /* Operands 2 and 3 may be null. */ + /* Operands 2 and 3 may be null. + Compare the array index by value if it is constant first as we + may have different types but same value here. */ return (OP_SAME (0) - && OP_SAME (1) + && (tree_int_cst_equal (TREE_OPERAND (arg0, 1), + TREE_OPERAND (arg1, 1)) + || OP_SAME (1)) && OP_SAME_WITH_NULL (2) && OP_SAME_WITH_NULL (3)); diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 8bedd86dad9..0b6ec34d974 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -1607,9 +1607,7 @@ canonicalize_addr_expr (tree *expr_p) /* All checks succeeded. Build a new node to merge the cast. */ *expr_p = build4 (ARRAY_REF, dctype, obj_expr, TYPE_MIN_VALUE (TYPE_DOMAIN (datype)), - TYPE_MIN_VALUE (TYPE_DOMAIN (datype)), - size_binop (EXACT_DIV_EXPR, TYPE_SIZE_UNIT (dctype), - size_int (TYPE_ALIGN_UNIT (dctype)))); + NULL_TREE, NULL_TREE); *expr_p = build1 (ADDR_EXPR, ctype, *expr_p); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dfe1f300a21..f431bcb4501 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2007-04-12 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/24689 + PR tree-optimization/31307 + * g++.dg/tree-ssa/pr31307.C: New testcase. + * gcc.dg/tree-ssa/pr24689.c: Likewise. + 2007-04-12 Tobias Burnus <burnus@net-b.de> PR fortran/31472 diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr31307.C b/gcc/testsuite/g++.dg/tree-ssa/pr31307.C new file mode 100644 index 00000000000..bdfe5bd5ac1 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr31307.C @@ -0,0 +1,40 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +union MY_M128 +{ + double i; +}; + +struct RegFile +{ + MY_M128 dst[4]; +}; + +__inline__ __attribute__((always_inline)) static void +MEM_OPT_LOAD(MY_M128* reg, double* mem) +{ + reg[0].i = *mem; +} + +void _ia32_movntdq (double *, double); + +__inline__ __attribute__((always_inline)) static void +MEM_OPT_STORE(MY_M128* reg, double* mem) +{ + _ia32_movntdq ((double*)mem, (double)reg[0].i); +} + +double _mm_adds_epu8 (double __A, double __B); + +int test(unsigned char *d) +{ + RegFile r; + MEM_OPT_LOAD((r.dst) , ((double*) d)); + r.dst[0].i = _mm_adds_epu8(r.dst[0].i, r.dst[0].i); + MEM_OPT_STORE((r.dst), (double*) d); + return 0; +} + +/* { dg-final { scan-tree-dump-not "r.dst" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr24689.c b/gcc/testsuite/gcc.dg/tree-ssa/pr24689.c new file mode 100644 index 00000000000..4fe74b65882 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr24689.c @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +extern void bar (unsigned int); + +int +foo (void) +{ + char buf[1] = { 3 }; + const char *p = buf; + const char **q = &p; + unsigned int ch; + switch (**q) + { + case 1: ch = 5; break; + default: ch = 0; break; + } + + bar (ch); + return ch; +} + +/* { dg-final { scan-tree-dump "return 0;" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index 8e4d88ca457..530dee01a09 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -1632,9 +1632,7 @@ maybe_fold_offset_to_array_ref (tree base, tree offset, tree orig_type) if (!integer_zerop (elt_offset)) idx = int_const_binop (PLUS_EXPR, idx, elt_offset, 0); - return build4 (ARRAY_REF, orig_type, base, idx, min_idx, - size_int (tree_low_cst (elt_size, 1) - / (TYPE_ALIGN_UNIT (elt_type)))); + return build4 (ARRAY_REF, orig_type, base, idx, NULL_TREE, NULL_TREE); } |