https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109462
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I have tried
struct Token {
unsigned char pad[4];
unsigned int uintdata;
unsigned long ptrdata;
unsigned short kind;
unsigned char pad2[6];
Token () : uintdata (0), ptrdata (0), kind (0) {}
unsigned short getKind () { return kind; }
unsigned int getLength () { return uintdata; }
unsigned long getLiteralData () { return ptrdata; }
};
bool bar (Token &);
bool baz (unsigned long, unsigned int);
void qux ();
static inline bool
isStringLiteral (unsigned short K)
{
return ((unsigned short) (K + 65523U) <= 1 || K == 16 || (unsigned short) (K
+ 65519U) <= 1);
}
void
foo ()
{
Token I;
Token Result;
int p_count = 0;
while (!bar (I)) {
if (I.getKind () == 21)
++p_count;
if (I.getKind () == 22) {
if (p_count == 1)
break;
--p_count;
}
Result = I;
}
if (Result.getKind () == 5 || Result.getKind () == 6)
{
if (baz (Result.getLiteralData (), Result.getLength ()))
{
qux ();
return;
}
}
if (!isStringLiteral (Result.getKind ()))
return;
baz (Result.getLiteralData (), Result.getLength ());
__builtin_abort ();
}
but while that results in very similar IL, it doesn't reproduce that.