*** empty log message ***
authorRichard Kenner <kenner@gcc.gnu.org>
Mon, 25 May 1992 10:28:09 +0000 (06:28 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Mon, 25 May 1992 10:28:09 +0000 (06:28 -0400)
From-SVN: r1079

gcc/explow.c
gcc/fold-const.c
gcc/reload1.c

index 50b0582600a16c15def4821cd0312d93db1e604f..c01c21b338e0bfca967fe114420f9a485f466d42 100644 (file)
@@ -846,14 +846,18 @@ allocate_dynamic_stack_space (size, target, known_align)
 
 #ifdef MUST_ALIGN
 
-  if (GET_CODE (size) == CONST_INT)
-    size = gen_rtx (CONST_INT, VOIDmode,
-                   INTVAL (size) + (BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1));
-  else
-    size = expand_binop (Pmode, add_optab, size,
-                        gen_rtx (CONST_INT, VOIDmode,
-                                 BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1),
-                        0, 1, OPTAB_LIB_WIDEN);
+  if (known_align % BIGGEST_ALIGNMENT != 0)
+    {
+      if (GET_CODE (size) == CONST_INT)
+       size = gen_rtx (CONST_INT, VOIDmode,
+                       (INTVAL (size)
+                        + (BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1)));
+      else
+       size = expand_binop (Pmode, add_optab, size,
+                            gen_rtx (CONST_INT, VOIDmode,
+                                     BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1),
+                            0, 1, OPTAB_LIB_WIDEN);
+    }
 #endif
 
 #ifdef SETJMP_VIA_SAVE_AREA
index fcabebd071a1b3bb1131aa78710d795a6721e525..ba44e202bc58df4425206937ac3c2df806ee1822 100644 (file)
@@ -3140,6 +3140,49 @@ fold (expr)
        return non_lvalue (convert (type, arg0));
       if (integer_zerop (arg1))
        return t;
+
+      /* If we have ((a * C1) / C2) and C1 % C2 == 0, we can replace this with
+        (a * (C1/C2).  Also look for when we have a SAVE_EXPR in
+        between.  */
+      if (TREE_CODE (arg1) == INTEGER_CST
+         && TREE_INT_CST_LOW (arg1) > 0 && TREE_INT_CST_HIGH (arg1) == 0
+         && TREE_CODE (arg0) == MULT_EXPR
+         && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
+         && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) > 0
+         && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
+         && 0 == (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1))
+                  % TREE_INT_CST_LOW (arg1)))
+       {
+         tree new_op
+           = build_int_2 (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1))
+                          / TREE_INT_CST_LOW (arg1));
+
+         TREE_TYPE (new_op) = type;
+         return build (MULT_EXPR, type, TREE_OPERAND (arg0, 0), new_op);
+       }
+
+      else if (TREE_CODE (arg1) == INTEGER_CST
+              && TREE_INT_CST_LOW (arg1) > 0 && TREE_INT_CST_HIGH (arg1) == 0
+              && TREE_CODE (arg0) == SAVE_EXPR
+              && TREE_CODE (TREE_OPERAND (arg0, 0)) == MULT_EXPR
+              && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
+                  == INTEGER_CST)
+              && (TREE_INT_CST_LOW (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
+                  > 0)
+              && (TREE_INT_CST_HIGH (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
+                  == 0)
+              && (TREE_INT_CST_LOW (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
+                  % TREE_INT_CST_LOW (arg1)) == 0)
+       {
+         tree new_op
+           = build_int_2 (TREE_INT_CST_LOW (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
+                          / TREE_INT_CST_LOW (arg1));
+         
+         TREE_TYPE (new_op) = type;
+         return build (MULT_EXPR, type,
+                       TREE_OPERAND (TREE_OPERAND (arg0, 0), 0), new_op);
+       }
+
 #if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
 #ifndef REAL_INFINITY
       if (TREE_CODE (arg1) == REAL_CST
index ae809f13fc2bcf8ec20fbfb5bb787596624a5ed8..eca3e9a694c66c90417c030e8f2561c479de0ad7 100644 (file)
@@ -5522,7 +5522,9 @@ gen_input_reload (reloadreg, in, before_insn, is_asm)
   else if (GET_RTX_CLASS (GET_CODE (in)) == 'o' || GET_CODE (in) == SUBREG)
     {
       rtx x = emit_insn_before (gen_move_insn (reloadreg, in), before_insn);
-      if (is_asm && recog_memoized (x) < 0)
+      if (is_asm
+         && (recog_memoized (x) < 0
+             || (insn_extract (x), ! constrain_operands (INSN_CODE (x), 1))))
        {
          delete_insn (x);
          return 0;
@@ -5534,7 +5536,9 @@ gen_input_reload (reloadreg, in, before_insn, is_asm)
     {
       rtx x = emit_insn_before (gen_reload_load_address (reloadreg, in),
                                before_insn);
-      if (is_asm && recog_memoized (x) < 0)
+      if (is_asm
+         && (recog_memoized (x) < 0
+             || (insn_extract (x), ! constrain_operands (INSN_CODE (x), 1))))
        {
          delete_insn (x);
          return 0;
@@ -5547,7 +5551,9 @@ gen_input_reload (reloadreg, in, before_insn, is_asm)
     {
       rtx x = emit_insn_before (gen_rtx (SET, VOIDmode, reloadreg, in),
                                before_insn);
-      if (is_asm && recog_memoized (x) < 0)
+      if (is_asm
+         && (recog_memoized (x) < 0
+             || (insn_extract (x), ! constrain_operands (INSN_CODE (x), 1))))
        {
          delete_insn (x);
          return 0;