expmed.c (expand_shift_1): Add MAY_FAIL parameter and do not assert that the result is non-zero if it is true.
* expmed.c (expand_shift_1): Add MAY_FAIL parameter and do not assert that the result is non-zero if it is true. (maybe_expand_shift): New wrapper around expand_shift_1. (emit_store_flag): Call maybe_expand_shift in lieu of expand_shift. From-SVN: r241282
This commit is contained in:
parent
a929f2662e
commit
ea000c3ff5
|
@ -1,3 +1,10 @@
|
|||
2016-10-17 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* expmed.c (expand_shift_1): Add MAY_FAIL parameter and do not assert
|
||||
that the result is non-zero if it is true.
|
||||
(maybe_expand_shift): New wrapper around expand_shift_1.
|
||||
(emit_store_flag): Call maybe_expand_shift in lieu of expand_shift.
|
||||
|
||||
2016-10-17 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
|
||||
|
||||
PR tree-optimization/77916
|
||||
|
|
35
gcc/expmed.c
35
gcc/expmed.c
|
@ -2248,11 +2248,13 @@ expand_dec (rtx target, rtx dec)
|
|||
and AMOUNT the rtx for the amount to shift by.
|
||||
Store the result in the rtx TARGET, if that is convenient.
|
||||
If UNSIGNEDP is nonzero, do a logical shift; otherwise, arithmetic.
|
||||
Return the rtx for where the value is. */
|
||||
Return the rtx for where the value is.
|
||||
If that cannot be done, abort the compilation unless MAY_FAIL is true,
|
||||
in which case 0 is returned. */
|
||||
|
||||
static rtx
|
||||
expand_shift_1 (enum tree_code code, machine_mode mode, rtx shifted,
|
||||
rtx amount, rtx target, int unsignedp)
|
||||
rtx amount, rtx target, int unsignedp, bool may_fail = false)
|
||||
{
|
||||
rtx op1, temp = 0;
|
||||
int left = (code == LSHIFT_EXPR || code == LROTATE_EXPR);
|
||||
|
@ -2449,7 +2451,7 @@ expand_shift_1 (enum tree_code code, machine_mode mode, rtx shifted,
|
|||
define_expand for lshrsi3 was added to vax.md. */
|
||||
}
|
||||
|
||||
gcc_assert (temp);
|
||||
gcc_assert (temp != NULL_RTX || may_fail);
|
||||
return temp;
|
||||
}
|
||||
|
||||
|
@ -2468,6 +2470,16 @@ expand_shift (enum tree_code code, machine_mode mode, rtx shifted,
|
|||
shifted, GEN_INT (amount), target, unsignedp);
|
||||
}
|
||||
|
||||
/* Likewise, but return 0 if that cannot be done. */
|
||||
|
||||
static rtx
|
||||
maybe_expand_shift (enum tree_code code, machine_mode mode, rtx shifted,
|
||||
int amount, rtx target, int unsignedp)
|
||||
{
|
||||
return expand_shift_1 (code, mode,
|
||||
shifted, GEN_INT (amount), target, unsignedp, true);
|
||||
}
|
||||
|
||||
/* Output a shift instruction for expression code CODE,
|
||||
with SHIFTED being the rtx for the value to shift,
|
||||
and AMOUNT the tree for the amount to shift by.
|
||||
|
@ -5754,11 +5766,12 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1,
|
|||
if (rtx_equal_p (subtarget, op0))
|
||||
subtarget = 0;
|
||||
|
||||
tem = expand_shift (RSHIFT_EXPR, mode, op0,
|
||||
GET_MODE_BITSIZE (mode) - 1,
|
||||
subtarget, 0);
|
||||
tem = expand_binop (mode, sub_optab, tem, op0, subtarget, 0,
|
||||
OPTAB_WIDEN);
|
||||
tem = maybe_expand_shift (RSHIFT_EXPR, mode, op0,
|
||||
GET_MODE_BITSIZE (mode) - 1,
|
||||
subtarget, 0);
|
||||
if (tem)
|
||||
tem = expand_binop (mode, sub_optab, tem, op0, subtarget, 0,
|
||||
OPTAB_WIDEN);
|
||||
}
|
||||
|
||||
if (code == EQ || code == NE)
|
||||
|
@ -5820,9 +5833,9 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1,
|
|||
}
|
||||
|
||||
if (tem && normalizep)
|
||||
tem = expand_shift (RSHIFT_EXPR, mode, tem,
|
||||
GET_MODE_BITSIZE (mode) - 1,
|
||||
subtarget, normalizep == 1);
|
||||
tem = maybe_expand_shift (RSHIFT_EXPR, mode, tem,
|
||||
GET_MODE_BITSIZE (mode) - 1,
|
||||
subtarget, normalizep == 1);
|
||||
|
||||
if (tem)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue