This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix optimize_range_tests_diff


On 10/14/14 10:02, Jakub Jelinek wrote:
Hi!

When hacking on range reassoc opt, I've noticed we can emit
code with undefined behavior even when there wasn't one originally,
in particular for:
    (X - 43U) <= 3U || (X - 75U) <= 3U
    and this loop can transform that into
    ((X - 43U) & ~(75U - 43U)) <= 3U.  */
we actually don't transform it to what the comment says, but
    ((X - 43) & ~(75U - 43U)) <= 3U
i.e. the initial subtraction can be performed in signed type,
if in here X is e.g. INT_MIN or INT_MIN + 42, the subtraction
at gimple level would be UB (not caught by -fsanitize=undefined,
because that is handled much earlier).

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2014-10-14  Jakub Jelinek  <jakub@redhat.com>

	* tree-ssa-reassoc.c (optimize_range_tests_diff): Perform
	MINUS_EXPR in unsigned type to avoid undefined behavior.
Any chance this fixes:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63302


Jeff


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]