aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2021-08-11 10:26:18 +0200
committerRichard Biener <rguenther@suse.de>2021-08-11 12:55:24 +0200
commitd7e91f4894f6a1a2daeec5cbe1e912bb896b9f7a (patch)
tree141e305ab9267d1558440ea8fbdea11a74e514be /gcc
parentf19c70afa4aa2416c581484a6eb51c0ac46acd08 (diff)
downloadgcc-d7e91f4894f6a1a2daeec5cbe1e912bb896b9f7a.zip
gcc-d7e91f4894f6a1a2daeec5cbe1e912bb896b9f7a.tar.gz
gcc-d7e91f4894f6a1a2daeec5cbe1e912bb896b9f7a.tar.bz2
middle-end/101858 - avoid shift of pointer in folding
This makes sure to not generate a shift of pointer types in simplification of X < (cast) (1 << Y). 2021-08-11 Richard Biener <rguenther@suse.de> PR middle-end/101858 * fold-const.c (fold_binary_loc): Guard simplification of X < (cast) (1 << Y) to integer types. * gcc.dg/pr101858.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fold-const.c2
-rw-r--r--gcc/testsuite/gcc.dg/pr101858.c9
2 files changed, 11 insertions, 0 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 7dcecc9..ff23f12 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -12497,6 +12497,8 @@ fold_binary_loc (location_t loc, enum tree_code code, tree type,
we can't optimize this. E.g. (unsigned long long) (1 << Y) for Y
31 might be 0xffffffff80000000. */
if ((code == LT_EXPR || code == GE_EXPR)
+ && (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
+ || VECTOR_INTEGER_TYPE_P (TREE_TYPE (arg0)))
&& TYPE_UNSIGNED (TREE_TYPE (arg0))
&& CONVERT_EXPR_P (arg1)
&& TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
diff --git a/gcc/testsuite/gcc.dg/pr101858.c b/gcc/testsuite/gcc.dg/pr101858.c
new file mode 100644
index 0000000..61fcca6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr101858.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-w" } */
+
+int foo(int a)
+{
+ if (a < (int*)((__INTPTR_TYPE__)1 << a))
+ a = 0;
+ return a;
+}