mirror of
https://github.com/vosen/ZLUDA.git
synced 2025-07-22 19:56:20 +03:00
Fix small bug in stateful postprocess
This commit is contained in:
@ -4136,6 +4136,11 @@ fn emit_implicit_conversion(
|
|||||||
let dst_type = map.get_or_add(builder, SpirvType::new(cv.to_type.clone()));
|
let dst_type = map.get_or_add(builder, SpirvType::new(cv.to_type.clone()));
|
||||||
builder.convert_ptr_to_u(dst_type, Some(cv.dst), cv.src)?;
|
builder.convert_ptr_to_u(dst_type, Some(cv.dst), cv.src)?;
|
||||||
}
|
}
|
||||||
|
(TypeKind::Pointer, TypeKind::Scalar, &ConversionKind::Default)
|
||||||
|
| (TypeKind::Scalar, TypeKind::Pointer, &ConversionKind::Default) => {
|
||||||
|
let dst_type = map.get_or_add(builder, SpirvType::new(cv.to_type.clone()));
|
||||||
|
builder.bitcast(dst_type, Some(cv.dst), cv.src)?;
|
||||||
|
}
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -4610,72 +4615,63 @@ fn convert_to_stateful_memory_access_postprocess(
|
|||||||
arg_desc: ArgumentDescriptor<spirv::Word>,
|
arg_desc: ArgumentDescriptor<spirv::Word>,
|
||||||
expected_type: Option<(&ast::Type, ast::StateSpace)>,
|
expected_type: Option<(&ast::Type, ast::StateSpace)>,
|
||||||
) -> Result<spirv::Word, TranslateError> {
|
) -> Result<spirv::Word, TranslateError> {
|
||||||
Ok(match remapped_ids.get(&arg_desc.op) {
|
Ok(
|
||||||
Some(new_id) => {
|
match remapped_ids
|
||||||
// We skip conversion here to trigger PtrAcces in a later pass
|
.get(&arg_desc.op)
|
||||||
let old_type = match expected_type {
|
.or_else(|| func_args_ptr.get(&arg_desc.op))
|
||||||
Some((ast::Type::Pointer(_, ast::StateSpace::Global), ast::StateSpace::Reg)) => {
|
{
|
||||||
return Ok(*new_id)
|
|
||||||
}
|
|
||||||
_ => id_defs.get_typed(arg_desc.op)?.0,
|
|
||||||
};
|
|
||||||
let old_type_clone = old_type.clone();
|
|
||||||
let converting_id =
|
|
||||||
id_defs.register_intermediate(Some((old_type_clone, ast::StateSpace::Reg)));
|
|
||||||
if arg_desc.is_dst {
|
|
||||||
post_statements.push(Statement::Conversion(ImplicitConversion {
|
|
||||||
src: converting_id,
|
|
||||||
dst: *new_id,
|
|
||||||
from_type: old_type,
|
|
||||||
from_space: ast::StateSpace::Reg,
|
|
||||||
to_type: ast::Type::Pointer(ast::ScalarType::U8, ast::StateSpace::Global),
|
|
||||||
to_space: ast::StateSpace::Reg,
|
|
||||||
kind: ConversionKind::BitToPtr,
|
|
||||||
}));
|
|
||||||
converting_id
|
|
||||||
} else {
|
|
||||||
result.push(Statement::Conversion(ImplicitConversion {
|
|
||||||
src: *new_id,
|
|
||||||
dst: converting_id,
|
|
||||||
from_type: ast::Type::Pointer(ast::ScalarType::U8, ast::StateSpace::Global),
|
|
||||||
from_space: ast::StateSpace::Reg,
|
|
||||||
to_type: old_type,
|
|
||||||
to_space: ast::StateSpace::Reg,
|
|
||||||
kind: ConversionKind::AddressOf,
|
|
||||||
}));
|
|
||||||
converting_id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None => match func_args_ptr.get(&arg_desc.op) {
|
|
||||||
Some(new_id) => {
|
Some(new_id) => {
|
||||||
if arg_desc.is_dst {
|
let (new_operand_type, new_operand_space, is_variable) =
|
||||||
return Err(error_unreachable());
|
id_defs.get_typed(*new_id)?;
|
||||||
|
if let Some((expected_type, expected_space)) = expected_type {
|
||||||
|
let implicit_conversion = arg_desc
|
||||||
|
.non_default_implicit_conversion
|
||||||
|
.unwrap_or(default_implicit_conversion);
|
||||||
|
if implicit_conversion(
|
||||||
|
(new_operand_space, &new_operand_type),
|
||||||
|
(expected_space, expected_type),
|
||||||
|
)
|
||||||
|
.is_ok()
|
||||||
|
{
|
||||||
|
return Ok(*new_id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// We skip conversion here to trigger PtrAcces in a later pass
|
let (old_operand_type, old_operand_space, _) = id_defs.get_typed(arg_desc.op)?;
|
||||||
let old_type = match expected_type {
|
let new_operand_type_clone = new_operand_type.clone();
|
||||||
Some((
|
let converting_id = id_defs
|
||||||
ast::Type::Pointer(_, ast::StateSpace::Global),
|
.register_intermediate(Some((old_operand_type.clone(), old_operand_space)));
|
||||||
ast::StateSpace::Reg,
|
let kind = if new_operand_space.is_compatible(ast::StateSpace::Reg) {
|
||||||
)) => return Ok(*new_id),
|
ConversionKind::Default
|
||||||
_ => id_defs.get_typed(arg_desc.op)?.0,
|
} else {
|
||||||
|
ConversionKind::PtrToPtr
|
||||||
};
|
};
|
||||||
let old_type_clone = old_type.clone();
|
if arg_desc.is_dst {
|
||||||
let converting_id =
|
post_statements.push(Statement::Conversion(ImplicitConversion {
|
||||||
id_defs.register_intermediate(Some((old_type, ast::StateSpace::Reg)));
|
src: converting_id,
|
||||||
result.push(Statement::Conversion(ImplicitConversion {
|
dst: *new_id,
|
||||||
src: *new_id,
|
from_type: old_operand_type,
|
||||||
dst: converting_id,
|
from_space: old_operand_space,
|
||||||
from_type: ast::Type::Pointer(ast::ScalarType::U8, ast::StateSpace::Global),
|
to_type: new_operand_type,
|
||||||
from_space: ast::StateSpace::Reg,
|
to_space: new_operand_space,
|
||||||
to_type: old_type_clone,
|
kind,
|
||||||
to_space: ast::StateSpace::Reg,
|
}));
|
||||||
kind: ConversionKind::PtrToPtr,
|
converting_id
|
||||||
}));
|
} else {
|
||||||
converting_id
|
result.push(Statement::Conversion(ImplicitConversion {
|
||||||
|
src: *new_id,
|
||||||
|
dst: converting_id,
|
||||||
|
from_type: new_operand_type,
|
||||||
|
from_space: new_operand_space,
|
||||||
|
to_type: old_operand_type,
|
||||||
|
to_space: old_operand_space,
|
||||||
|
kind,
|
||||||
|
}));
|
||||||
|
converting_id
|
||||||
|
}
|
||||||
}
|
}
|
||||||
None => arg_desc.op,
|
None => arg_desc.op,
|
||||||
},
|
},
|
||||||
})
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_add_ptr_direct(remapped_ids: &HashMap<u32, u32>, arg: &ast::Arg3<TypedArgParams>) -> bool {
|
fn is_add_ptr_direct(remapped_ids: &HashMap<u32, u32>, arg: &ast::Arg3<TypedArgParams>) -> bool {
|
||||||
|
Reference in New Issue
Block a user