@@ -16,6 +16,7 @@ use rustc_codegen_ssa::MemFlags;
16
16
use rustc_data_structures:: small_c_str:: SmallCStr ;
17
17
use rustc_hir:: def_id:: DefId ;
18
18
use rustc_middle:: middle:: codegen_fn_attrs:: CodegenFnAttrs ;
19
+ use rustc_middle:: mir:: ExpectKind ;
19
20
use rustc_middle:: ty:: layout:: {
20
21
FnAbiError , FnAbiOfHelpers , FnAbiRequest , LayoutError , LayoutOfHelpers , TyAndLayout ,
21
22
} ;
@@ -202,42 +203,43 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
202
203
cond : & ' ll Value ,
203
204
then_llbb : & ' ll BasicBlock ,
204
205
else_llbb : & ' ll BasicBlock ,
205
- expect : ExpectKind ,
206
+ expect : Option < ExpectKind > ,
206
207
) {
207
208
// emit the branch instruction
208
209
let n = unsafe { llvm:: LLVMBuildCondBr ( self . llbuilder , cond, then_llbb, else_llbb) } ;
209
210
210
211
// emit expectation metadata
211
212
match expect {
212
- ExpectKind :: None => { }
213
- ExpectKind :: True | ExpectKind :: False => unsafe {
213
+ Some ( ExpectKind :: True ) | Some ( ExpectKind :: False ) => unsafe {
214
214
// Use weights 2000 and 1, which is what Clang uses
215
215
let s = "branch_weights" ;
216
+ let e = expect. unwrap ( ) == ExpectKind :: True ;
216
217
let v = [
217
218
llvm:: LLVMMDStringInContext (
218
219
self . cx . llcx ,
219
220
s. as_ptr ( ) as * const c_char ,
220
221
s. len ( ) as c_uint ,
221
222
) ,
222
223
// 'then' branch weight
223
- self . cx . const_u32 ( if expect == ExpectKind :: True { 2000 } else { 1 } ) ,
224
+ self . cx . const_u32 ( if e { 2000 } else { 1 } ) ,
224
225
// 'else' branch weight
225
- self . cx . const_u32 ( if expect == ExpectKind :: True { 1 } else { 2000 } ) ,
226
+ self . cx . const_u32 ( if e { 1 } else { 2000 } ) ,
226
227
] ;
227
228
llvm:: LLVMSetMetadata (
228
229
n,
229
230
llvm:: MD_prof as c_uint ,
230
231
llvm:: LLVMMDNodeInContext ( self . cx . llcx , v. as_ptr ( ) , v. len ( ) as c_uint ) ,
231
232
) ;
232
233
} ,
233
- ExpectKind :: Unpredictable => unsafe {
234
+ Some ( ExpectKind :: Unpredictable ) => unsafe {
234
235
let v: [ & Value ; 0 ] = [ ] ;
235
236
llvm:: LLVMSetMetadata (
236
237
n,
237
238
llvm:: MD_unpredictable as c_uint ,
238
239
llvm:: LLVMMDNodeInContext ( self . cx . llcx , v. as_ptr ( ) , v. len ( ) as c_uint ) ,
239
240
) ;
240
241
} ,
242
+ None => { }
241
243
}
242
244
}
243
245
0 commit comments