re PR rtl-optimization/49235 (ICE: in int_mode_for_mode, at stor-layout.c:424 with -O -fno-delete-null-pointer-checks -fno-tree-scev-cprop -ftree-vectorize -fno-vect-cost-model)

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.

From-SVN: r174478
This commit is contained in:
Jakub Jelinek 2011-05-31 14:34:42 +02:00 committed by Jakub Jelinek
parent 8f7de592d3
commit 35979cc235
4 changed files with 39 additions and 3 deletions

View File

@ -1,3 +1,9 @@
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.
2011-05-31 Ira Rosen <ira.rosen@linaro.org>
PR tree-optimization/49093

View File

@ -1,3 +1,8 @@
2011-05-31 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/49235
* gcc.dg/pr49235.c: New test.
2011-05-31 Ira Rosen <ira.rosen@linaro.org>
PR tree-optimization/49093

View File

@ -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;
}

View File

@ -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);
@ -365,7 +365,7 @@ create_mem_ref_raw (tree type, tree alias_ptr_type, struct mem_address *addr,
??? 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
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);