aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/gimple-fold.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/c-c++-common/vector-subscript-6.c14
-rw-r--r--gcc/testsuite/c-c++-common/vector-subscript-7.c14
-rw-r--r--gcc/tree-ssa-sccvn.c5
6 files changed, 55 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b00409c..b6d25c3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+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>
* function-tests.c (selftest::verify_three_block_rtl_cfg): Verify
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index cbfcc2f..3a50088 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 536fbee..930a6e8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+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>
* 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 0000000..b430e9c
--- /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 0000000..e8418f2
--- /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 e685342..e889d60 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;