Skip to content

Commit 2153c70

Browse files
committed
fix(riscv): not cache non const value
1 parent daf7c07 commit 2153c70

File tree

1 file changed

+53
-22
lines changed

1 file changed

+53
-22
lines changed

src/riscv/machine_builder.mbt

+53-22
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ fn MachineVar::from_ssa(var : @ssa.Var) -> MachineVar {
9898
struct Builder {
9999
method : MachineMethod
100100
vars : Map[Int, MachineVar]
101-
imported_global_vars : Map[String, MachineVar]
101+
imported_global_consts : Map[String, MachineVar]
102+
imported_global_labels : Map[String, MachineVar]
102103

103104
// for global vars
104105
world : MachineWorld
@@ -112,7 +113,13 @@ fn Builder::new(world : MachineWorld, method : MachineMethod) -> Builder {
112113
}
113114
method.params.each(fn { p => vars.set(p.id, p) })
114115
method.local_vars.each(fn { v => vars.set(v.id, v) })
115-
Builder::{ method, vars, imported_global_vars: Map::new(), world }
116+
Builder::{
117+
method,
118+
vars,
119+
imported_global_consts: Map::new(),
120+
imported_global_labels: Map::new(),
121+
world,
122+
}
116123
}
117124

118125
fn Builder::get_var(self : Builder, var : @ssa.Var) -> MachineVar {
@@ -433,25 +440,31 @@ fn Builder::build_rvalue(
433440
Some(Int(x)) => Some(Int(x))
434441
Some(Double(x)) => {
435442
let label = add_double_const(self.world, x)
436-
match self.imported_global_vars.get(label) {
443+
match self.imported_global_consts.get(label) {
437444
Some(tmp) => Some(Var(tmp, Double))
438-
None => {
439-
let addr = self.add_temp_var(Ptr)
440-
stmts.push(Definition(Some(addr), LoadLabel(label)))
441-
Some(Load((addr, 0), Double, 202))
442-
}
445+
None =>
446+
match self.imported_global_labels.get(label) {
447+
Some(addr) => Some(Load((addr, 0), Double, 202))
448+
None => {
449+
let addr = self.add_temp_var(Ptr)
450+
stmts.push(Definition(Some(addr), LoadLabel(label)))
451+
self.imported_global_labels.set(label, addr)
452+
Some(Load((addr, 0), Double, 202))
453+
}
454+
}
443455
}
444456
}
445457
None => {
446458
let width = Width::from_low_type(var.ty)
447459
if var.is_global {
448460
let (label, _) = self.world.globals.get(var.id).unwrap()
449-
match self.imported_global_vars.get(label) {
450-
Some(tmp) => Some(Var(tmp, width))
461+
match self.imported_global_labels.get(label) {
462+
Some(addr) => Some(Load((addr, 0), width, 203))
451463
None => {
452464
let addr = self.add_temp_var(Ptr)
453465
stmts.push(Comment("Get global var \{v}"))
454466
stmts.push(Definition(Some(addr), LoadLabel(label)))
467+
self.imported_global_labels.set(label, addr)
455468
Some(Load((addr, 0), width, 203))
456469
}
457470
}
@@ -660,15 +673,19 @@ fn Builder::build_get_var(
660673
} else if var.is_global {
661674
match self.world.globals.get(var.id) {
662675
Some((label, g)) =>
663-
match self.imported_global_vars.get(label) {
664-
Some(tmp) => tmp
676+
match self.imported_global_labels.get(label) {
677+
Some(addr) => {
678+
let tmp = self.add_temp_var(var.ty)
679+
stmts.push(Definition(Some(tmp), Load((addr, 0), g.width, 207)))
680+
tmp
681+
}
665682
None => {
666683
let addr = self.add_temp_var(Type::Ptr)
667684
let tmp = self.add_temp_var(var.ty)
668685
stmts.push(Comment("Get global var \{var}"))
669686
stmts.push(Definition(Some(addr), LoadLabel(label)))
670687
stmts.push(Definition(Some(tmp), Load((addr, 0), g.width, 207)))
671-
self.imported_global_vars.set(label, tmp)
688+
self.imported_global_labels.set(label, addr)
672689
tmp
673690
}
674691
}
@@ -688,15 +705,29 @@ fn Builder::build_double_const(
688705
stmts : Array[StmtKind]
689706
) -> MachineVar {
690707
let label = add_double_const(self.world, value)
691-
match self.imported_global_vars.get(label) {
708+
match self.imported_global_consts.get(label) {
692709
Some(tmp) => tmp
693-
None => {
694-
let addr = self.add_temp_var(Type::Ptr)
695-
stmts.push(Definition(Some(addr), LoadLabel(label)))
696-
let local_const = self.add_temp_var(Double)
697-
stmts.push(Definition(Some(local_const), Load((addr, 0), Double, 208)))
698-
self.imported_global_vars.set(label, local_const)
699-
local_const
700-
}
710+
None =>
711+
match self.imported_global_labels.get(label) {
712+
Some(addr) => {
713+
let local_const = self.add_temp_var(Double)
714+
stmts.push(
715+
Definition(Some(local_const), Load((addr, 0), Double, 208)),
716+
)
717+
self.imported_global_consts.set(label, local_const)
718+
local_const
719+
}
720+
None => {
721+
let addr = self.add_temp_var(Type::Ptr)
722+
stmts.push(Definition(Some(addr), LoadLabel(label)))
723+
let local_const = self.add_temp_var(Double)
724+
stmts.push(
725+
Definition(Some(local_const), Load((addr, 0), Double, 208)),
726+
)
727+
self.imported_global_labels.set(label, addr)
728+
self.imported_global_consts.set(label, local_const)
729+
local_const
730+
}
731+
}
701732
}
702733
}

0 commit comments

Comments
 (0)