aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2021-11-05 23:17:50 +0100
committerJan Hubicka <hubicka@ucw.cz>2021-11-05 23:17:50 +0100
commit9cc8ca8da90426f625481195a2127a5e86689bcd (patch)
tree38ab35fe16c71352e290e9e32e0a47037f959fba
parent432ed97b992ccfe93616d5af1fa5c1a7d7aff9ff (diff)
downloadgcc-9cc8ca8da90426f625481195a2127a5e86689bcd.zip
gcc-9cc8ca8da90426f625481195a2127a5e86689bcd.tar.gz
gcc-9cc8ca8da90426f625481195a2127a5e86689bcd.tar.bz2
Avoid left shift of negative value in ipa-modref-tree.h
gcc/ChangeLog: PR ipa/103082 * ipa-modref-tree.h (struct modref_access_node): Avoid left shift of negative value
-rw-r--r--gcc/ipa-modref-tree.h7
1 files changed, 6 insertions, 1 deletions
diff --git a/gcc/ipa-modref-tree.h b/gcc/ipa-modref-tree.h
index 9976e48..bc428d1 100644
--- a/gcc/ipa-modref-tree.h
+++ b/gcc/ipa-modref-tree.h
@@ -116,8 +116,13 @@ struct GTY(()) modref_access_node
if (!known_le (parm_offset, a.parm_offset)
&& !range_info_useful_p ())
return false;
+ /* We allow negative aoffset_adj here in case
+ there is an useful range. This is because adding
+ a.offset may result in non-ngative offset again.
+ Ubsan fails on val << LOG_BITS_PER_UNIT where val
+ is negative. */
aoffset_adj = (a.parm_offset - parm_offset)
- << LOG2_BITS_PER_UNIT;
+ * BITS_PER_UNIT;
}
}
if (range_info_useful_p ())