re PR middle-end/61158 (negative shift at fold-const.c:12095)

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.

From-SVN: r210467
This commit is contained in:
Jakub Jelinek 2014-05-15 12:01:11 +02:00
parent a2555c65a0
commit ceed6e6732
4 changed files with 37 additions and 7 deletions

View File

@ -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> 2014-05-15 Zhenqiang Chen <zhenqiang.chen@linaro.org>
* regcprop.h: New file. * regcprop.h: New file.
* regcprop.c (skip_debug_insn_p): New decl. * regcprop.c (skip_debug_insn_p): New decl.
(replace_oldest_value_reg): Check skip_debug_insn_p. (replace_oldest_value_reg): Check skip_debug_insn_p.
(copyprop_hardreg_forward_bb_without_debug_insn.): New function. (copyprop_hardreg_forward_bb_without_debug_insn): New function.
* shrink-wrap.c: include regcprop.h * shrink-wrap.c: Include regcprop.h.
(prepare_shrink_wrap): (prepare_shrink_wrap): Call
Call copyprop_hardreg_forward_bb_without_debug_insn. copyprop_hardreg_forward_bb_without_debug_insn.
2014-05-15 Zhenqiang Chen <zhenqiang.chen@linaro.org> 2014-05-15 Zhenqiang Chen <zhenqiang.chen@linaro.org>

View File

@ -11972,11 +11972,17 @@ fold_binary_loc (location_t loc,
/* See if we can shorten the right shift. */ /* See if we can shorten the right shift. */
if (shiftc < prec) if (shiftc < prec)
shift_type = inner_type; 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 = ~(unsigned HOST_WIDE_INT) 0;
zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc; if (shiftc < prec)
zerobits <<= prec - shiftc; {
zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc;
zerobits <<= prec - shiftc;
}
/* For arithmetic shift if sign bit could be set, zerobits /* For arithmetic shift if sign bit could be set, zerobits
can contain actually sign bits, so no transformation is can contain actually sign bits, so no transformation is
possible, unless MASK masks them all away. In that 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). */ /* ((X << 16) & 0xff00) is (X, 0). */
if ((mask & zerobits) == mask) if ((mask & zerobits) == mask)
return omit_one_operand_loc (loc, type, return omit_one_operand_loc (loc, type,
build_int_cst (type, 0), arg0); build_int_cst (type, 0), arg0);
newmask = mask | zerobits; newmask = mask | zerobits;
if (newmask != mask && (newmask & (newmask + 1)) == 0) if (newmask != mask && (newmask & (newmask + 1)) == 0)

View File

@ -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> 2014-05-15 Andreas Schwab <schwab@suse.de>
* obj-c++.dg/exceptions-3.mm: Remove check for message no longer * obj-c++.dg/exceptions-3.mm: Remove check for message no longer

View File

@ -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" } } */