Commit 13e88953 by Richard Biener Committed by Richard Biener

gimple-fold.c (get_base_constructor): Add VIEW_CONVERT case, handle all…

gimple-fold.c (get_base_constructor): Add VIEW_CONVERT case, handle all tcc_constant bases and valueize SSA names.

2016-07-19  Richard Biener  <rguenther@suse.de>

	* gimple-fold.c (get_base_constructor): Add VIEW_CONVERT case,
	handle all tcc_constant bases and valueize SSA names.
	* tree-ssa-sccvn.c (fully_constant_vn_reference_p): Handle
	tcc_constant bases.

	* c-c++-common/vector-subscript-6.c: New testcase.
	* c-c++-common/vector-subscript-7.c: Likewise.

From-SVN: r238475
parent 1caf0482
2016-07-19 Richard Biener <rguenther@suse.de>
* gimple-fold.c (get_base_constructor): Add VIEW_CONVERT case,
handle all tcc_constant bases and valueize SSA names.
* tree-ssa-sccvn.c (fully_constant_vn_reference_p): Handle
tcc_constant bases.
2016-07-19 David Malcolm <dmalcolm@redhat.com> 2016-07-19 David Malcolm <dmalcolm@redhat.com>
* function-tests.c (selftest::verify_three_block_rtl_cfg): Verify * function-tests.c (selftest::verify_three_block_rtl_cfg): Verify
......
...@@ -5508,6 +5508,9 @@ get_base_constructor (tree base, HOST_WIDE_INT *bit_offset, ...@@ -5508,6 +5508,9 @@ get_base_constructor (tree base, HOST_WIDE_INT *bit_offset,
return NULL_TREE; return NULL_TREE;
base = TREE_OPERAND (base, 0); base = TREE_OPERAND (base, 0);
} }
else if (valueize
&& TREE_CODE (base) == SSA_NAME)
base = valueize (base);
/* Get a CONSTRUCTOR. If BASE is a VAR_DECL, get its /* Get a CONSTRUCTOR. If BASE is a VAR_DECL, get its
DECL_INITIAL. If BASE is a nested reference into another DECL_INITIAL. If BASE is a nested reference into another
...@@ -5529,6 +5532,10 @@ get_base_constructor (tree base, HOST_WIDE_INT *bit_offset, ...@@ -5529,6 +5532,10 @@ get_base_constructor (tree base, HOST_WIDE_INT *bit_offset,
return init; return init;
} }
case VIEW_CONVERT_EXPR:
return get_base_constructor (TREE_OPERAND (base, 0),
bit_offset, valueize);
case ARRAY_REF: case ARRAY_REF:
case COMPONENT_REF: case COMPONENT_REF:
base = get_ref_base_and_extent (base, &bit_offset2, &size, &max_size, base = get_ref_base_and_extent (base, &bit_offset2, &size, &max_size,
...@@ -5538,11 +5545,13 @@ get_base_constructor (tree base, HOST_WIDE_INT *bit_offset, ...@@ -5538,11 +5545,13 @@ get_base_constructor (tree base, HOST_WIDE_INT *bit_offset,
*bit_offset += bit_offset2; *bit_offset += bit_offset2;
return get_base_constructor (base, bit_offset, valueize); return get_base_constructor (base, bit_offset, valueize);
case STRING_CST:
case CONSTRUCTOR: case CONSTRUCTOR:
return base; return base;
default: default:
if (CONSTANT_CLASS_P (base))
return base;
return NULL_TREE; return NULL_TREE;
} }
} }
......
2016-07-19 Richard Biener <rguenther@suse.de>
* c-c++-common/vector-subscript-6.c: New testcase.
* c-c++-common/vector-subscript-7.c: Likewise.
2016-07-19 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com> 2016-07-19 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
* gcc.dg/params/blocksort-part.c: Conditionally define Int32 * gcc.dg/params/blocksort-part.c: Conditionally define Int32
......
/* { dg-do compile } */
/* { dg-options "-O -fno-tree-ccp -fdump-tree-fre1" } */
typedef int v4si __attribute__ ((vector_size (16)));
int
main (int argc, char** argv)
{
int i = 2;
int j = ((v4si){0, 1, 2, 3})[i];
return ((v4si){1, 2, 42, 0})[j];
}
/* { dg-final { scan-tree-dump "return 42;" "fre1" } } */
/* { dg-do compile } */
/* { dg-options "-O -fdump-tree-ccp1" } */
typedef int v4si __attribute__ ((vector_size (16)));
int
main (int argc, char** argv)
{
int i = 2;
int j = ((v4si){0, 1, 2, 3})[i];
return ((v4si){1, 2, 42, 0})[j];
}
/* { dg-final { scan-tree-dump "return 42;" "ccp1" } } */
...@@ -1337,6 +1337,11 @@ fully_constant_vn_reference_p (vn_reference_t ref) ...@@ -1337,6 +1337,11 @@ fully_constant_vn_reference_p (vn_reference_t ref)
unsigned i; unsigned i;
for (i = 0; i < operands.length (); ++i) for (i = 0; i < operands.length (); ++i)
{ {
if (TREE_CODE_CLASS (operands[i].opcode) == tcc_constant)
{
++i;
break;
}
if (operands[i].off == -1) if (operands[i].off == -1)
return NULL_TREE; return NULL_TREE;
off += operands[i].off; off += operands[i].off;
......
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