]> git.ipfire.org Git - thirdparty/gcc.git/commit
d: Suboptimal codegen for __builtin_expect(cond, false)
authorIain Buclaw <ibuclaw@gdcproject.org>
Mon, 26 Jun 2023 01:24:27 +0000 (03:24 +0200)
committerIain Buclaw <ibuclaw@gdcproject.org>
Mon, 26 Jun 2023 01:33:05 +0000 (03:33 +0200)
commitab134ecb05c6cf1d7a0aee58e7649a93a87c9874
treebe8cc759ebb221d8871d478c5b7dbdee7948f410
parent678cab115de2c01391d90977417c44f2e437d6e9
d: Suboptimal codegen for __builtin_expect(cond, false)

Since PR96435, both boolean objects and expressions have been evaluated
in the following way.

    (*(ubyte*)&obj_or_expr) & 1

It has been noted that sometimes this can cause the back-end to optimize
in non-obvious ways - in particular with __builtin_expect.

This @safe feature is now restricted to just when reading the value of a
bool field that comes from a union.

PR d/110359

gcc/d/ChangeLog:

* d-convert.cc (convert_for_rvalue): Only apply the @safe boolean
conversion to boolean fields of a union.
(convert_for_condition): Call convert_for_rvalue in the default case.

gcc/testsuite/ChangeLog:

* gdc.dg/pr110359.d: New test.

(cherry picked from commit ab98db1e8c1b997414539f41b7fb814019497d8d)
gcc/d/d-convert.cc
gcc/testsuite/gdc.dg/pr110359.d [new file with mode: 0644]