* gimplify.c (gimplify_expr): Take care that for bitwise-binary
authorktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 14 Oct 2011 19:30:42 +0000 (19:30 +0000)
committerktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 14 Oct 2011 19:30:42 +0000 (19:30 +0000)
        transformation the operands have compatible types.

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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180006 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.fortran-torture/compile/logical-2.f90 [new file with mode: 0644]

index da47071..ef5faf1 100644 (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,
index 2c9ba1d..8c2c5ac 100644 (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;
          }
index ca69717..f47bc70 100644 (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.
diff --git a/gcc/testsuite/gfortran.fortran-torture/compile/logical-2.f90 b/gcc/testsuite/gfortran.fortran-torture/compile/logical-2.f90
new file mode 100644 (file)
index 0000000..c31443f
--- /dev/null
@@ -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