Self-explanatory, tested on x86_64-suse-linux, applied on the mainline.

2015-11-30  Eric Botcazou  <ebotca...@adacore.com>

        * gcc-interface/utils2.c (gnat_invariant_expr): Add type conversions.


2015-11-30  Eric Botcazou  <ebotca...@adacore.com>

        * gnat.dg/loop_optimization22.ad[sb]: New test.


-- 
Eric Botcazou
-- { dg-do compile }
-- { dg-options "-O" }

pragma Overflow_Mode (Minimized);

package body Loop_Optimization22 is

  procedure Foo (X : Discrim_Type) is
      H : array (1 .. Integer (X.Count) + 1) of Float;
   begin
      for I in 1 .. X.Count loop
         H (Integer(I) + 1):= 0.0;
      end loop;
   end;

end Loop_Optimization22;
package Loop_Optimization22 is

  type Discrim_Type (Count : Positive) is null record;

  procedure Foo (X : Discrim_Type);

end Loop_Optimization22;
Index: gcc-interface/utils2.c
===================================================================
--- gcc-interface/utils2.c	(revision 231061)
+++ gcc-interface/utils2.c	(working copy)
@@ -2860,7 +2860,9 @@ gnat_invariant_expr (tree expr)
       tree op0 = gnat_invariant_expr (TREE_OPERAND (expr, 0));
       tree op1 = TREE_OPERAND (expr, 1);
       if (op0 && TREE_CONSTANT (op1))
-	return fold_build2 (TREE_CODE (expr), type, op0, op1);
+	return
+	  fold_build2 (TREE_CODE (expr), type,
+		       fold_convert (type, op0), fold_convert (type, op1));
       else
 	return NULL_TREE;
     }

Reply via email to