Skip to content

Commit b50d40a

Browse files
committed
fix bug in reg allocation
1 parent 228f787 commit b50d40a

File tree

3 files changed

+28
-3
lines changed

3 files changed

+28
-3
lines changed

-Z

Whitespace-only changes.

src/code_generator/code_generator.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,8 @@ fn calculate_and_allocate_space(this: &FunctionData, reg_allocator: &HashMap<Val
338338
if let Some(idx) = opt{
339339
vec.insert(*idx);
340340
} else {
341-
*sum += 8;
341+
*sum += 4;
342+
*sum += 4 * this.dfg().value(val.clone()).used_by().len() as i32;
342343
}
343344
(sum, vec)
344345
});
@@ -411,12 +412,12 @@ fn calculate_and_allocate_space(this: &FunctionData, reg_allocator: &HashMap<Val
411412
let mut m = now_sp_size.lock().unwrap();
412413
let sp = ((bits + 4 + (arg_count_max * 4) as i32 + 15) / 16) as i32 * 16;
413414
*m.get_mut() = sp;
414-
Caller::Caller((sp, arg_count_max as i32, vec))
415+
Caller::Caller((sp, arg_count_max as i32 + vec.len() as i32, vec))
415416
} else {
416417
let mut m = now_sp_size.lock().unwrap();
417418
let sp = ((bits + (arg_count_max * 4) as i32 + 15) / 16) as i32 * 16;
418419
*m.get_mut() = sp;
419-
Caller::Nocall((sp, arg_count_max as i32, vec))
420+
Caller::Nocall((sp, arg_count_max as i32 + vec.len() as i32, vec))
420421
}
421422
}
422423
fn save_and_recover_reg(set: &HashSet<i32>) -> (String, String){

src/main.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use std::env::args;
66
use std::fs::read_to_string;
77
use std::io::{Result, Write};
88
use std::fs::File;
9+
use std::hash::Hash;
910
use optim::ControlFlowGraph;
1011

1112

@@ -76,4 +77,27 @@ fn try_main() -> Result<()> {
7677
Ok(())
7778
}
7879

80+
#[test]
81+
fn test(){
82+
// 读取输入文件
83+
let input = read_to_string("/Users/csy/testcases/lv5/6_complex_scopes.c").unwrap();
84+
85+
86+
// 调用 lalrpop 生成的 parser 解析输入文件
87+
let ast = sysy::CompUnitParser::new().parse(&input).unwrap();
88+
let ir = ast.get_koopa();
89+
println!("{}", ir);
90+
let driver = koopa::front::Driver::from(ir);
91+
let program = driver.generate_program().unwrap();
92+
// println!("{:#?}", program.func_layout());
93+
let a = program.get_interval();
94+
let b = program.get_interval();
95+
for (func, map_1) in a{
96+
for (func, map_2) in b{
97+
println!("{}", map_2 == map_1);
98+
}
99+
}
100+
101+
}
102+
79103

0 commit comments

Comments
 (0)