[Bug tree-optimization/87059] [9 Regression] internal compiler error: in set_value_range, at tree-vrp.c:289
aldyh at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Aug 23 09:53:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87059
Aldy Hernandez <aldyh at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |msebor at gcc dot gnu.org
--- Comment #6 from Aldy Hernandez <aldyh at gcc dot gnu.org> ---
(tl;dr: strncmp code is creating a MIN_EXPR with incompatible types).
I think my patch exposed a latent bug.
Previously, the min/max code was calling int_const_binop() code, which in turns
calls wide_int_binop() with the type of the first argument:
int_const_binop():
...
tree type = TREE_TYPE (arg1);
...
if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg2) == INTEGER_CST)
{
wide_int warg1 = wi::to_wide (arg1), res;
wide_int warg2 = wi::to_wide (arg2, TYPE_PRECISION (type));
success = wide_int_binop (res, code, warg1, warg2, sign, &overflow);
poly_res = res;
}
But in this particular case the MIN_EXPR that was passed to VRP, and
consequently int_const_binop() has incompatible argument types.
Placing a breakpoint on VRP around here:
else if (code == MIN_EXPR
|| code == MAX_EXPR)
One can see that the types of vr0.min, vr1.min, and the entire MIN_EXPR
(expr_type) are not entirely compatible:
(gdb) p debug_generic_stmt(vr0.min.typed.type)
sizetype
$33 = void
(gdb) p debug_generic_stmt(vr1.min.typed.type)
ssizetype
$34 = void
(gdb) p debug_generic_stmt(expr_type)
ssizetype
vr0.min is unsigned, but vr1.min and the MIN_EXPR are signed.
We can trace the MIN_EXPR to:
expand_builtin_strncmp():
/* If we are not using the given length, we must incorporate it here.
The actual new length parameter will be MIN(len,arg3) in this case. */
if (len != len3)
len = fold_build2_loc (loc, MIN_EXPR, TREE_TYPE (len), len, len3);
(gdb) p debug_generic_stmt(len)
MIN_EXPR <(sizetype) _4, 1>;
I could easily change the new VRP code to use the type of vr0 when calling
wide_int_binop, fixing the PR, and keeping to the previous functionality, but I
think the problem here is the incompatible MIN_EXPR.
Am I missing something, or should MIN_EXPR have compatible types?
Tagging Martin, since the MIN_EXPR code came from:
commit 5c5d012be3c48bfcd674e4ab9d8158b171cb0e58
Author: msebor <msebor@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Wed Dec 20 16:56:20 2017 +0000
PR testsuite/83131 - c-c++/common/attr-nonstring-3 failure for strcmp tests
on PowerPC
gcc/ChangeLog:
PR testsuite/83131
* builtins.c (expand_builtin_strlen): Use get_callee_fndecl.
(expand_builtin_strcmp): Call maybe_warn_nonstring_arg.
(expand_builtin_strncmp): Same.
More information about the Gcc-bugs
mailing list