MCPcopy Create free account
hub / github.com/Rust-GPU/rust-cuda / load_operand

Method load_operand

crates/rustc_codegen_nvvm/src/builder.rs:517–589  ·  view source on GitHub ↗
(&mut self, place: PlaceRef<'tcx, &'ll Value>)

Source from the content-addressed store, hash-verified

515 }
516
517 fn load_operand(&mut self, place: PlaceRef<'tcx, &'ll Value>) -> OperandRef<'tcx, &'ll Value> {
518 trace!("Load operand `{:?}`", place);
519 assert_eq!(place.llextra.is_some(), place.layout.is_unsized());
520
521 if place.layout.is_zst() {
522 return OperandRef::new_zst(self, place.layout);
523 }
524
525 fn scalar_load_metadata<'a, 'll, 'tcx>(
526 bx: &mut Builder<'a, 'll, 'tcx>,
527 load: &'ll Value,
528 scalar: &abi::Scalar,
529 ) {
530 match scalar.value {
531 abi::Int(..) => {
532 if !scalar.is_always_valid(bx) {
533 bx.range_metadata(load, scalar.valid_range);
534 }
535 }
536 abi::Pointer if !scalar.valid_range.contains(0) => {
537 bx.nonnull_metadata(load);
538 }
539 _ => {}
540 }
541 }
542
543 let val = if let Some(llextra) = place.llextra {
544 OperandValue::Ref(place.llval, Some(llextra), place.align)
545 } else if place.layout.is_llvm_immediate() {
546 let mut const_llval = None;
547 unsafe {
548 if let Some(global) = llvm::LLVMIsAGlobalVariable(place.llval) {
549 if llvm::LLVMIsGlobalConstant(global) == llvm::True {
550 const_llval = llvm::LLVMGetInitializer(global);
551 }
552 }
553 }
554
555 let llval = const_llval.unwrap_or_else(|| {
556 let load = self.load(place.layout.llvm_type(self), place.llval, place.align);
557
558 if let abi::Abi::Scalar(ref scalar) = place.layout.abi {
559 scalar_load_metadata(self, load, scalar);
560 }
561 load
562 });
563
564 OperandValue::Immediate(self.to_immediate(llval, place.layout))
565 } else if let abi::Abi::ScalarPair(ref a, ref b) = place.layout.abi {
566 let b_offset = a.value.size(self).align_to(b.value.align(self).abi);
567 let pair_ty = place.layout.llvm_type(self);
568
569 let mut load = |i, scalar: &abi::Scalar, align| {
570 let llptr = self.struct_gep(pair_ty, place.llval, i as u64);
571 let llty = place.layout.scalar_pair_element_llvm_type(self, i, false);
572 let load = self.load(llty, llptr, align);
573 scalar_load_metadata(self, load, scalar);
574 self.to_immediate_scalar(load, *scalar)

Callers 1

Calls 7

is_llvm_immediateMethod · 0.80
loadMethod · 0.80
sizeMethod · 0.80
struct_gepMethod · 0.80
to_immediate_scalarMethod · 0.80
llvm_typeMethod · 0.45

Tested by

no test coverage detected