From 885493a562d999ceda5190d35179320a521cf3c4 Mon Sep 17 00:00:00 2001 From: ams Date: Thu, 27 Sep 2018 11:15:48 +0000 Subject: [PATCH] [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-27 Andrew Stubbs Tom de Vries PR 82089 gcc/ * expmed.c (emit_cstore): Fix handling of result_mode == BImode and STORE_FLAG_VALUE == 1. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@264666 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 8 ++++++++ gcc/expmed.c | 11 +++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8691d52462a4..4606d9d108b7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2018-09-27 Andrew Stubbs + Tom de Vries + + PR 82089 + + * expmed.c (emit_cstore): Fix handling of result_mode == BImode and + STORE_FLAG_VALUE == 1. + 2018-09-27 Andreas Krebbel * config/s390/s390.md (PPA_TX_ABORT, PPA_OOO_BARRIER): New diff --git a/gcc/expmed.c b/gcc/expmed.c index 29ce10b4de2f..444d6a82f983 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -5464,11 +5464,14 @@ 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_PRECISION (int_target_mode) > GET_MODE_PRECISION (result_mode)) { - convert_move (target, subtarget, - val_signbit_known_clear_p (result_mode, - STORE_FLAG_VALUE)); + gcc_assert (GET_MODE_PRECISION (result_mode) != 1 + || STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1); + + bool unsignedp = (STORE_FLAG_VALUE >= 0); + convert_move (target, subtarget, unsignedp); + op0 = target; result_mode = int_target_mode; } -- 2.47.2