Commit 674dd710 by Richard Sandiford Committed by Richard Sandiford

loop-iv.c (canon_condition): Generalize to all types of integer constant.

gcc/
	* loop-iv.c (canon_condition): Generalize to all types of integer
	constant.

From-SVN: r222571
parent 917c68f5
2015-04-29 Richard Sandiford <richard.sandiford@arm.com>
* loop-iv.c (canon_condition): Generalize to all types of integer
constant.
2015-04-29 Bernhard Reuther-Fischer <aldot@gcc.gnu.org> 2015-04-29 Bernhard Reuther-Fischer <aldot@gcc.gnu.org>
* gimple-walk.c: Prune duplicate or unneeded includes. * gimple-walk.c: Prune duplicate or unneeded includes.
......
...@@ -1729,39 +1729,42 @@ canon_condition (rtx cond) ...@@ -1729,39 +1729,42 @@ canon_condition (rtx cond)
mode = GET_MODE (op1); mode = GET_MODE (op1);
gcc_assert (mode != VOIDmode); gcc_assert (mode != VOIDmode);
if (CONST_INT_P (op1) if (CONST_SCALAR_INT_P (op1) && GET_MODE_CLASS (mode) != MODE_CC)
&& GET_MODE_CLASS (mode) != MODE_CC
&& GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
{ {
HOST_WIDE_INT const_val = INTVAL (op1); rtx_mode_t const_val (op1, mode);
unsigned HOST_WIDE_INT uconst_val = const_val;
unsigned HOST_WIDE_INT max_val
= (unsigned HOST_WIDE_INT) GET_MODE_MASK (mode);
switch (code) switch (code)
{ {
case LE: case LE:
if ((unsigned HOST_WIDE_INT) const_val != max_val >> 1) if (wi::ne_p (const_val, wi::max_value (mode, SIGNED)))
code = LT, op1 = gen_int_mode (const_val + 1, GET_MODE (op0)); {
code = LT;
op1 = immed_wide_int_const (wi::add (const_val, 1), mode);
}
break; break;
/* When cross-compiling, const_val might be sign-extended from
BITS_PER_WORD to HOST_BITS_PER_WIDE_INT */
case GE: case GE:
if ((HOST_WIDE_INT) (const_val & max_val) if (wi::ne_p (const_val, wi::min_value (mode, SIGNED)))
!= (((HOST_WIDE_INT) 1 {
<< (GET_MODE_BITSIZE (GET_MODE (op0)) - 1)))) code = GT;
code = GT, op1 = gen_int_mode (const_val - 1, mode); op1 = immed_wide_int_const (wi::sub (const_val, 1), mode);
}
break; break;
case LEU: case LEU:
if (uconst_val < max_val) if (wi::ne_p (const_val, -1))
code = LTU, op1 = gen_int_mode (uconst_val + 1, mode); {
code = LTU;
op1 = immed_wide_int_const (wi::add (const_val, 1), mode);
}
break; break;
case GEU: case GEU:
if (uconst_val != 0) if (wi::ne_p (const_val, 0))
code = GTU, op1 = gen_int_mode (uconst_val - 1, mode); {
code = GTU;
op1 = immed_wide_int_const (wi::sub (const_val, 1), mode);
}
break; break;
default: default:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment