adding pointer checks on ecas
This commit is contained in:
parent
d23d010917
commit
faa8dd2e6f
|
@ -2501,8 +2501,10 @@ impl<'a> Codegen<'a> {
|
||||||
|
|
||||||
let mut inps = Vc::from([NEVER]);
|
let mut inps = Vc::from([NEVER]);
|
||||||
let arg_base = self.tys.tmp.args.len();
|
let arg_base = self.tys.tmp.args.len();
|
||||||
|
let mut has_ptr_arg = false;
|
||||||
for arg in args {
|
for arg in args {
|
||||||
let value = self.expr(arg)?;
|
let value = self.expr(arg)?;
|
||||||
|
has_ptr_arg |= value.ty.has_pointers(&self.tys);
|
||||||
self.tys.tmp.args.push(value.ty);
|
self.tys.tmp.args.push(value.ty);
|
||||||
debug_assert_ne!(self.ci.nodes[value.id].kind, Kind::Stre);
|
debug_assert_ne!(self.ci.nodes[value.id].kind, Kind::Stre);
|
||||||
self.ci.nodes.lock(value.id);
|
self.ci.nodes.lock(value.id);
|
||||||
|
@ -2515,18 +2517,20 @@ impl<'a> Codegen<'a> {
|
||||||
self.ci.nodes.unlock(n);
|
self.ci.nodes.unlock(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
inps.push(self.ci.scope.store.value());
|
if has_ptr_arg {
|
||||||
self.ci.scope.loads.retain(|&load| {
|
inps.push(self.ci.scope.store.value());
|
||||||
if inps.contains(&load) {
|
self.ci.scope.loads.retain(|&load| {
|
||||||
return true;
|
if inps.contains(&load) {
|
||||||
}
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if !self.ci.nodes.unlock_remove(load) {
|
if !self.ci.nodes.unlock_remove(load) {
|
||||||
inps.push(load);
|
inps.push(load);
|
||||||
}
|
}
|
||||||
|
|
||||||
false
|
false
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
let alt_value = match ty.loc(&self.tys) {
|
let alt_value = match ty.loc(&self.tys) {
|
||||||
Loc::Reg => None,
|
Loc::Reg => None,
|
||||||
|
@ -2540,7 +2544,9 @@ impl<'a> Codegen<'a> {
|
||||||
inps[0] = self.ci.ctrl;
|
inps[0] = self.ci.ctrl;
|
||||||
self.ci.ctrl = self.ci.nodes.new_node(ty, Kind::Call { func: ty::ECA, args }, inps);
|
self.ci.ctrl = self.ci.nodes.new_node(ty, Kind::Call { func: ty::ECA, args }, inps);
|
||||||
|
|
||||||
self.store_mem(VOID, ty::Id::VOID, VOID);
|
if has_ptr_arg {
|
||||||
|
self.store_mem(VOID, ty::Id::VOID, VOID);
|
||||||
|
}
|
||||||
|
|
||||||
alt_value.or(Some(Value::new(self.ci.ctrl).ty(ty)))
|
alt_value.or(Some(Value::new(self.ci.ctrl).ty(ty)))
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
main:
|
main:
|
||||||
ADDI64 r254, r254, -31d
|
ADDI64 r254, r254, -31d
|
||||||
LI64 r6, 6d
|
|
||||||
LI64 r5, 5d
|
LI64 r5, 5d
|
||||||
LI64 r7, 20d
|
LI64 r7, 20d
|
||||||
LI64 r2, 1d
|
LI64 r2, 1d
|
||||||
LI64 r9, 10d
|
LI64 r4, 10d
|
||||||
|
LI64 r6, 6d
|
||||||
ADDI64 r8, r254, 15d
|
ADDI64 r8, r254, 15d
|
||||||
ST r9, r254, 15a, 8h
|
ST r4, r254, 15a, 8h
|
||||||
ST r7, r254, 23a, 8h
|
ST r7, r254, 23a, 8h
|
||||||
LD r3, r8, 0a, 16h
|
LD r3, r8, 0a, 16h
|
||||||
ECA
|
ECA
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
main:
|
||||||
|
LI32 r1, 1w
|
||||||
|
ANDI r1, r1, 4294967295d
|
||||||
|
JALA r0, r31, 0a
|
||||||
|
code size: 36
|
||||||
|
ret: 1
|
||||||
|
status: Ok(())
|
Loading…
Reference in a new issue