[Bug tree-optimization/106744] New: phiopt miscompiles min/max
kristerw at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Aug 26 03:40:41 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106744
Bug ID: 106744
Summary: phiopt miscompiles min/max
Product: gcc
Version: 13.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kristerw at gcc dot gnu.org
Target Milestone: ---
GCC miscompiles the following test at -O1 or higher optimization levels:
#include <stdint.h>
__attribute__((noinline)) uint8_t
three_minmax1 (uint8_t xc, uint8_t xm, uint8_t xy) {
uint8_t xk;
if (xc > xm) {
xk = (uint8_t) (xc < xy ? xc : xy);
} else {
xk = (uint8_t) (xm < xy ? xm : xy);
}
return xk;
}
int
main (void)
{
volatile uint8_t xy = 255;
volatile uint8_t xm = 0;
volatile uint8_t xc = 255;
if (three_minmax1 (xc, xm, xy) != 255)
__builtin_abort ();
return 0;
}
What is happening is that phiopt transforms three_minmax1 to
_7 = MAX_EXPR <xc_2(D), xy_4(D)>;
_9 = MIN_EXPR <_7, xm_3(D)>;
return _9;
instead of the intended
_7 = MAX_EXPR <xc_2(D), xm_3(D)>;
_9 = MIN_EXPR <_7, xy_4(D)>;
return _9;
More information about the Gcc-bugs
mailing list