@@ -56,6 +56,7 @@ irange_cmp_lossiness(IndexRange a, IndexRange b)
56
56
IndexRange
57
57
irange_union_simple (IndexRange a , IndexRange b )
58
58
{
59
+ /* Ranges should be connected somehow */
59
60
Assert (iranges_intersect (a , b ) || iranges_adjoin (a , b ));
60
61
61
62
return make_irange (Min (irange_lower (a ), irange_lower (b )),
@@ -67,6 +68,7 @@ irange_union_simple(IndexRange a, IndexRange b)
67
68
IndexRange
68
69
irange_intersection_simple (IndexRange a , IndexRange b )
69
70
{
71
+ /* Ranges should be connected somehow */
70
72
Assert (iranges_intersect (a , b ) || iranges_adjoin (a , b ));
71
73
72
74
return make_irange (Max (irange_lower (a ), irange_lower (b )),
@@ -81,43 +83,74 @@ irange_handle_cover_internal(IndexRange ir_covering,
81
83
IndexRange ir_inner ,
82
84
List * * new_iranges )
83
85
{
86
+ /* Equal lossiness should've been taken into cosideration earlier */
87
+ Assert (is_irange_lossy (ir_covering ) != is_irange_lossy (ir_inner ));
88
+
84
89
/* range 'ir_inner' is lossy */
85
90
if (is_irange_lossy (ir_covering ) == false)
86
- /* Good, this means 'ir_covering' is not */
87
91
return ir_covering ;
88
92
89
- /* range 'ir_covering' is lossy */
93
+ /* range 'ir_covering' is lossy, 'ir_inner' is lossless! */
90
94
else
91
95
{
92
- /* which means that 'ir_inner' is lossless! */
93
- IndexRange left_range ,
94
- right_range ;
96
+ IndexRange ret ; /* IndexRange to be returned */
97
+
98
+ /* 'left_range_upper' should not be less than 'left_range_lower' */
99
+ uint32 left_range_lower = irange_lower (ir_covering ),
100
+ left_range_upper = Max (irb_pred (irange_lower (ir_inner )),
101
+ left_range_lower );
102
+
103
+ /* 'right_range_lower' should not be greater than 'right_range_upper' */
104
+ uint32 right_range_upper = irange_upper (ir_covering ),
105
+ right_range_lower = Min (irb_succ (irange_upper (ir_inner )),
106
+ right_range_upper );
95
107
96
108
/* We have to split the covering lossy IndexRange */
97
109
Assert (is_irange_lossy (ir_covering ) == true);
98
110
99
- /* Left IndexRange is lossy */
100
- left_range = make_irange (irange_lower (ir_covering ),
101
- irange_lower (ir_inner ),
102
- true);
111
+ /* 'ir_inner' should not cover leftmost IndexRange */
112
+ if (irange_lower (ir_inner ) > left_range_upper )
113
+ {
114
+ IndexRange left_range ;
115
+
116
+ /* Leftmost IndexRange is lossy */
117
+ left_range = make_irange (left_range_lower ,
118
+ left_range_upper ,
119
+ true);
103
120
104
- /* Right IndexRange is also lossy */
105
- right_range = make_irange (irange_upper (ir_inner ),
106
- irange_upper (ir_covering ),
107
- true);
121
+ /* Append leftmost IndexRange ('left_range') to 'new_iranges' */
122
+ * new_iranges = lappend_irange (* new_iranges , left_range );
123
+ }
108
124
109
- /* Append leftmost and medial IndexRanges to list */
110
- * new_iranges = lappend_irange (* new_iranges , left_range );
111
- * new_iranges = lappend_irange (* new_iranges , ir_inner );
125
+ /* 'ir_inner' should not cover rightmost IndexRange */
126
+ if (right_range_lower > irange_upper (ir_inner ))
127
+ {
128
+ IndexRange right_range ;
129
+
130
+ /* Rightmost IndexRange is also lossy */
131
+ right_range = make_irange (right_range_lower ,
132
+ right_range_upper ,
133
+ true);
134
+
135
+ /* 'right_range' is indeed rightmost IndexRange */
136
+ ret = right_range ;
137
+
138
+ /* Append medial IndexRange ('ir_inner') to 'new_iranges' */
139
+ * new_iranges = lappend_irange (* new_iranges , ir_inner );
140
+ }
141
+ /* Else return 'ir_inner' as rightmost IndexRange */
142
+ else ret = ir_inner ;
112
143
113
- /* Return rightmost IndexRange */
114
- return right_range ;
144
+ /* Return rightmost IndexRange (right_range | ir_inner) */
145
+ return ret ;
115
146
}
116
147
}
117
148
118
149
/* Calculate union of two IndexRanges, return rightmost IndexRange */
119
150
static IndexRange
120
- irange_union_internal (IndexRange first , IndexRange second , List * * new_iranges )
151
+ irange_union_internal (IndexRange first ,
152
+ IndexRange second ,
153
+ List * * new_iranges )
121
154
{
122
155
/* Swap 'first' and 'second' if order is incorrect */
123
156
if (irange_lower (first ) > irange_lower (second ))
0 commit comments