aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Berlin <dberlin@dberlin.org>2007-07-01 23:41:38 +0000
committerDaniel Berlin <dberlin@gcc.gnu.org>2007-07-01 23:41:38 +0000
commit4794afa5e0e4e701892d8049ec96599bb8fb3555 (patch)
treef2794ba721b60c7fbde45614b26bbd672f1841e7
parent10ae7c7b78beed4a5d924ec89371ecb0b0a9a367 (diff)
downloadgcc-4794afa5e0e4e701892d8049ec96599bb8fb3555.zip
gcc-4794afa5e0e4e701892d8049ec96599bb8fb3555.tar.gz
gcc-4794afa5e0e4e701892d8049ec96599bb8fb3555.tar.bz2
tree-ssa-sccvn.c (copy_reference_ops_from_ref): Handle constants and ohter expected operations explicitly...
2007-07-01 Daniel Berlin <dberlin@dberlin.org> * tree-ssa-sccvn.c (copy_reference_ops_from_ref): Handle constants and ohter expected operations explicitly, change default to gcc_unreachable. From-SVN: r126179
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/tree-ssa-sccvn.c19
2 files changed, 23 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 295dc72..a5a83ee 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-07-01 Daniel Berlin <dberlin@dberlin.org>
+
+ * tree-ssa-sccvn.c (copy_reference_ops_from_ref): Handle constants
+ and other expected operations explicitly, change default to
+ gcc_unreachable.
+
2007-07-01 Daniel Jacobowitz <dan@codesourcery.com>
* config/arm/arm.c (arm_cannot_copy_insn_p): Do not expect a
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 89e3995..45ebe08 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -524,6 +524,10 @@ copy_reference_ops_from_ref (tree ref, VEC(vn_reference_op_s, heap) **result)
temp.op0 = TREE_OPERAND (ref, 1);
temp.op1 = TREE_OPERAND (ref, 3);
break;
+ case STRING_CST:
+ case INTEGER_CST:
+ case COMPLEX_CST:
+ case VECTOR_CST:
case VALUE_HANDLE:
case VAR_DECL:
case PARM_DECL:
@@ -532,12 +536,23 @@ copy_reference_ops_from_ref (tree ref, VEC(vn_reference_op_s, heap) **result)
case SSA_NAME:
temp.op0 = ref;
break;
- default:
+ /* These are only interesting for their operands, their
+ existence, and their type. They will never be the last
+ ref in the chain of references (IE they require an
+ operand), so we don't have to put anything
+ for op* as it will be handled by the iteration */
+ case IMAGPART_EXPR:
+ case REALPART_EXPR:
+ case VIEW_CONVERT_EXPR:
+ case ADDR_EXPR:
break;
+ default:
+ gcc_unreachable ();
+
}
VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
- if (REFERENCE_CLASS_P (ref))
+ if (REFERENCE_CLASS_P (ref) || TREE_CODE (ref) == ADDR_EXPR)
ref = TREE_OPERAND (ref, 0);
else
ref = NULL_TREE;