https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113907
--- Comment #14 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
There are significant differences in the ranges starting with evrp.
Even optimized has:
--- pr113907.ii.261t.optimized_ 2024-02-13 09:52:13.090609512 -0500
+++ pr113907.ii.261t.optimized 2024-02-13 09:53:35.691479080 -0500
@@ -576,7 +576,7 @@ int32_t uprv_copyArray16 (const struct U
goto <bb 10>; [67.00%]
<bb 9> [local count: 43795362]:
- # RANGE [irange] unsigned int [2, 2147483647] MASK 0x7ffffff8 VALUE 0x0
+ # RANGE [irange] unsigned int [8, 2147483647] MASK 0x7ffffff8 VALUE 0x0
length.37_21 = (unsigned int) length_14(D);
memcpy (outData_15(D), inData_13(D), length.37_21);
@@ -676,14 +676,14 @@ int32_t uprv_copyArray64 (const struct U
goto <bb 10>; [67.00%]
<bb 9> [local count: 43795362]:
- # RANGE [irange] unsigned int [1, 2147483647] MASK 0x7ffffff8 VALUE 0x0
+ # RANGE [irange] unsigned int [8, 2147483647] MASK 0x7ffffff8 VALUE 0x0
length.37_21 = (unsigned int) length_14(D);
memcpy (outData_15(D), inData_13(D), length.37_21);
<bb 10> [local count: 88917857]:
<bb 11> [local count: 1073741824]:
- # RANGE [irange] int32_t [0, +INF] MASK 0x7fffffff VALUE 0x0
+ # RANGE [irange] int32_t [0, 0][8, +INF] MASK 0x7fffffff VALUE 0x0
# _6 = PHI <0(7), length_14(D)(10)>
return _6;
@@ -776,14 +776,14 @@ int32_t uprv_copyArray32 (const struct U
goto <bb 10>; [67.00%]
<bb 9> [local count: 43795362]:
- # RANGE [irange] unsigned int [1, 2147483647] MASK 0x7ffffff8 VALUE 0x0
+ # RANGE [irange] unsigned int [8, 2147483647] MASK 0x7ffffff8 VALUE 0x0
length.37_21 = (unsigned int) length_14(D);
memcpy (outData_15(D), inData_13(D), length.37_21);
<bb 10> [local count: 88917857]:
<bb 11> [local count: 1073741824]:
- # RANGE [irange] int32_t [0, +INF] MASK 0x7fffffff VALUE 0x0
+ # RANGE [irange] int32_t [0, 0][4, +INF] MASK 0x7fffffff VALUE 0x0
# _6 = PHI <0(7), length_14(D)(10)>
return _6;
So it certainly doesn't surprise me some length < 8 check is optimized away
given the above range info. The question is if it is correct and what values
the length actually get at runtime if you e.g. compile with -O0.