Remove type_variadic_func and typ_array from cg_ssa
This commit is contained in:
parent
0e166bb217
commit
b71c429007
5 changed files with 80 additions and 73 deletions
|
@ -652,7 +652,37 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||
OperandRef { val, layout: place.layout }
|
||||
}
|
||||
|
||||
fn write_operand_repeatedly(
|
||||
mut self,
|
||||
cg_elem: OperandRef<'tcx, &'ll Value>,
|
||||
count: u64,
|
||||
dest: PlaceRef<'tcx, &'ll Value>,
|
||||
) -> Self {
|
||||
let zero = self.const_usize(0);
|
||||
let count = self.const_usize(count);
|
||||
let start = dest.project_index(&mut self, zero).llval;
|
||||
let end = dest.project_index(&mut self, count).llval;
|
||||
|
||||
let mut header_bx = self.build_sibling_block("repeat_loop_header");
|
||||
let mut body_bx = self.build_sibling_block("repeat_loop_body");
|
||||
let next_bx = self.build_sibling_block("repeat_loop_next");
|
||||
|
||||
self.br(header_bx.llbb());
|
||||
let current = header_bx.phi(self.val_ty(start), &[start], &[self.llbb()]);
|
||||
|
||||
let keep_going = header_bx.icmp(IntPredicate::IntNE, current, end);
|
||||
header_bx.cond_br(keep_going, body_bx.llbb(), next_bx.llbb());
|
||||
|
||||
let align = dest.align.restrict_for_offset(dest.layout.field(self.cx(), 0).size);
|
||||
cg_elem.val.store(&mut body_bx,
|
||||
PlaceRef::new_sized(current, cg_elem.layout, align));
|
||||
|
||||
let next = body_bx.inbounds_gep(current, &[self.const_usize(1)]);
|
||||
body_bx.br(header_bx.llbb());
|
||||
header_bx.add_incoming_to_phi(current, next, body_bx.llbb());
|
||||
|
||||
next_bx
|
||||
}
|
||||
|
||||
fn range_metadata(&mut self, load: &'ll Value, range: Range<u128>) {
|
||||
if self.sess().target.target.arch == "amdgpu" {
|
||||
|
@ -873,20 +903,6 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||
}
|
||||
|
||||
/* Miscellaneous instructions */
|
||||
fn phi(&mut self, ty: &'ll Type, vals: &[&'ll Value], bbs: &[&'ll BasicBlock]) -> &'ll Value {
|
||||
self.count_insn("addincoming");
|
||||
assert_eq!(vals.len(), bbs.len());
|
||||
let phi = unsafe {
|
||||
llvm::LLVMBuildPhi(self.llbuilder, ty, noname())
|
||||
};
|
||||
unsafe {
|
||||
llvm::LLVMAddIncoming(phi, vals.as_ptr(),
|
||||
bbs.as_ptr(),
|
||||
vals.len() as c_uint);
|
||||
phi
|
||||
}
|
||||
}
|
||||
|
||||
fn inline_asm_call(&mut self, asm: &CStr, cons: &CStr,
|
||||
inputs: &[&'ll Value], output: &'ll Type,
|
||||
volatile: bool, alignstack: bool,
|
||||
|
@ -1188,13 +1204,6 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
fn add_incoming_to_phi(&mut self, phi: &'ll Value, val: &'ll Value, bb: &'ll BasicBlock) {
|
||||
self.count_insn("addincoming");
|
||||
unsafe {
|
||||
llvm::LLVMAddIncoming(phi, &val, &bb, 1 as c_uint);
|
||||
}
|
||||
}
|
||||
|
||||
fn set_invariant_load(&mut self, load: &'ll Value) {
|
||||
unsafe {
|
||||
llvm::LLVMSetMetadata(load, llvm::MD_invariant_load as c_uint,
|
||||
|
@ -1526,4 +1535,25 @@ impl Builder<'a, 'll, 'tcx> {
|
|||
let ptr = self.pointercast(ptr, self.cx.type_i8p());
|
||||
self.call(lifetime_intrinsic, &[self.cx.const_u64(size), ptr], None);
|
||||
}
|
||||
|
||||
fn phi(&mut self, ty: &'ll Type, vals: &[&'ll Value], bbs: &[&'ll BasicBlock]) -> &'ll Value {
|
||||
self.count_insn("addincoming");
|
||||
assert_eq!(vals.len(), bbs.len());
|
||||
let phi = unsafe {
|
||||
llvm::LLVMBuildPhi(self.llbuilder, ty, noname())
|
||||
};
|
||||
unsafe {
|
||||
llvm::LLVMAddIncoming(phi, vals.as_ptr(),
|
||||
bbs.as_ptr(),
|
||||
vals.len() as c_uint);
|
||||
phi
|
||||
}
|
||||
}
|
||||
|
||||
fn add_incoming_to_phi(&mut self, phi: &'ll Value, val: &'ll Value, bb: &'ll BasicBlock) {
|
||||
self.count_insn("addincoming");
|
||||
unsafe {
|
||||
llvm::LLVMAddIncoming(phi, &val, &bb, 1 as c_uint);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -141,6 +141,23 @@ impl CodegenCx<'ll, 'tcx> {
|
|||
assert_eq!(size % unit_size, 0);
|
||||
self.type_array(self.type_from_integer(unit), size / unit_size)
|
||||
}
|
||||
|
||||
crate fn type_variadic_func(
|
||||
&self,
|
||||
args: &[&'ll Type],
|
||||
ret: &'ll Type
|
||||
) -> &'ll Type {
|
||||
unsafe {
|
||||
llvm::LLVMFunctionType(ret, args.as_ptr(),
|
||||
args.len() as c_uint, True)
|
||||
}
|
||||
}
|
||||
|
||||
crate fn type_array(&self, ty: &'ll Type, len: u64) -> &'ll Type {
|
||||
unsafe {
|
||||
llvm::LLVMRustArrayType(ty, len)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl BaseTypeMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
||||
|
@ -208,17 +225,6 @@ impl BaseTypeMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
fn type_variadic_func(
|
||||
&self,
|
||||
args: &[&'ll Type],
|
||||
ret: &'ll Type
|
||||
) -> &'ll Type {
|
||||
unsafe {
|
||||
llvm::LLVMFunctionType(ret, args.as_ptr(),
|
||||
args.len() as c_uint, True)
|
||||
}
|
||||
}
|
||||
|
||||
fn type_struct(
|
||||
&self,
|
||||
els: &[&'ll Type],
|
||||
|
@ -231,13 +237,6 @@ impl BaseTypeMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
fn type_array(&self, ty: &'ll Type, len: u64) -> &'ll Type {
|
||||
unsafe {
|
||||
llvm::LLVMRustArrayType(ty, len)
|
||||
}
|
||||
}
|
||||
|
||||
fn type_kind(&self, ty: &'ll Type) -> TypeKind {
|
||||
unsafe {
|
||||
llvm::LLVMRustGetTypeKind(ty).to_generic()
|
||||
|
|
|
@ -87,11 +87,11 @@ impl<'a, 'tcx: 'a, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
if dest.layout.is_zst() {
|
||||
return bx;
|
||||
}
|
||||
let zero = bx.cx().const_usize(0);
|
||||
let start = dest.project_index(&mut bx, zero).llval;
|
||||
|
||||
if let OperandValue::Immediate(v) = cg_elem.val {
|
||||
let size = bx.cx().const_usize(dest.layout.size.bytes());
|
||||
let zero = bx.const_usize(0);
|
||||
let start = dest.project_index(&mut bx, zero).llval;
|
||||
let size = bx.const_usize(dest.layout.size.bytes());
|
||||
|
||||
// Use llvm.memset.p0i8.* to initialize all zero arrays
|
||||
if bx.cx().is_const_integral(v) && bx.cx().const_to_uint(v) == 0 {
|
||||
|
@ -108,28 +108,7 @@ impl<'a, 'tcx: 'a, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
}
|
||||
}
|
||||
|
||||
let count = bx.cx().const_usize(count);
|
||||
let end = dest.project_index(&mut bx, count).llval;
|
||||
|
||||
let mut header_bx = bx.build_sibling_block("repeat_loop_header");
|
||||
let mut body_bx = bx.build_sibling_block("repeat_loop_body");
|
||||
let next_bx = bx.build_sibling_block("repeat_loop_next");
|
||||
|
||||
bx.br(header_bx.llbb());
|
||||
let current = header_bx.phi(bx.cx().val_ty(start), &[start], &[bx.llbb()]);
|
||||
|
||||
let keep_going = header_bx.icmp(IntPredicate::IntNE, current, end);
|
||||
header_bx.cond_br(keep_going, body_bx.llbb(), next_bx.llbb());
|
||||
|
||||
let align = dest.align.restrict_for_offset(dest.layout.field(bx.cx(), 0).size);
|
||||
cg_elem.val.store(&mut body_bx,
|
||||
PlaceRef::new_sized(current, cg_elem.layout, align));
|
||||
|
||||
let next = body_bx.inbounds_gep(current, &[bx.cx().const_usize(1)]);
|
||||
body_bx.br(header_bx.llbb());
|
||||
header_bx.add_incoming_to_phi(current, next, body_bx.llbb());
|
||||
|
||||
next_bx
|
||||
bx.write_operand_repeatedly(cg_elem, count, dest)
|
||||
}
|
||||
|
||||
mir::Rvalue::Aggregate(ref kind, ref operands) => {
|
||||
|
|
|
@ -116,6 +116,14 @@ pub trait BuilderMethods<'a, 'tcx: 'a>:
|
|||
fn load_operand(&mut self, place: PlaceRef<'tcx, Self::Value>)
|
||||
-> OperandRef<'tcx, Self::Value>;
|
||||
|
||||
/// Called for Rvalue::Repeat when the elem is neither a ZST nor optimizable using memset.
|
||||
fn write_operand_repeatedly(
|
||||
self,
|
||||
elem: OperandRef<'tcx, Self::Value>,
|
||||
count: u64,
|
||||
dest: PlaceRef<'tcx, Self::Value>,
|
||||
) -> Self;
|
||||
|
||||
fn range_metadata(&mut self, load: Self::Value, range: Range<u128>);
|
||||
fn nonnull_metadata(&mut self, load: Self::Value);
|
||||
|
||||
|
@ -156,12 +164,6 @@ pub trait BuilderMethods<'a, 'tcx: 'a>:
|
|||
fn icmp(&mut self, op: IntPredicate, lhs: Self::Value, rhs: Self::Value) -> Self::Value;
|
||||
fn fcmp(&mut self, op: RealPredicate, lhs: Self::Value, rhs: Self::Value) -> Self::Value;
|
||||
|
||||
fn phi(
|
||||
&mut self,
|
||||
ty: Self::Type,
|
||||
vals: &[Self::Value],
|
||||
bbs: &[Self::BasicBlock],
|
||||
) -> Self::Value;
|
||||
fn inline_asm_call(
|
||||
&mut self,
|
||||
asm: &CStr,
|
||||
|
@ -255,7 +257,6 @@ pub trait BuilderMethods<'a, 'tcx: 'a>:
|
|||
) -> Self::Value;
|
||||
fn atomic_fence(&mut self, order: AtomicOrdering, scope: SynchronizationScope);
|
||||
fn add_case(&mut self, s: Self::Value, on_val: Self::Value, dest: Self::BasicBlock);
|
||||
fn add_incoming_to_phi(&mut self, phi: Self::Value, val: Self::Value, bb: Self::BasicBlock);
|
||||
fn set_invariant_load(&mut self, load: Self::Value);
|
||||
|
||||
/// Called for `StorageLive`
|
||||
|
|
|
@ -23,9 +23,7 @@ pub trait BaseTypeMethods<'tcx>: Backend<'tcx> {
|
|||
fn type_f64(&self) -> Self::Type;
|
||||
|
||||
fn type_func(&self, args: &[Self::Type], ret: Self::Type) -> Self::Type;
|
||||
fn type_variadic_func(&self, args: &[Self::Type], ret: Self::Type) -> Self::Type;
|
||||
fn type_struct(&self, els: &[Self::Type], packed: bool) -> Self::Type;
|
||||
fn type_array(&self, ty: Self::Type, len: u64) -> Self::Type;
|
||||
fn type_kind(&self, ty: Self::Type) -> TypeKind;
|
||||
fn type_ptr_to(&self, ty: Self::Type) -> Self::Type;
|
||||
fn element_type(&self, ty: Self::Type) -> Self::Type;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue