https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100831
Bug ID: 100831
Summary: Top-level function invocation not shown for warning in
inlined function
Product: gcc
Version: 11.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: ipa
Assignee: unassigned at gcc dot gnu.org
Reporter: jl_gccbugs at conductive dot de
CC: marxin at gcc dot gnu.org
Target Milestone: ---
The following lto warning does not point to the top-level invocation or show
the invocation stack. The warning however depends on the parameters
`copy_and_swap_32_unaligned()` is called with and therefore should do so.
> $ g++ -flto -c -O2 -mavx -Wall -Wpedantic -Wextra func.cpp
> $ g++ -flto -c -O2 -mavx -Wall -Wpedantic -Wextra main.cpp
> $ g++ -flto func.o main.o
> func.cpp: In function ‘copy_and_swap_32_unaligned.constprop’:
> func.cpp:14:38: warning: iteration 4611686018427387903 invokes undefined
> behavior [-Waggressive-loop-optimizations]
>14 | dest[i] = __builtin_bswap32(src[i]);
> | ^
> func.cpp:13:12: note: within this loop
>13 | for (; i < count; ++i) { // handle residual elements
> |^
The body of `copy_and_swap_32_unaligned()` does not really matter here, it is
subject of another bug (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100801)
func.cpp:
> #include
> #include
>
> void copy_and_swap_32_unaligned(uint32_t* dest, const uint32_t* src, size_t
> count) {
> __m128i shufmask = _mm_set_epi8(12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7,
> 0, 1, 2, 3);
>
> size_t i;
> for (i = 0; i + 4 <= count; i += 4) {
> __m128i input = _mm_loadu_si128(reinterpret_cast __m128i*>([i]));
> __m128i output = _mm_shuffle_epi8(input, shufmask);
> _mm_storeu_si128(reinterpret_cast<__m128i*>([i]), output);
> }
> for (; i < count; ++i) { // handle residual elements
> dest[i] = __builtin_bswap32(src[i]);
> }
> }
main.cpp:
> #include
> #include
>
> void copy_and_swap_32_unaligned(uint32_t* dest, const uint32_t* src, size_t
> count);
>
> struct SomeStruct {
> uint32_t data[12];
>
> explicit SomeStruct(const void* ptr) {
> copy_and_swap_32_unaligned(reinterpret_cast(this),
> reinterpret_cast(ptr),
> sizeof(SomeStruct) / 4);
> }
>
> void Store(void* ptr) {
> copy_and_swap_32_unaligned(reinterpret_cast(ptr),
> reinterpret_cast(this),
> sizeof(SomeStruct) / 4);
> }
> };
>
> void test(uint32_t* buf) {
> SomeStruct ctx(buf);
> ctx.data[0]++;
> ctx.data[1] += 5;
> ctx.Store(buf);
> }
>
> int main() {
> uint32_t x[12] = {0x12345678,0x, 0xA0B0C0D0, 0xDEADBEEF};
> printf("0x%X 0x%X 0x%X 0x%X\n", x[0], x[1], x[2], x[3]);
> // 0x12345678 0x0 0xA0B0C0D0 0xDEADBEEF
> test(x);
> printf("0x%X 0x%X 0x%X 0x%X\n", x[0], x[1], x[2], x[3]);
> // 0x13345678 0x500 0xA0B0C0D0 0xDEADBEEF
> }
An untested patch has been suggested by Martin Sebor on the mailing list thread
(https://gcc.gnu.org/pipermail/gcc-help/2021-May/140339.html) related to the
other bug mentioned:
diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c
index b5add827018..fcc6e39e3f6 100644
--- a/gcc/tree-ssa-loop-niter.c
+++ b/gcc/tree-ssa-loop-niter.c
@@ -3389,7 +3389,7 @@ do_warn_aggressive_loop_optimizations (class loop
*loop,
? UNSIGNED : SIGNED);
auto_diagnostic_group d;
if (warning_at (gimple_location (stmt),
OPT_Waggressive_loop_optimizations,
- "iteration %s invokes undefined behavior", buf))
+ "%Giteration %s invokes undefined behavior", stmt, buf))
inform (gimple_location (estmt), "within this loop");
loop->warned_aggressive_loop_optimizations = true;
}