From: Richard Biener Date: Tue, 19 Jul 2016 14:16:54 +0000 (+0000) Subject: gimple-fold.c (get_base_constructor): Add VIEW_CONVERT case, handle all tcc_constant... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=13e889530d0da219afcbcd78c768688593dd5257;p=gcc.git gimple-fold.c (get_base_constructor): Add VIEW_CONVERT case, handle all tcc_constant bases and valueize SSA names. 2016-07-19 Richard Biener * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b00409c7951..b6d25c38179 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-07-19 Richard Biener + + * 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 * function-tests.c (selftest::verify_three_block_rtl_cfg): Verify diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index cbfcc2f0eae..3a5008839a5 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -5508,6 +5508,9 @@ get_base_constructor (tree base, HOST_WIDE_INT *bit_offset, return NULL_TREE; 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 DECL_INITIAL. If BASE is a nested reference into another @@ -5529,6 +5532,10 @@ get_base_constructor (tree base, HOST_WIDE_INT *bit_offset, return init; } + case VIEW_CONVERT_EXPR: + return get_base_constructor (TREE_OPERAND (base, 0), + bit_offset, valueize); + case ARRAY_REF: case COMPONENT_REF: 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, *bit_offset += bit_offset2; return get_base_constructor (base, bit_offset, valueize); - case STRING_CST: case CONSTRUCTOR: return base; default: + if (CONSTANT_CLASS_P (base)) + return base; + return NULL_TREE; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 536fbee9ec1..930a6e8f825 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-07-19 Richard Biener + + * c-c++-common/vector-subscript-6.c: New testcase. + * c-c++-common/vector-subscript-7.c: Likewise. + 2016-07-19 Senthil Kumar Selvaraj * gcc.dg/params/blocksort-part.c: Conditionally define Int32 diff --git a/gcc/testsuite/c-c++-common/vector-subscript-6.c b/gcc/testsuite/c-c++-common/vector-subscript-6.c new file mode 100644 index 00000000000..b430e9c3926 --- /dev/null +++ b/gcc/testsuite/c-c++-common/vector-subscript-6.c @@ -0,0 +1,14 @@ +/* { 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" } } */ diff --git a/gcc/testsuite/c-c++-common/vector-subscript-7.c b/gcc/testsuite/c-c++-common/vector-subscript-7.c new file mode 100644 index 00000000000..e8418f24be9 --- /dev/null +++ b/gcc/testsuite/c-c++-common/vector-subscript-7.c @@ -0,0 +1,14 @@ +/* { 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" } } */ diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index e6853420b6c..e889d6063e6 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -1337,6 +1337,11 @@ fully_constant_vn_reference_p (vn_reference_t ref) unsigned i; for (i = 0; i < operands.length (); ++i) { + if (TREE_CODE_CLASS (operands[i].opcode) == tcc_constant) + { + ++i; + break; + } if (operands[i].off == -1) return NULL_TREE; off += operands[i].off;