https://gcc.gnu.org/g:fdc38baeea75976e967626532fd45553db8560f0
commit r16-7672-gfdc38baeea75976e967626532fd45553db8560f0 Author: David Malcolm <[email protected]> Date: Tue Feb 24 17:16:59 2026 -0500 analyzer: fix ICE on (X + (-X)) for vectors [PR124188] 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]> Diff: --- gcc/analyzer/region-model-manager.cc | 3 ++- gcc/testsuite/c-c++-common/analyzer/vector-ice-pr124188.c | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/gcc/analyzer/region-model-manager.cc b/gcc/analyzer/region-model-manager.cc index c7aaa38a0949..892d60697be2 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 000000000000..8fff31d4575e --- /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; +}
