mirror of
https://github.com/vosen/ZLUDA.git
synced 2025-08-03 14:50:53 +00:00
Eliminate i1
This commit is contained in:
parent
a9ce8190d0
commit
0ccd5dec5e
1 changed files with 53 additions and 14 deletions
|
@ -510,7 +510,7 @@ fn emit_function_variable(
|
||||||
llvm_type,
|
llvm_type,
|
||||||
get_llvm_address_space(&ctx.constants, variable.state_space)?,
|
get_llvm_address_space(&ctx.constants, variable.state_space)?,
|
||||||
Some(variable.name),
|
Some(variable.name),
|
||||||
);
|
)?;
|
||||||
match variable.initializer {
|
match variable.initializer {
|
||||||
None => {}
|
None => {}
|
||||||
Some(init) => {
|
Some(init) => {
|
||||||
|
@ -1066,14 +1066,10 @@ fn emit_value_copy(
|
||||||
src: LLVMValueRef,
|
src: LLVMValueRef,
|
||||||
dst: Id,
|
dst: Id,
|
||||||
) -> Result<(), TranslateError> {
|
) -> Result<(), TranslateError> {
|
||||||
let builder = ctx.builder.get();
|
let llvm_type = get_llvm_type(ctx, type_)?;
|
||||||
let type_ = get_llvm_type(ctx, type_)?;
|
let temp_value = emit_alloca(ctx, llvm_type, ctx.constants.private_space, None)?;
|
||||||
let temp_value = emit_alloca(ctx, type_, ctx.constants.private_space, None);
|
emit_alloca_store(ctx, type_, src, temp_value)?;
|
||||||
unsafe { LLVMBuildStore(builder, src, temp_value) };
|
emit_alloca_load(ctx, type_, dst, temp_value)
|
||||||
ctx.names.register_result(dst, |dst| unsafe {
|
|
||||||
LLVMBuildLoad2(builder, type_, temp_value, dst)
|
|
||||||
});
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// From "Performance Tips for Frontend Authors" (https://llvm.org/docs/Frontend/PerformanceTips.html):
|
// From "Performance Tips for Frontend Authors" (https://llvm.org/docs/Frontend/PerformanceTips.html):
|
||||||
|
@ -1086,16 +1082,21 @@ fn emit_alloca(
|
||||||
type_: LLVMTypeRef,
|
type_: LLVMTypeRef,
|
||||||
addr_space: u32,
|
addr_space: u32,
|
||||||
name: Option<Id>,
|
name: Option<Id>,
|
||||||
) -> LLVMValueRef {
|
) -> Result<LLVMValueRef, TranslateError> {
|
||||||
let builder = ctx.builder.get();
|
let builder = ctx.builder.get();
|
||||||
let current_bb = unsafe { LLVMGetInsertBlock(builder) };
|
let current_bb = unsafe { LLVMGetInsertBlock(builder) };
|
||||||
let variables_bb = unsafe { LLVMGetFirstBasicBlock(LLVMGetBasicBlockParent(current_bb)) };
|
let variables_bb = unsafe { LLVMGetFirstBasicBlock(LLVMGetBasicBlockParent(current_bb)) };
|
||||||
unsafe { LLVMPositionBuilderAtEnd(builder, variables_bb) };
|
unsafe { LLVMPositionBuilderAtEnd(builder, variables_bb) };
|
||||||
|
let type_ = if type_ == get_llvm_type(ctx, &ast::Type::Scalar(ast::ScalarType::Pred))? {
|
||||||
|
get_llvm_type(ctx, &ast::Type::Scalar(ast::ScalarType::B8))?
|
||||||
|
} else {
|
||||||
|
type_
|
||||||
|
};
|
||||||
let result = ctx.names.register_result_option(name, |name| unsafe {
|
let result = ctx.names.register_result_option(name, |name| unsafe {
|
||||||
LLVMZludaBuildAlloca(builder, type_, addr_space, name)
|
LLVMZludaBuildAlloca(builder, type_, addr_space, name)
|
||||||
});
|
});
|
||||||
unsafe { LLVMPositionBuilderAtEnd(builder, current_bb) };
|
unsafe { LLVMPositionBuilderAtEnd(builder, current_bb) };
|
||||||
result
|
Ok(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_instruction(
|
fn emit_instruction(
|
||||||
|
@ -3475,11 +3476,33 @@ fn emit_load_var(
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
let llvm_type = get_llvm_type(ctx, &load.typ)?;
|
emit_alloca_load(ctx, &load.typ, load.arg.dst, src)
|
||||||
ctx.names.register_result(load.arg.dst, |dst| unsafe {
|
}
|
||||||
|
|
||||||
|
fn emit_alloca_load(
|
||||||
|
ctx: &mut EmitContext,
|
||||||
|
type_: &ast::Type,
|
||||||
|
dst_id: Id,
|
||||||
|
src: LLVMValueRef,
|
||||||
|
) -> Result<(), TranslateError> {
|
||||||
|
let builder = ctx.builder.get();
|
||||||
|
let (dst, llvm_type) = if type_ == &ast::Type::Scalar(ast::ScalarType::Pred) {
|
||||||
|
(
|
||||||
|
None,
|
||||||
|
get_llvm_type(ctx, &ast::Type::Scalar(ast::ScalarType::B8))?,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
(Some(dst_id), get_llvm_type(ctx, &type_)?)
|
||||||
|
};
|
||||||
|
let ld_result = ctx.names.register_result_option(dst, |dst| unsafe {
|
||||||
LLVMBuildLoad2(builder, llvm_type, src, dst)
|
LLVMBuildLoad2(builder, llvm_type, src, dst)
|
||||||
});
|
});
|
||||||
Ok(())
|
Ok(if type_ == &ast::Type::Scalar(ast::ScalarType::Pred) {
|
||||||
|
let pred_type = get_llvm_type(ctx, &ast::Type::Scalar(ast::ScalarType::Pred))?;
|
||||||
|
ctx.names.register_result(dst_id, |dst| unsafe {
|
||||||
|
LLVMBuildTrunc(builder, ld_result, pred_type, dst)
|
||||||
|
});
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_store_var(
|
fn emit_store_var(
|
||||||
|
@ -3505,6 +3528,22 @@ fn emit_store_var(
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
let val = ctx.names.value(store.arg.src2)?;
|
let val = ctx.names.value(store.arg.src2)?;
|
||||||
|
emit_alloca_store(ctx, &store.type_, val, ptr)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn emit_alloca_store(
|
||||||
|
ctx: &mut EmitContext,
|
||||||
|
type_: &ast::Type,
|
||||||
|
val: LLVMValueRef,
|
||||||
|
ptr: LLVMValueRef,
|
||||||
|
) -> Result<(), TranslateError> {
|
||||||
|
let val = if type_ == &ast::Type::Scalar(ast::ScalarType::Pred) {
|
||||||
|
let b8_type = get_llvm_type(ctx, &ast::Type::Scalar(ast::ScalarType::B8))?;
|
||||||
|
unsafe { LLVMBuildZExt(ctx.builder.get(), val, b8_type, LLVM_UNNAMED) }
|
||||||
|
} else {
|
||||||
|
val
|
||||||
|
};
|
||||||
unsafe { LLVMBuildStore(ctx.builder.get(), val, ptr) };
|
unsafe { LLVMBuildStore(ctx.builder.get(), val, ptr) };
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue