Commit c3090c1f by Jakub Jelinek Committed by Jakub Jelinek

re PR rtl-optimization/69764 (ICE on x86_64-linux-gnu at -O0 (in decompose, at rtl.h:2107))

	PR rtl-optimization/69764
	PR rtl-optimization/69771
	* optabs.c (expand_binop_directly): For shift_optab_p, force
	convert_modes with VOIDmode if xop1 has VOIDmode.

	* c-c++-common/pr69764.c: New test.
	* gcc.dg/torture/pr69771.c: New test.

From-SVN: r233381
parent 8222034d
2016-02-12 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/69764
PR rtl-optimization/69771
* optabs.c (expand_binop_directly): For shift_optab_p, force
convert_modes with VOIDmode if xop1 has VOIDmode.
2016-02-12 Ilya Enkovich <enkovich.gnu@gmail.com> 2016-02-12 Ilya Enkovich <enkovich.gnu@gmail.com>
PR target/69729 PR target/69729
......
...@@ -993,6 +993,7 @@ expand_binop_directly (machine_mode mode, optab binoptab, ...@@ -993,6 +993,7 @@ expand_binop_directly (machine_mode mode, optab binoptab,
bool commutative_p; bool commutative_p;
rtx_insn *pat; rtx_insn *pat;
rtx xop0 = op0, xop1 = op1; rtx xop0 = op0, xop1 = op1;
bool canonicalize_op1 = false;
/* If it is a commutative operator and the modes would match /* If it is a commutative operator and the modes would match
if we would swap the operands, we can save the conversions. */ if we would swap the operands, we can save the conversions. */
...@@ -1006,6 +1007,11 @@ expand_binop_directly (machine_mode mode, optab binoptab, ...@@ -1006,6 +1007,11 @@ expand_binop_directly (machine_mode mode, optab binoptab,
xop0 = avoid_expensive_constant (xmode0, binoptab, 0, xop0, unsignedp); xop0 = avoid_expensive_constant (xmode0, binoptab, 0, xop0, unsignedp);
if (!shift_optab_p (binoptab)) if (!shift_optab_p (binoptab))
xop1 = avoid_expensive_constant (xmode1, binoptab, 1, xop1, unsignedp); xop1 = avoid_expensive_constant (xmode1, binoptab, 1, xop1, unsignedp);
else
/* Shifts and rotates often use a different mode for op1 from op0;
for VOIDmode constants we don't know the mode, so force it
to be canonicalized using convert_modes. */
canonicalize_op1 = true;
/* In case the insn wants input operands in modes different from /* In case the insn wants input operands in modes different from
those of the actual operands, convert the operands. It would those of the actual operands, convert the operands. It would
...@@ -1020,7 +1026,8 @@ expand_binop_directly (machine_mode mode, optab binoptab, ...@@ -1020,7 +1026,8 @@ expand_binop_directly (machine_mode mode, optab binoptab,
mode0 = xmode0; mode0 = xmode0;
} }
mode1 = GET_MODE (xop1) != VOIDmode ? GET_MODE (xop1) : mode; mode1 = ((GET_MODE (xop1) != VOIDmode || canonicalize_op1)
? GET_MODE (xop1) : mode);
if (xmode1 != VOIDmode && xmode1 != mode1) if (xmode1 != VOIDmode && xmode1 != mode1)
{ {
xop1 = convert_modes (xmode1, mode1, xop1, unsignedp); xop1 = convert_modes (xmode1, mode1, xop1, unsignedp);
......
2016-02-12 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/69764
PR rtl-optimization/69771
* c-c++-common/pr69764.c: New test.
* gcc.dg/torture/pr69771.c: New test.
2016-02-12 Marek Polacek <polacek@redhat.com> 2016-02-12 Marek Polacek <polacek@redhat.com>
* g++.dg/torture/init-list1.C: New. * g++.dg/torture/init-list1.C: New.
......
/* PR rtl-optimization/69764 */
/* { dg-do compile { target int32plus } } */
unsigned char
fn1 (unsigned char a)
{
return a >> ~6; /* { dg-warning "right shift count is negative" } */
}
unsigned short
fn2 (unsigned short a)
{
return a >> ~6; /* { dg-warning "right shift count is negative" } */
}
unsigned int
fn3 (unsigned int a)
{
return a >> ~6; /* { dg-warning "right shift count is negative" } */
}
unsigned char
fn4 (unsigned char a)
{
return a >> 0xff03; /* { dg-warning "right shift count >= width of type" } */
}
unsigned short
fn5 (unsigned short a)
{
return a >> 0xff03; /* { dg-warning "right shift count >= width of type" } */
}
unsigned int
fn6 (unsigned int a)
{
return a >> 0xff03; /* { dg-warning "right shift count >= width of type" } */
}
/* PR rtl-optimization/69771 */
/* { dg-do compile } */
unsigned char a = 5, c;
unsigned short b = 0;
unsigned d = 0x76543210;
void
foo (void)
{
c = d >> ~(a || ~b); /* { dg-warning "shift count is negative" } */
}
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