OSDN Git Service

PR fortran/42131 Sign test using ternary operator
authorjb <jb@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Dec 2009 18:32:37 +0000 (18:32 +0000)
committerjb <jb@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Dec 2009 18:32:37 +0000 (18:32 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@154876 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/trans-stmt.c

index 976061a..b39afe1 100644 (file)
@@ -1,3 +1,8 @@
+2009-12-01  Janne Blomqvist  <jb@gcc.gnu.org>
+
+       * PR fortran/42131
+       * trans-stmt.c (gfc_trans_do): Sign test using ternary operator.
+
 2009-11-30  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/42053
index e9f76a0..32c6efc 100644 (file)
@@ -1028,17 +1028,13 @@ gfc_trans_do (gfc_code * code)
     {
       tree pos, neg, step_sign, to2, from2, step2;
 
-      /* Calculate SIGN (1,step) */
+      /* Calculate SIGN (1,step), as (step < 0 ? -1 : 1)  */
 
-      tmp = fold_build2 (RSHIFT_EXPR, type, step,
-                        build_int_cst (type,
-                                       TYPE_PRECISION (type) - 1));
-
-      tmp = fold_build2 (MULT_EXPR, type, tmp,
-                        build_int_cst (type, 2));
-
-      step_sign = fold_build2 (PLUS_EXPR, type, tmp,
-                              fold_convert (type, integer_one_node));
+      tmp = fold_build2 (LT_EXPR, boolean_type_node, step, 
+                        build_int_cst (TREE_TYPE (step), 0));
+      step_sign = fold_build3 (COND_EXPR, type, tmp, 
+                              build_int_cst (type, -1), 
+                              build_int_cst (type, 1));
 
       tmp = fold_build2 (LT_EXPR, boolean_type_node, to, from);
       pos = fold_build3 (COND_EXPR, void_type_node, tmp,