Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
Successful run of analyzer integration tests on x86_64-pc-linux-gnu.
Pushed to trunk as r16-7672-gfdc38baeea7597.
gcc/analyzer/ChangeLog:
PR analyzer/124188
* region-model-manager.cc
(region_model_manager::maybe_fold_binop): Don't attempt to fold
X + (-X) to zero for vector types.
gcc/testsuite/ChangeLog:
PR analyzer/124188
* c-c++-common/analyzer/vector-ice-pr124188.c: New test.
Signed-off-by: David Malcolm <[email protected]>
---
gcc/analyzer/region-model-manager.cc | 3 ++-
.../c-c++-common/analyzer/vector-ice-pr124188.c | 12 ++++++++++++
2 files changed, 14 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/c-c++-common/analyzer/vector-ice-pr124188.c
diff --git a/gcc/analyzer/region-model-manager.cc
b/gcc/analyzer/region-model-manager.cc
index c7aaa38a0949c..892d60697be2f 100644
--- a/gcc/analyzer/region-model-manager.cc
+++ b/gcc/analyzer/region-model-manager.cc
@@ -683,7 +683,8 @@ region_model_manager::maybe_fold_binop (tree type, enum
tree_code op,
/* X + (-X) -> 0. */
if (const unaryop_svalue *unary_op = arg1->dyn_cast_unaryop_svalue ())
if (unary_op->get_op () == NEGATE_EXPR
- && unary_op->get_arg () == arg0)
+ && unary_op->get_arg () == arg0
+ && type && (INTEGRAL_TYPE_P (type) || POINTER_TYPE_P (type)))
return get_or_create_int_cst (type, 0);
/* X + (Y - X) -> Y. */
if (const binop_svalue *bin_op = arg1->dyn_cast_binop_svalue ())
diff --git a/gcc/testsuite/c-c++-common/analyzer/vector-ice-pr124188.c
b/gcc/testsuite/c-c++-common/analyzer/vector-ice-pr124188.c
new file mode 100644
index 0000000000000..8fff31d4575e7
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/analyzer/vector-ice-pr124188.c
@@ -0,0 +1,12 @@
+/* { dg-additional-options "-Wno-psabi" } */
+
+typedef __attribute__((__vector_size__(64))) char V;
+
+V g;
+
+void
+foo(V a)
+{
+ V v = -a;
+ a + v + g;
+}
--
2.26.3