diff options
author | Andrew Pinski <quic_apinski@quicinc.com> | 2024-02-18 14:14:23 -0800 |
---|---|---|
committer | Andrew Pinski <quic_apinski@quicinc.com> | 2024-02-19 12:40:27 -0800 |
commit | d70facd54a576faca1bfba96e92e1475e0da22a3 (patch) | |
tree | 9da157216199f589e097921b4ecdbfd94f9b7057 /gcc | |
parent | 1609fdff16f17ead37666f6d0e801800ee3d04d2 (diff) | |
download | gcc-d70facd54a576faca1bfba96e92e1475e0da22a3.zip gcc-d70facd54a576faca1bfba96e92e1475e0da22a3.tar.gz gcc-d70facd54a576faca1bfba96e92e1475e0da22a3.tar.bz2 |
analyzer: Fix maybe_undo_optimize_bit_field_compare vs non-scalar types [PR113983]
After r14-6419-g4eaaf7f5a378e8, maybe_undo_optimize_bit_field_compare would ICE on
vector CST but this function really should be checking if we had integer types so
reject non-integral types early on (like it was doing for non-char type before r14-6419-g4eaaf7f5a378e8).
Committed as obvious after build and tested for aarch64-linux-gnu with no regressions.
PR analyzer/113983
gcc/analyzer/ChangeLog:
* region-model-manager.cc (maybe_undo_optimize_bit_field_compare): Reject
non integral types.
gcc/testsuite/ChangeLog:
* gcc.dg/analyzer/torture/vector-extract-1.c: New test.
Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/analyzer/region-model-manager.cc | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/analyzer/torture/vector-extract-1.c | 14 |
2 files changed, 17 insertions, 0 deletions
diff --git a/gcc/analyzer/region-model-manager.cc b/gcc/analyzer/region-model-manager.cc index 62f808a..21e13b4 100644 --- a/gcc/analyzer/region-model-manager.cc +++ b/gcc/analyzer/region-model-manager.cc @@ -602,6 +602,9 @@ maybe_undo_optimize_bit_field_compare (tree type, tree cst, const svalue *arg1) { + if (!INTEGRAL_TYPE_P (type)) + return NULL; + const binding_map &map = compound_sval->get_map (); unsigned HOST_WIDE_INT mask = TREE_INT_CST_LOW (cst); /* If "mask" is a contiguous range of set bits, see if the diff --git a/gcc/testsuite/gcc.dg/analyzer/torture/vector-extract-1.c b/gcc/testsuite/gcc.dg/analyzer/torture/vector-extract-1.c new file mode 100644 index 0000000..5b878e6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/torture/vector-extract-1.c @@ -0,0 +1,14 @@ +/* PR analyzer/113983 */ + +/* maybe_undo_optimize_bit_field_compare used to ICE on this + because it was not checking for only integer types. */ + +typedef int __attribute__((__vector_size__(8))) V; +int i; + +V +foo(void) +{ + V v = (V){}; + return (0, 0) * (i & v); +} |