Andrew Stubbs <a...@codesourcery.com> writes: > On 17/09/18 09:40, Richard Sandiford wrote: >> <a...@codesourcery.com> writes: >>> This is an update of the patch posted to PR82089 long ago. We ran into the >>> same bug on GCN, so we need this fixed as part of this series. >>> >>> 2018-09-05 Andrew Stubbs <a...@codesourcery.com> >>> Tom de Vries <t...@codesourcery.com> >>> >>> PR82089 >>> >>> gcc/ >>> * expmed.c (emit_cstore): Fix handling of result_mode == BImode and >>> STORE_FLAG_VALUE == 1. >>> --- >>> gcc/expmed.c | 15 +++++++++++---- >>> 1 file changed, 11 insertions(+), 4 deletions(-) >>> >>> diff --git a/gcc/expmed.c b/gcc/expmed.c >>> index 29ce10b..0b87fdc 100644 >>> --- a/gcc/expmed.c >>> +++ b/gcc/expmed.c >>> @@ -5464,11 +5464,18 @@ emit_cstore (rtx target, enum insn_code icode, enum >>> rtx_code code, >>> If STORE_FLAG_VALUE does not have the sign bit set when >>> interpreted in MODE, we can do this conversion as unsigned, which >>> is usually more efficient. */ >>> - if (GET_MODE_SIZE (int_target_mode) > GET_MODE_SIZE (result_mode)) >>> + if (GET_MODE_SIZE (int_target_mode) > GET_MODE_SIZE (result_mode) >>> + || (result_mode == BImode && int_target_mode != BImode)) >> >> Would be better to test GET_MODE_PRECISION instead of GET_MODE_SIZE, >> if that works, instead of treating BImode as a special case. >> >>> { >>> - convert_move (target, subtarget, >>> - val_signbit_known_clear_p (result_mode, >>> - STORE_FLAG_VALUE)); >>> + gcc_assert (GET_MODE_SIZE (result_mode) != 1 >>> + || STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1); >>> + bool unsignedp >>> + = (GET_MODE_SIZE (result_mode) == 1 >>> + ? STORE_FLAG_VALUE == 1 >>> + : val_signbit_known_clear_p (result_mode, STORE_FLAG_VALUE)); >>> + >>> + convert_move (target, subtarget, unsignedp); >>> + >> >> GET_MODE_SIZE == 1 would also trigger for QImode, which shouldn't be treated >> differently from HImode etc. >> >> The original val_signbit_known_clear_p test seems like it might be an >> abstraction too far. In practice STORE_FLAG_VALUE has to fit within >> the mode of a natural (unextended) condition result, so I think we can >> simply test STORE_FLAG_VALUE >= 0 for all modes to see whether the target >> wants the result to be treated as signed or unsigned. > > How about the attached? > > I think I addressed all your comments, and it tests fine on GCN with no > regressions. > > Andrew > > [pr82089] Don't sign-extend SFV 1 in BImode > > This is an update of the patch posted to PR82089 long ago. We ran into the > same bug on GCN, so we need this fixed as part of this series. > > 2018-09-26 Andrew Stubbs <a...@codesourcery.com> > Tom de Vries <t...@codesourcery.com> > > PR82089 > > gcc/ > * expmed.c (emit_cstore): Fix handling of result_mode == BImode and > STORE_FLAG_VALUE == 1.
OK, thanks. Richard