diff options
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0392-2011-06-06-Richard-Guenther-rguenther-suse.de.patch')
-rw-r--r-- | meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0392-2011-06-06-Richard-Guenther-rguenther-suse.de.patch | 267 |
1 files changed, 0 insertions, 267 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0392-2011-06-06-Richard-Guenther-rguenther-suse.de.patch b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0392-2011-06-06-Richard-Guenther-rguenther-suse.de.patch deleted file mode 100644 index bded821..0000000 --- a/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0392-2011-06-06-Richard-Guenther-rguenther-suse.de.patch +++ /dev/null @@ -1,267 +0,0 @@ -From 701245b3347bb4ac5433de15e4c69924c2d1a7e8 Mon Sep 17 00:00:00 2001 -From: rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> -Date: Mon, 6 Jun 2011 10:13:23 +0000 -Subject: [PATCH] 2011-06-06 Richard Guenther <rguenther@suse.de> - - PR tree-optimization/48702 - * tree-ssa-address.c (create_mem_ref_raw): Create MEM_REFs - only when we know the base address is within bounds. - * tree-ssa-alias.c (indirect_ref_may_alias_decl_p): Do not - assume the base address of TARGET_MEM_REFs is in bounds. - (indirect_refs_may_alias_p): Fix TARGET_MEM_REF without index tests. - - * gcc.dg/torture/pr48702.c: New testcase. - - Backport from mainline - 2011-05-31 Jakub Jelinek <jakub@redhat.com> - - PR rtl-optimization/49235 - * tree-ssa-address.c (gen_addr_rtx): Ignore base if it is const0_rtx. - (create_mem_ref_raw): Create MEM_REF even if base is INTEGER_CST. - - * gcc.dg/pr49235.c: New test. - - -git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@174688 138bc75d-0d04-0410-961f-82ee72b054a4 - -index 1a7b287..b3199f9 100644 -new file mode 100644 -index 0000000..f1e589f ---- /dev/null -+++ b/gcc/testsuite/gcc.dg/pr49235.c -@@ -0,0 +1,25 @@ -+/* PR rtl-optimization/49235 */ -+/* { dg-do compile { target { int32plus } } } */ -+/* { dg-options "-O -fno-delete-null-pointer-checks -fno-tree-scev-cprop -ftree-vectorize -fno-vect-cost-model -w" } */ -+ -+void -+foo (void) -+{ -+ unsigned i; -+ unsigned *p = 0; -+ for (i = 0; i < 4; ++i) -+ *p++ = 0; -+ for (i = 0; i < 4; ++i) -+ *p++ = 0; -+} -+ -+void -+bar (void) -+{ -+ unsigned i; -+ unsigned *p = (unsigned *) (__UINTPTR_TYPE__) 0x12340000; -+ for (i = 0; i < 4; ++i) -+ *p++ = 0; -+ for (i = 0; i < 4; ++i) -+ *p++ = 0; -+} -diff --git a/gcc/testsuite/gcc.dg/torture/pr48702.c b/gcc/testsuite/gcc.dg/torture/pr48702.c -new file mode 100644 -index 0000000..1ec371d ---- /dev/null -+++ b/gcc/testsuite/gcc.dg/torture/pr48702.c -@@ -0,0 +1,47 @@ -+/* { dg-do run } */ -+ -+extern void abort (void); -+ -+#define LEN 4 -+ -+static inline void unpack(int array[LEN]) -+{ -+ int ii, val; -+ val = 1; -+ for (ii = 0; ii < LEN; ii++) { -+ array[ii] = val % 2; -+ val = val / 2; -+ } -+} -+ -+static inline int pack(int array[LEN]) -+{ -+ int ans, ii; -+ ans = 0; -+ for (ii = LEN-1; ii >= 0; ii--) { -+ ans = 2 * ans + array[ii]; -+ } -+ return ans; -+} -+ -+int __attribute__((noinline)) -+foo() -+{ -+ int temp, ans; -+ int array[LEN]; -+ unpack(array); -+ temp = array[0]; -+ array[0] = array[2]; -+ array[2] = temp; -+ ans = pack(array); -+ return ans; -+} -+ -+int main(void) -+{ -+ int val; -+ val = foo(); -+ if (val != 4) -+ abort (); -+ return 0; -+} -diff --git a/gcc/tree-ssa-address.c b/gcc/tree-ssa-address.c -index a9ca835..437460d 100644 ---- a/gcc/tree-ssa-address.c -+++ b/gcc/tree-ssa-address.c -@@ -1,5 +1,5 @@ - /* Memory address lowering and addressing mode selection. -- Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010 -+ Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010, 2011 - Free Software Foundation, Inc. - - This file is part of GCC. -@@ -129,7 +129,7 @@ gen_addr_rtx (enum machine_mode address_mode, - *addr = act_elem; - } - -- if (base) -+ if (base && base != const0_rtx) - { - if (*addr) - *addr = simplify_gen_binary (PLUS, address_mode, base, *addr); -@@ -361,8 +361,11 @@ create_mem_ref_raw (tree type, tree alias_ptr_type, struct mem_address *addr, - index2 = addr->base; - } - -- /* If possible use a plain MEM_REF instead of a TARGET_MEM_REF. */ -- if (alias_ptr_type -+ /* If possible use a plain MEM_REF instead of a TARGET_MEM_REF. -+ ??? As IVOPTs does not follow restrictions to where the base -+ pointer may point to create a MEM_REF only if we know that -+ base is valid. */ -+ if ((TREE_CODE (base) == ADDR_EXPR || TREE_CODE (base) == INTEGER_CST) - && (!index2 || integer_zerop (index2)) - && (!addr->index || integer_zerop (addr->index))) - return fold_build2 (MEM_REF, type, base, addr->offset); -diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c -index 8434179..1d213df 100644 ---- a/gcc/tree-ssa-alias.c -+++ b/gcc/tree-ssa-alias.c -@@ -719,8 +719,9 @@ indirect_ref_may_alias_decl_p (tree ref1 ATTRIBUTE_UNUSED, tree base1, - alias_set_type base2_alias_set, bool tbaa_p) - { - tree ptr1; -- tree ptrtype1; -+ tree ptrtype1, dbase2; - HOST_WIDE_INT offset1p = offset1, offset2p = offset2; -+ HOST_WIDE_INT doffset1, doffset2; - - ptr1 = TREE_OPERAND (base1, 0); - -@@ -744,11 +745,12 @@ indirect_ref_may_alias_decl_p (tree ref1 ATTRIBUTE_UNUSED, tree base1, - the pointer access is beyond the extent of the variable access. - (the pointer base cannot validly point to an offset less than zero - of the variable). -- They also cannot alias if the pointer may not point to the decl. */ -- if ((TREE_CODE (base1) != TARGET_MEM_REF -- || (!TMR_INDEX (base1) && !TMR_INDEX2 (base1))) -+ ??? IVOPTs creates bases that do not honor this restriction, -+ so do not apply this optimization for TARGET_MEM_REFs. */ -+ if (TREE_CODE (base1) != TARGET_MEM_REF - && !ranges_overlap_p (MAX (0, offset1p), -1, offset2p, max_size2)) - return false; -+ /* They also cannot alias if the pointer may not point to the decl. */ - if (!ptr_deref_may_alias_decl_p (ptr1, base2)) - return false; - -@@ -771,20 +773,6 @@ indirect_ref_may_alias_decl_p (tree ref1 ATTRIBUTE_UNUSED, tree base1, - if (base2_alias_set == -1) - base2_alias_set = get_alias_set (base2); - -- /* If both references are through the same type, they do not alias -- if the accesses do not overlap. This does extra disambiguation -- for mixed/pointer accesses but requires strict aliasing. -- For MEM_REFs we require that the component-ref offset we computed -- is relative to the start of the type which we ensure by -- comparing rvalue and access type and disregarding the constant -- pointer offset. */ -- if ((TREE_CODE (base1) != TARGET_MEM_REF -- || (!TMR_INDEX (base1) && !TMR_INDEX2 (base1))) -- && (TREE_CODE (base1) != MEM_REF -- || same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (ptrtype1)) == 1) -- && same_type_for_tbaa (TREE_TYPE (ptrtype1), TREE_TYPE (base2)) == 1) -- return ranges_overlap_p (offset1, max_size1, offset2, max_size2); -- - /* When we are trying to disambiguate an access with a pointer dereference - as base versus one with a decl as base we can use both the size - of the decl and its dynamic type for extra disambiguation. -@@ -814,6 +802,48 @@ indirect_ref_may_alias_decl_p (tree ref1 ATTRIBUTE_UNUSED, tree base1, - && tree_int_cst_lt (DECL_SIZE (base2), TYPE_SIZE (TREE_TYPE (ptrtype1)))) - return false; - -+ if (!ref2) -+ return true; -+ -+ /* If the decl is accressed via a MEM_REF, reconstruct the base -+ we can use for TBAA and an appropriately adjusted offset. */ -+ dbase2 = ref2; -+ while (handled_component_p (dbase2)) -+ dbase2 = TREE_OPERAND (dbase2, 0); -+ doffset1 = offset1; -+ doffset2 = offset2; -+ if (TREE_CODE (dbase2) == MEM_REF -+ || TREE_CODE (dbase2) == TARGET_MEM_REF) -+ { -+ double_int moff = mem_ref_offset (dbase2); -+ moff = double_int_lshift (moff, -+ BITS_PER_UNIT == 8 -+ ? 3 : exact_log2 (BITS_PER_UNIT), -+ HOST_BITS_PER_DOUBLE_INT, true); -+ if (double_int_negative_p (moff)) -+ doffset1 -= double_int_neg (moff).low; -+ else -+ doffset2 -= moff.low; -+ } -+ -+ /* If either reference is view-converted, give up now. */ -+ if (same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (ptrtype1)) != 1 -+ || same_type_for_tbaa (TREE_TYPE (dbase2), -+ TREE_TYPE (reference_alias_ptr_type (dbase2))) != 1) -+ return true; -+ -+ /* If both references are through the same type, they do not alias -+ if the accesses do not overlap. This does extra disambiguation -+ for mixed/pointer accesses but requires strict aliasing. -+ For MEM_REFs we require that the component-ref offset we computed -+ is relative to the start of the type which we ensure by -+ comparing rvalue and access type and disregarding the constant -+ pointer offset. */ -+ if ((TREE_CODE (base1) != TARGET_MEM_REF -+ || (!TMR_INDEX (base1) && !TMR_INDEX2 (base1))) -+ && same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (dbase2)) == 1) -+ return ranges_overlap_p (doffset1, max_size1, doffset2, max_size2); -+ - /* Do access-path based disambiguation. */ - if (ref1 && ref2 - && handled_component_p (ref1) -@@ -942,12 +972,12 @@ indirect_refs_may_alias_p (tree ref1 ATTRIBUTE_UNUSED, tree base1, - /* If both references are through the same type, they do not alias - if the accesses do not overlap. This does extra disambiguation - for mixed/pointer accesses but requires strict aliasing. */ -- if ((TREE_CODE (base1) != TARGET_MEM_REF || !TMR_INDEX (base1)) -- && (TREE_CODE (base2) != TARGET_MEM_REF || !TMR_INDEX (base2)) -- && (TREE_CODE (base1) != MEM_REF -- || same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (ptrtype1)) == 1) -- && (TREE_CODE (base2) != MEM_REF -- || same_type_for_tbaa (TREE_TYPE (base2), TREE_TYPE (ptrtype2)) == 1) -+ if ((TREE_CODE (base1) != TARGET_MEM_REF -+ || (!TMR_INDEX (base1) && !TMR_INDEX2 (base1))) -+ && (TREE_CODE (base2) != TARGET_MEM_REF -+ || (!TMR_INDEX (base2) && !TMR_INDEX2 (base2))) -+ && same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (ptrtype1)) == 1 -+ && same_type_for_tbaa (TREE_TYPE (base2), TREE_TYPE (ptrtype2)) == 1 - && same_type_for_tbaa (TREE_TYPE (ptrtype1), - TREE_TYPE (ptrtype2)) == 1) - return ranges_overlap_p (offset1, max_size1, offset2, max_size2); --- -1.7.0.4 - |