summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2014-05-15 10:01:11 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2014-05-15 10:01:11 +0000
commitd0a5f61cb3eb3be9966036fbaff89e3700d4ad80 (patch)
tree31b84afe27a71436ba3b93702a5cb9d603f125fc /gcc
parent30566810bc8aba091a8763c87865522cc91ebf13 (diff)
downloadgcc-d0a5f61cb3eb3be9966036fbaff89e3700d4ad80.tar.gz
PR tree-optimization/61158
* fold-const.c (fold_binary_loc): If X is zero-extended and shiftc >= prec, make sure zerobits is all ones instead of invoking undefined behavior. * gcc.dg/pr61158.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@210467 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog15
-rw-r--r--gcc/fold-const.c12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr61158.c12
4 files changed, 37 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index beac3a76047..3b4e9c28dda 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,12 +1,19 @@
+2014-05-15 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/61158
+ * fold-const.c (fold_binary_loc): If X is zero-extended and
+ shiftc >= prec, make sure zerobits is all ones instead of
+ invoking undefined behavior.
+
2014-05-15 Zhenqiang Chen <zhenqiang.chen@linaro.org>
* regcprop.h: New file.
* regcprop.c (skip_debug_insn_p): New decl.
(replace_oldest_value_reg): Check skip_debug_insn_p.
- (copyprop_hardreg_forward_bb_without_debug_insn.): New function.
- * shrink-wrap.c: include regcprop.h
- (prepare_shrink_wrap):
- Call copyprop_hardreg_forward_bb_without_debug_insn.
+ (copyprop_hardreg_forward_bb_without_debug_insn): New function.
+ * shrink-wrap.c: Include regcprop.h.
+ (prepare_shrink_wrap): Call
+ copyprop_hardreg_forward_bb_without_debug_insn.
2014-05-15 Zhenqiang Chen <zhenqiang.chen@linaro.org>
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 5e064dfa98c..8f659db76a2 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -11972,11 +11972,17 @@ fold_binary_loc (location_t loc,
/* See if we can shorten the right shift. */
if (shiftc < prec)
shift_type = inner_type;
+ /* Otherwise X >> C1 is all zeros, so we'll optimize
+ it into (X, 0) later on by making sure zerobits
+ is all ones. */
}
}
zerobits = ~(unsigned HOST_WIDE_INT) 0;
- zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc;
- zerobits <<= prec - shiftc;
+ if (shiftc < prec)
+ {
+ zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc;
+ zerobits <<= prec - shiftc;
+ }
/* For arithmetic shift if sign bit could be set, zerobits
can contain actually sign bits, so no transformation is
possible, unless MASK masks them all away. In that
@@ -11994,7 +12000,7 @@ fold_binary_loc (location_t loc,
/* ((X << 16) & 0xff00) is (X, 0). */
if ((mask & zerobits) == mask)
return omit_one_operand_loc (loc, type,
- build_int_cst (type, 0), arg0);
+ build_int_cst (type, 0), arg0);
newmask = mask | zerobits;
if (newmask != mask && (newmask & (newmask + 1)) == 0)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0146e0cb9cf..ae257928bda 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-05-15 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/61158
+ * gcc.dg/pr61158.c: New test.
+
2014-05-15 Andreas Schwab <schwab@suse.de>
* obj-c++.dg/exceptions-3.mm: Remove check for message no longer
diff --git a/gcc/testsuite/gcc.dg/pr61158.c b/gcc/testsuite/gcc.dg/pr61158.c
new file mode 100644
index 00000000000..d0ba7f3876b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr61158.c
@@ -0,0 +1,12 @@
+/* PR tree-optimization/61158 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-original" } */
+
+unsigned long long
+foo (unsigned int x)
+{
+ return ((unsigned long long) x & 0x00ff000000000000ULL) >> 40;
+}
+
+/* { dg-final { scan-tree-dump "return 0;" "original" { target { ilp32 || lp64 } } } } */
+/* { dg-final { cleanup-tree-dump "original" } } */