[PATCH] Improved handling of MINUS_EXPR in bit CCP.

Roger Sayle roger@nextmovesoftware.com
Thu Aug 12 09:52:08 GMT 2021

This patch improves the bit bounds for MINUS_EXPR during tree-ssa's
conditional constant propagation (CCP) pass (and as an added bonus
adds support for POINTER_DIFF_EXPR).

The pessimistic assumptions made by the current algorithm are
demonstrated by considering 1 - (x&1).  Intuitively this should
have possible values 0 and 1, and therefore an unknown mask of 1.
Alas by treating subtraction as a negation followed by addition,
the second operand first becomes 0 or -1, with an unknown mask
of all ones, which results in the addition containing no known bits.

Improved bounds are achieved by using the same approach used for
PLUS_EXPR, determining the result with the minimum number of borrows,
the result from the maximum number of borrows, and examining the bits
they have in common.  One additional benefit of this approach
is that it is applicable to POINTER_DIFF_EXPR, where previously the
negation of a pointer didn't/doesn't make sense.

A more convincing example, where a transformation missed by .032t.cpp
isn't caught a few passes later by .038t.evrp, is the expression
(7 - (x&5)) & 2, which (in the new test case) currently survives the
tree-level optimizers but with this patch is now simplified to the
constant value 2.

This patch has been tested on x86_64-pc-linux-gnu with "make bootstrap"
and "make -k check" with no new failures.

Ok for mainline?

2021-08-12  Roger Sayle  <roger@nextmovesoftware.com>

	* tree-ssa-ccp.c (bit_value_binop) [MINUS_EXPR]: Use same
	algorithm as PLUS_EXPR to improve subtraction bit bounds.
	[POINTER_DIFF_EXPR]: Treat as synonymous with MINUS_EXPR.

	* gcc.dg/tree-ssa/ssa-ccp-40.c: New test case.

Roger Sayle
NextMove Software
Cambridge, UK

-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: patchl3.txt
URL: <https://gcc.gnu.org/pipermail/gcc-patches/attachments/20210812/6e99afbb/attachment.txt>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: ssa-ccp-40.c
URL: <https://gcc.gnu.org/pipermail/gcc-patches/attachments/20210812/6e99afbb/attachment.c>

More information about the Gcc-patches mailing list