[Bug middle-end/56363] New: over aggressive division folding ignores sign conversion
jay.krell at cornell dot edu
gcc-bugzilla@gcc.gnu.org
Sun Feb 17 10:39:00 GMT 2013
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56363
Bug #: 56363
Summary: over aggressive division folding ignores sign
conversion
Classification: Unclassified
Product: gcc
Version: 4.7.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: jay.krell@cornell.edu
Our frontend is slightly unusual in that it uses FLOOR_DIV_EXPR instead of C's
more common TRUNC_DIV_EXPR. (For years it generated calls to helper functions
for div and mod, but then I noticed this builtin support.)
So it hits perhaps not well covered code?
Based on debugging this years ago (in an older version of gcc), I think gcc is
a bit overaggressive at folding constants in division.
4.7.2/gcc/fold-const.c has this code:
tree
fold_binary_loc (location_t loc,
enum tree_code code, tree type, tree op0, tree op1)
.
.
.
arg0 = op0;
arg1 = op1;
.
.
.
STRIP_NOPS (arg0);
STRIP_NOPS (arg1);
.
.
.
/* If arg0 is a multiple of arg1, then rewrite to the fastest div
operation, EXACT_DIV_EXPR.
Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
At one time others generated faster code, it's not clear if they do
after the last round to changes to the DIV code in expmed.c. */
if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
&& multiple_of_p (type, arg0, arg1))
return fold_build2_loc (loc, EXACT_DIV_EXPR, type, arg0, arg1);
I think this is wrong if strip_nops stripped some signedness or other
conversions.
I added this condition:
&& arg0 == op0 && arg1 == op1
Given the comment, that the code is not applied to C's TRUNC_DIV_EXPR, maybe
this can/should just be removed?
More information about the Gcc-bugs
mailing list