https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87059
--- Comment #10 from Aldy Hernandez <aldyh at gcc dot gnu.org> ---
(In reply to Martin Sebor from comment #7)
> So the fix is presumably to change len3 to
>
> len3 = fold_convert_loc (loc, ssizetype, arg3);
>
> Given the difference between sizetype and ssizetype is just one 's' it seems
> like an easy mistake to make. If MIN_EXPR does, in fact, require arguments
> of the same type then adding an assertion to fold_binary_loc() to verify it
> would help expose these mistakes early. I'm not sure what the right
> predicate is to use in the assertion. Just compare TYPE_MAIN_VARIANT of the
> two argument types for equality?
Martin, sorry to drag you into this. I didn't notice your change was just an
indentation change.
Also, thanks for the hint above.
I'm testing the following which seems to fix them problem:
gcc/
PR 87059/tree-optimization
* builtins.c (expand_builtin_strncmp): Pass signed sizetype to
fold_convert_loc.
diff --git a/gcc/builtins.c b/gcc/builtins.c
index b1a79f3f33f..7113d19aadf 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -4727,7 +4727,7 @@ expand_builtin_strncmp (tree exp, ATTRIBUTE_UNUSED rtx
target,
if (len2)
len2 = size_binop_loc (loc, PLUS_EXPR, ssize_int (1), len2);
- tree len3 = fold_convert_loc (loc, sizetype, arg3);
+ tree len3 = fold_convert_loc (loc, ssizetype, arg3);
/* If we don't have a constant length for the first, use the length
of the second, if we know it. If neither string is constant length,