-
Notifications
You must be signed in to change notification settings - Fork 15.3k
Open
Labels
clangClang issues not falling into any other categoryClang issues not falling into any other category
Description
clang 21.1 x86-64 -O3
https://godbolt.org/z/3WY37brEY simplified case where f1 codegen is expected to match f2. Define FIX1 to make the codegen match, or define FIX2.
FIX1 changes the struct field order so that the bool does not occur as the last field.
FIX2 changes struct creation is returned from a function rather than constructed in the function f2.
Full code:
void act(unsigned);
// baseline
void f1(unsigned stop)
{
auto i = 0;
do {
act(i);
++i;
} while ( i != stop );
}
struct Iter
{
#ifdef FIX1
bool done = false;
unsigned i = 0;
unsigned stop;
#else
unsigned i = 0;
unsigned stop;
bool done = false; // codegen can differ when last field
#endif
explicit constexpr Iter(unsigned stop) noexcept
: stop(stop) {}
constexpr bool more() const noexcept { return !done; }
constexpr unsigned front() const noexcept { return i; }
constexpr void popFront() noexcept
{
++i;
done = i == stop;
}
};
// codegen can differ when Iter is returned from a function
constexpr Iter mkIter(unsigned stop) noexcept
{
return Iter(stop);
}
// does not match f1
// define FIX1 to match f1
// define FIX2 to match f1
void f2(unsigned stop)
{
#ifdef FIX2
auto r = Iter(stop);
#else
auto r = mkIter(stop);
#endif
for ( ; r.more(); r.popFront() ) {
act(r.front());
}
}Metadata
Metadata
Assignees
Labels
clangClang issues not falling into any other categoryClang issues not falling into any other category