File 0075-hipe-Fix-range-analysis-of-rem-operator.patch of Package erlang

From 7eb0f13659f045dad0db27e4c8e1c6588d6eb044 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Magnus=20L=C3=A5ng?= <margnus1@telia.com>
Date: Sat, 4 Mar 2017 14:52:46 +0100
Subject: [PATCH 1/3] hipe: Fix range analysis of 'rem' operator

erl_bif_types contains a fixed and improved copy-paste (obvious from the
dead Max_range2_leq_zero if branches) of hipe_icode_range:range_rem/2.
For now, delete the dead code and propagate back fixes and improvements
to hipe_icode_range.
---
 lib/hipe/cerl/erl_bif_types.erl     | 5 +----
 lib/hipe/icode/hipe_icode_range.erl | 9 ++++-----
 2 files changed, 5 insertions(+), 9 deletions(-)

diff --git a/lib/hipe/cerl/erl_bif_types.erl b/lib/hipe/cerl/erl_bif_types.erl
index 8c96e6022..9321750d4 100644
--- a/lib/hipe/cerl/erl_bif_types.erl
+++ b/lib/hipe/cerl/erl_bif_types.erl
@@ -2029,17 +2029,14 @@ arith_rem(Min1, Max1, Min2, Max2) ->
   Min1_geq_zero = infinity_geq(Min1, 0),
   Max1_leq_zero = infinity_geq(0, Max1),
   Max_range2 = infinity_max([infinity_abs(Min2), infinity_abs(Max2)]),
-  Max_range2_leq_zero = infinity_geq(0, Max_range2),
-  New_min = 
+  New_min =
     if Min1_geq_zero -> 0;
        Max_range2 =:= 0 -> 0;
-       Max_range2_leq_zero -> infinity_add(Max_range2, 1);
        true -> infinity_add(infinity_inv(Max_range2), 1)
     end,
   New_max = 
     if Max1_leq_zero -> 0;
        Max_range2 =:= 0 -> 0;
-       Max_range2_leq_zero -> infinity_add(infinity_inv(Max_range2), -1);
        true -> infinity_add(Max_range2, -1)
     end,
   {New_min, New_max}.
diff --git a/lib/hipe/icode/hipe_icode_range.erl b/lib/hipe/icode/hipe_icode_range.erl
index b88413232..9aed40bd6 100644
--- a/lib/hipe/icode/hipe_icode_range.erl
+++ b/lib/hipe/icode/hipe_icode_range.erl
@@ -1306,16 +1306,15 @@ range_rem(Range1, Range2) ->
   Min1_geq_zero = inf_geq(Min1, 0),
   Max1_leq_zero = inf_geq(0, Max1),
   Max_range2 = inf_max([inf_abs(Min2), inf_abs(Max2)]),
-  Max_range2_leq_zero = inf_geq(0, Max_range2),
   New_min = 
     if Min1_geq_zero ->	0;
-       Max_range2_leq_zero -> Max_range2;
-       true -> inf_inv(Max_range2)
+       Max_range2 =:= 0 -> 0;
+       true -> inf_add(inf_inv(Max_range2), 1)
     end,
   New_max = 
     if Max1_leq_zero -> 0;
-       Max_range2_leq_zero -> inf_inv(Max_range2);
-       true -> Max_range2
+       Max_range2 =:= 0 -> 0;
+       true -> inf_add(Max_range2, -1)
     end,
   range_init({New_min, New_max}, false).
 
-- 
2.12.2

openSUSE Build Service is sponsored by