@@ -185,28 +185,16 @@ impl<'a,'tcx> Builder<'a,'tcx> {
185
185
}
186
186
187
187
TestKind :: Range { ref lo, ref hi, ty } => {
188
- // Test `v ` by computing `PartialOrd::le(lo, v) && PartialOrd::le(v, hi)` .
188
+ // Test `val ` by computing `lo <= val && val <= hi`, using primitive comparisons .
189
189
let lo = self . literal_operand ( test. span , ty. clone ( ) , lo. clone ( ) ) ;
190
190
let hi = self . literal_operand ( test. span , ty. clone ( ) , hi. clone ( ) ) ;
191
- let item_ref = self . hir . partial_le ( ty ) ;
191
+ let val = Operand :: Consume ( lvalue . clone ( ) ) ;
192
192
193
- let lo_blocks = self . call_comparison_fn ( block,
194
- test. span ,
195
- item_ref. clone ( ) ,
196
- lo,
197
- Operand :: Consume ( lvalue. clone ( ) ) ) ;
193
+ let fail = self . cfg . start_new_block ( ) ;
194
+ let block = self . compare ( block, fail, test. span , BinOp :: Le , lo, val. clone ( ) ) ;
195
+ let block = self . compare ( block, fail, test. span , BinOp :: Le , val, hi) ;
198
196
199
- let hi_blocks = self . call_comparison_fn ( lo_blocks[ 0 ] ,
200
- test. span ,
201
- item_ref,
202
- Operand :: Consume ( lvalue. clone ( ) ) ,
203
- hi) ;
204
-
205
- let failure = self . cfg . start_new_block ( ) ;
206
- self . cfg . terminate ( lo_blocks[ 1 ] , Terminator :: Goto { target : failure } ) ;
207
- self . cfg . terminate ( hi_blocks[ 1 ] , Terminator :: Goto { target : failure } ) ;
208
-
209
- vec ! [ hi_blocks[ 0 ] , failure]
197
+ vec ! [ block, fail]
210
198
}
211
199
212
200
TestKind :: Len { len, op } => {
@@ -240,6 +228,29 @@ impl<'a,'tcx> Builder<'a,'tcx> {
240
228
}
241
229
}
242
230
231
+ fn compare ( & mut self ,
232
+ block : BasicBlock ,
233
+ fail_block : BasicBlock ,
234
+ span : Span ,
235
+ op : BinOp ,
236
+ left : Operand < ' tcx > ,
237
+ right : Operand < ' tcx > ) -> BasicBlock {
238
+ let bool_ty = self . hir . bool_ty ( ) ;
239
+ let result = self . temp ( bool_ty) ;
240
+
241
+ // result = op(left, right)
242
+ self . cfg . push_assign ( block, span, & result, Rvalue :: BinaryOp ( op, left, right) ) ;
243
+
244
+ // branch based on result
245
+ let target_block = self . cfg . start_new_block ( ) ;
246
+ self . cfg . terminate ( block, Terminator :: If {
247
+ cond : Operand :: Consume ( result) ,
248
+ targets : ( target_block, fail_block)
249
+ } ) ;
250
+
251
+ target_block
252
+ }
253
+
243
254
fn call_comparison_fn ( & mut self ,
244
255
block : BasicBlock ,
245
256
span : Span ,
0 commit comments