Commit 22a65a54 by Richard Guenther Committed by Richard Biener

c-gimplify.c (c_gimplify_expr): Fix the invalid GENERIC &ARRAY addresses by…

c-gimplify.c (c_gimplify_expr): Fix the invalid GENERIC &ARRAY addresses by adjusting their types and...

2009-04-09  Richard Guenther  <rguenther@suse.de>

	* c-gimplify.c (c_gimplify_expr): Fix the invalid GENERIC
	&ARRAY addresses by adjusting their types and prepending
	a conversion.
	* tree-cfg.c (verify_gimple_assign_single): Verify that
	addresses are correct.

	* gcc.dg/vect/vect-54.c: Make constant input data file-scope
	to prevent constant propagation.
	* gcc.dg/vect/vect-56.c: Likewise.
	* gcc.dg/vect/vect-58.c: Likewise.
	* gcc.dg/vect/vect-60.c: Likewise.
	* gcc.dg/vect/no-vfa-vect-57.c: Likewise.
	* gcc.dg/vect/no-vfa-vect-61.c: Likewise.
	* gcc.dg/tree-prof/stringop-2.c: Adjust expected outcome.

From-SVN: r145800
parent f76968e6
2009-04-06 Richard Guenther <rguenther@suse.de>
* c-gimplify.c (c_gimplify_expr): Fix the invalid GENERIC
&ARRAY addresses by adjusting their types and prepending
a conversion.
* tree-cfg.c (verify_gimple_assign_single): Verify that
addresses are correct.
2009-04-09 Richard Guenther <rguenther@suse.de> 2009-04-09 Richard Guenther <rguenther@suse.de>
* tree-ssa-ccp.c (maybe_fold_stmt_addition): Move non-constant * tree-ssa-ccp.c (maybe_fold_stmt_addition): Move non-constant
......
...@@ -196,5 +196,19 @@ c_gimplify_expr (tree *expr_p, gimple_seq *pre_p ATTRIBUTE_UNUSED, ...@@ -196,5 +196,19 @@ c_gimplify_expr (tree *expr_p, gimple_seq *pre_p ATTRIBUTE_UNUSED,
&& !warn_init_self) && !warn_init_self)
TREE_NO_WARNING (DECL_EXPR_DECL (*expr_p)) = 1; TREE_NO_WARNING (DECL_EXPR_DECL (*expr_p)) = 1;
/* The C frontend is the only one producing &ARRAY with pointer-to-element
type. This is invalid in gimple, so produce a properly typed
ADDR_EXPR instead and wrap a conversion around it. */
if (code == ADDR_EXPR
&& TREE_CODE (TREE_TYPE (TREE_OPERAND (*expr_p, 0))) == ARRAY_TYPE
&& TREE_CODE (TREE_TYPE (TREE_TYPE (*expr_p))) != ARRAY_TYPE)
{
tree type = TREE_TYPE (*expr_p);
TREE_TYPE (*expr_p)
= build_pointer_type (TREE_TYPE (TREE_OPERAND (*expr_p, 0)));
*expr_p = build1 (NOP_EXPR, type, *expr_p);
return GS_OK;
}
return GS_UNHANDLED; return GS_UNHANDLED;
} }
2009-04-09 Richard Guenther <rguenther@suse.de> 2009-04-09 Richard Guenther <rguenther@suse.de>
* gcc.dg/vect/vect-54.c: Make constant input data file-scope
to prevent constant propagation.
* gcc.dg/vect/vect-56.c: Likewise.
* gcc.dg/vect/vect-58.c: Likewise.
* gcc.dg/vect/vect-60.c: Likewise.
* gcc.dg/vect/no-vfa-vect-57.c: Likewise.
* gcc.dg/vect/no-vfa-vect-61.c: Likewise.
* gcc.dg/tree-prof/stringop-2.c: Adjust expected outcome.
2009-04-09 Richard Guenther <rguenther@suse.de>
* gcc.dg/tree-ssa/ssa-ccp-25.c: New testcase. * gcc.dg/tree-ssa/ssa-ccp-25.c: New testcase.
* gcc.dg/tree-ssa/ssa-ccp-26.c: Likewise. * gcc.dg/tree-ssa/ssa-ccp-26.c: Likewise.
......
...@@ -14,7 +14,7 @@ main() ...@@ -14,7 +14,7 @@ main()
return 0; return 0;
} }
/* { dg-final-use { scan-tree-dump "Single value 4 stringop" "tree_profile"} } */ /* { dg-final-use { scan-tree-dump "Single value 4 stringop" "tree_profile"} } */
/* Really this ought to simplify into assignment, but we are not there yet. */ /* The versioned memset of size 4 should be optimized to an assignment. */
/* { dg-final-use { scan-tree-dump "memset.*4\\)" "optimized"} } */ /* { dg-final-use { scan-tree-dump "a\\\[0\\\] = 168430090" "optimized"} } */
/* { dg-final-use { cleanup-tree-dump "optimized" } } */ /* { dg-final-use { cleanup-tree-dump "optimized" } } */
/* { dg-final-use { cleanup-tree-dump "tree_profile" } } */ /* { dg-final-use { cleanup-tree-dump "tree_profile" } } */
/* { dg-require-effective-target vect_float } */ /* { dg-require-effective-target vect_float } */
#include <stdarg.h> #include <stdarg.h>
#include <string.h>
#include "tree-vect.h" #include "tree-vect.h"
#define N 256 #define N 256
...@@ -20,6 +21,15 @@ void bar (float *pa, float *pb, float *pc) ...@@ -20,6 +21,15 @@ void bar (float *pa, float *pb, float *pc)
return; return;
} }
__attribute__ ((noinline))
void foo (float *pb, float *pc)
{
float b[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57};
float c[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
memcpy (pb, b, sizeof (b));
memcpy (pc, c, sizeof (c));
}
/* Unaligned pointer read accesses with known alignment, /* Unaligned pointer read accesses with known alignment,
and an unaligned write access with unknown alignment. and an unaligned write access with unknown alignment.
The loop bound is known and divisible by the vectorization factor. The loop bound is known and divisible by the vectorization factor.
...@@ -33,11 +43,13 @@ __attribute__ ((noinline)) int ...@@ -33,11 +43,13 @@ __attribute__ ((noinline)) int
main1 (float *pa) main1 (float *pa)
{ {
int i; int i;
float b[N] __attribute__ ((__aligned__(16))) = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57}; float b[N] __attribute__ ((__aligned__(16)));
float c[N] __attribute__ ((__aligned__(16))) = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}; float c[N] __attribute__ ((__aligned__(16)));
float *pb = b; float *pb = b;
float *pc = c; float *pc = c;
foo (pb, pc);
for (i = 0; i < N/2; i++) for (i = 0; i < N/2; i++)
{ {
pa[i] = pb[i+1] * pc[i+1]; pa[i] = pb[i+1] * pc[i+1];
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
/* { dg-require-effective-target vect_float } */ /* { dg-require-effective-target vect_float } */
#include <stdarg.h> #include <stdarg.h>
#include <string.h>
#include "tree-vect.h" #include "tree-vect.h"
#define N 256 #define N 256
...@@ -21,6 +22,15 @@ void bar (float *pa, float *pb, float *pc) ...@@ -21,6 +22,15 @@ void bar (float *pa, float *pb, float *pc)
return; return;
} }
__attribute__ ((noinline))
void foo (float *pb, float *pc)
{
float b[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57};
float c[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
memcpy (pb, b, sizeof (b));
memcpy (pc, c, sizeof (c));
}
/* Unaligned pointer read accesses with known alignment, /* Unaligned pointer read accesses with known alignment,
and an unaligned write access with unknown alignment. and an unaligned write access with unknown alignment.
The loop bound is iunknown. The loop bound is iunknown.
...@@ -34,11 +44,13 @@ __attribute__ ((noinline)) int ...@@ -34,11 +44,13 @@ __attribute__ ((noinline)) int
main1 (int n , float *pa) main1 (int n , float *pa)
{ {
int i; int i;
float b[N] __attribute__ ((__aligned__(16))) = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57}; float b[N] __attribute__ ((__aligned__(16)));
float c[N] __attribute__ ((__aligned__(16))) = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}; float c[N] __attribute__ ((__aligned__(16)));
float *pb = b; float *pb = b;
float *pc = c; float *pc = c;
foo (pb, pc);
for (i = 0; i < n/2; i++) for (i = 0; i < n/2; i++)
{ {
pa[i] = pb[i+1] * pc[i+1]; pa[i] = pb[i+1] * pc[i+1];
......
...@@ -26,13 +26,14 @@ void bar (float *pa, float *pb, float *pc) ...@@ -26,13 +26,14 @@ void bar (float *pa, float *pb, float *pc)
vect-58.c is similar to this one with one difference: vect-58.c is similar to this one with one difference:
the loop bound is unknown. */ the loop bound is unknown. */
float b[N] __attribute__ ((__aligned__(16))) = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57};
float c[N] __attribute__ ((__aligned__(16))) = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
__attribute__ ((noinline)) int __attribute__ ((noinline)) int
main1 () main1 ()
{ {
int i; int i;
float a[N] __attribute__ ((__aligned__(16))); float a[N] __attribute__ ((__aligned__(16)));
float b[N] __attribute__ ((__aligned__(16))) = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57};
float c[N] __attribute__ ((__aligned__(16))) = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
float *pa = a; float *pa = a;
float *pb = b; float *pb = b;
float *pc = c; float *pc = c;
......
...@@ -30,13 +30,14 @@ void bar (float *pa, float *pb, float *pc) ...@@ -30,13 +30,14 @@ void bar (float *pa, float *pb, float *pc)
vect-57.c is similar to this one with two differences: vect-57.c is similar to this one with two differences:
aliasing is a problem, and the write access has unknown alignment. */ aliasing is a problem, and the write access has unknown alignment. */
float b[N] __attribute__ ((__aligned__(16))) = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57};
float c[N] __attribute__ ((__aligned__(16))) = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
__attribute__ ((noinline)) int __attribute__ ((noinline)) int
main1 () main1 ()
{ {
int i; int i;
float a[N] __attribute__ ((__aligned__(16))); float a[N] __attribute__ ((__aligned__(16)));
float b[N] __attribute__ ((__aligned__(16))) = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57};
float c[N] __attribute__ ((__aligned__(16))) = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
float *pa = a; float *pa = a;
float *pb = b; float *pb = b;
float *pc = c; float *pc = c;
......
...@@ -26,11 +26,12 @@ void bar (float *pa, float *pb, float *pc) ...@@ -26,11 +26,12 @@ void bar (float *pa, float *pb, float *pc)
vect-54.c is similar to this one with one difference: vect-54.c is similar to this one with one difference:
the loop bound is known. */ the loop bound is known. */
float a[N] __attribute__ ((__aligned__(16))); float b[N] __attribute__ ((__aligned__(16))) = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57}; float c[N] __attribute__ ((__aligned__(16))) = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
__attribute__ ((noinline)) int __attribute__ ((noinline)) int
main1 (int n) main1 (int n)
{ {
int i; int i;
float a[N] __attribute__ ((__aligned__(16))); float b[N] __attribute__ ((__aligned__(16))) = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57}; float c[N] __attribute__ ((__aligned__(16))) = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
float *pa = a; float *pa = a;
float *pb = b; float *pb = b;
float *pc = c; float *pc = c;
......
...@@ -30,13 +30,14 @@ void bar (float *pa, float *pb, float *pc) ...@@ -30,13 +30,14 @@ void bar (float *pa, float *pb, float *pc)
vect-61.c is similar to this one with two differences: vect-61.c is similar to this one with two differences:
aliasing is not a problem, and the write access has unknown alignment. */ aliasing is not a problem, and the write access has unknown alignment. */
float b[N] __attribute__ ((__aligned__(16))) = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57};
float c[N] __attribute__ ((__aligned__(16))) = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
__attribute__ ((noinline)) int __attribute__ ((noinline)) int
main1 (int n) main1 (int n)
{ {
int i; int i;
float a[N] __attribute__ ((__aligned__(16))); float a[N] __attribute__ ((__aligned__(16)));
float b[N] __attribute__ ((__aligned__(16))) = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57};
float c[N] __attribute__ ((__aligned__(16))) = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
float *pa = a; float *pa = a;
float *pb = b; float *pb = b;
float *pc = c; float *pc = c;
......
...@@ -3697,11 +3697,8 @@ verify_gimple_assign_single (gimple stmt) ...@@ -3697,11 +3697,8 @@ verify_gimple_assign_single (gimple stmt)
return true; return true;
} }
if (!one_pointer_to_useless_type_conversion_p (lhs_type, TREE_TYPE (op)) if (!one_pointer_to_useless_type_conversion_p (lhs_type,
/* FIXME: a longstanding wart, &a == &a[0]. */ TREE_TYPE (op)))
&& (TREE_CODE (TREE_TYPE (op)) != ARRAY_TYPE
|| !one_pointer_to_useless_type_conversion_p (lhs_type,
TREE_TYPE (TREE_TYPE (op)))))
{ {
error ("type mismatch in address expression"); error ("type mismatch in address expression");
debug_generic_stmt (lhs_type); debug_generic_stmt (lhs_type);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment