gimplify.c (gimplify_expr): Take care that for bitwise-binary transformation the operands have compatible types.

* gimplify.c (gimplify_expr): Take care that for bitwise-binary
        transformation the operands have compatible types.

	* gfortran.fortran-torture/compile/logical-2.f90: New test.

From-SVN: r180006
This commit is contained in:
Kai Tietz 2011-10-14 21:30:42 +02:00 committed by Kai Tietz
parent 1c4153dd02
commit fc1f4caf5f
4 changed files with 34 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2011-10-14 Kai Tietz <ktietz@redhat.com>
* gimplify.c (gimplify_expr): Take care that for bitwise-binary
transformation the operands have compatible types.
2011-10-14 Jakub Jelinek <jakub@redhat.com>
* config/i386/sse.md (vec_widen_smult_hi_v8hi,

View File

@ -7256,8 +7256,10 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
case TRUTH_XOR_EXPR:
{
tree orig_type = TREE_TYPE (*expr_p);
tree new_type, xop0, xop1;
*expr_p = gimple_boolify (*expr_p);
if (!useless_type_conversion_p (orig_type, TREE_TYPE (*expr_p)))
new_type = TREE_TYPE (*expr_p);
if (!useless_type_conversion_p (orig_type, new_type))
{
*expr_p = fold_convert_loc (input_location, orig_type, *expr_p);
ret = GS_OK;
@ -7281,7 +7283,18 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
default:
break;
}
/* Now make sure that operands have compatible type to
expression's new_type. */
xop0 = TREE_OPERAND (*expr_p, 0);
xop1 = TREE_OPERAND (*expr_p, 1);
if (!useless_type_conversion_p (new_type, TREE_TYPE (xop0)))
TREE_OPERAND (*expr_p, 0) = fold_convert_loc (input_location,
new_type,
xop0);
if (!useless_type_conversion_p (new_type, TREE_TYPE (xop1)))
TREE_OPERAND (*expr_p, 1) = fold_convert_loc (input_location,
new_type,
xop1);
/* Continue classified as tcc_binary. */
goto expr_2;
}

View File

@ -1,3 +1,7 @@
2011-10-14 Kai Tietz <ktietz@redhat.com>
* gfortran.fortran-torture/compile/logical-2.f90: New test.
2011-10-14 Jakub Jelinek <jakub@redhat.com>
* gcc.target/i386/sse2-mul-1.c: New test.

View File

@ -0,0 +1,10 @@
! Check for operand type validity after gimplification
subroutine whatever()
logical(kind=1) :: l1
logical(kind=2) :: l2
logical(kind=4) :: l3
if ((l1 .and. l2) .neqv. l3) then
l1 = .true.
endif
end