]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gimplify.c (gimplify_expr): Take care that for bitwise-binary transformation the...
authorKai Tietz <ktietz@redhat.com>
Fri, 14 Oct 2011 19:30:42 +0000 (21:30 +0200)
committerKai Tietz <ktietz@gcc.gnu.org>
Fri, 14 Oct 2011 19:30:42 +0000 (21:30 +0200)
        * 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

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

index da4707105bd6a4b6c9b357fbbf0f82380980ef29..ef5faf1790ca37089ab514b8665ed5b511f21482 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 2c9ba1d78aadf34a5b0d5193cf5d768cf8efbf53..8c2c5ac2c9c01e92efa3f2c51e283bacd727162f 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 ca69717cae6c5eed52b4a8007d2562f79d4ad199..f47bc70dcdb979a8fe52068f298d47ec0ef6cbb0 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