/* { dg-do compile } */ /* { dg-options "-O2 -fdump-tree-optimized" } */ extern const unsigned char mode_ibit[]; extern const unsigned char mode_fbit[]; extern const signed char smode_ibit[]; extern const signed char smode_fbit[]; /* We use bit-and rather than modulo to ensure we're actually testing the desired match.pd pattern. */ unsigned char muufubar (int indx) { int ret = (mode_fbit [indx] - mode_ibit [indx]) & 3; return ret; } signed char msufubar (int indx) { int ret = (mode_fbit [indx] - mode_ibit [indx]) & 3; return ret; } unsigned char musfubar (int indx) { int ret = (smode_fbit [indx] - smode_ibit [indx]) & 3; return ret; } signed char mssfubar (int indx) { int ret = (smode_fbit [indx] - smode_ibit [indx]) & 3; return ret; } unsigned char puufubar (int indx) { int ret = (mode_fbit [indx] + mode_ibit [indx]) & 3; return ret; } signed char psufubar (int indx) { int ret = (mode_fbit [indx] + mode_ibit [indx]) & 3; return ret; } unsigned char pusfubar (int indx) { int ret = (smode_fbit [indx] + smode_ibit [indx]) & 3; return ret; } signed char pssfubar (int indx) { int ret = (smode_fbit [indx] + smode_ibit [indx]) & 3; return ret; } /* The shortening patterns in match.pd should arrange to do the arithmetic in char modes and thus any casts to ints should have been removed. */ /* { dg-final {scan-tree-dump-not "\\(int\\)" "optimized"} } */ /* We should have casted 4 operands from signed to unsigned char types. */ /* { dg-final {scan-tree-dump-times "\\(unsigned char\\)" 8 "optimized" } } */ /* And two return values should have been casted from unsigned char to a normal char. */ /* { dg-final {scan-tree-dump-times "\\(signed char\\)" 4 "optimized" } } */