a better trial
This commit is contained in:
@ -36,13 +36,13 @@ if(CMAKE_BUILD_TYPE STREQUAL "Release")
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
include(FetchContent)
|
include(FetchContent)
|
||||||
FetchContent_Declare(
|
# FetchContent_Declare(
|
||||||
googletest
|
# googletest
|
||||||
URL_HASH SHA256=1f357c27ca988c3f7c6b4bf68a9395005ac6761f034046e9dde0896e3aba00e4
|
# URL_HASH SHA256=1f357c27ca988c3f7c6b4bf68a9395005ac6761f034046e9dde0896e3aba00e4
|
||||||
URL ${CMAKE_SOURCE_DIR}/deps/googletest-v1.14.0-mirror.zip
|
# URL ${CMAKE_SOURCE_DIR}/deps/googletest-v1.14.0-mirror.zip
|
||||||
)
|
# )
|
||||||
FetchContent_MakeAvailable(googletest)
|
# FetchContent_MakeAvailable(googletest)
|
||||||
include(GoogleTest)
|
# include(GoogleTest)
|
||||||
FetchContent_Declare(
|
FetchContent_Declare(
|
||||||
argparse
|
argparse
|
||||||
URL_HASH SHA256=cd07c1208c01bef28c5173f4bad0b2df73dd7316d2f56fc80344952c400fa711
|
URL_HASH SHA256=cd07c1208c01bef28c5173f4bad0b2df73dd7316d2f56fc80344952c400fa711
|
||||||
|
425
a.txt
425
a.txt
@ -1,425 +0,0 @@
|
|||||||
return_type_str=int
|
|
||||||
recorded return type is [none-array]int
|
|
||||||
func_name=partition
|
|
||||||
recorded parameter type is [array]int with dimensions=1
|
|
||||||
recorded parameter name is a
|
|
||||||
recorded parameter type is [none-array]int
|
|
||||||
recorded parameter name is p
|
|
||||||
recorded parameter type is [none-array]int
|
|
||||||
recorded parameter name is r
|
|
||||||
Adding suite statements
|
|
||||||
Adding a definition statement
|
|
||||||
recorded variable type is [none-array]int
|
|
||||||
Adding a definition statement
|
|
||||||
recorded variable type is [none-array]int
|
|
||||||
Adding a definition statement
|
|
||||||
recorded variable type is [none-array]int
|
|
||||||
Adding a for statement
|
|
||||||
initial is an expression statement
|
|
||||||
condition is an expression
|
|
||||||
update is an expression statement
|
|
||||||
Adding suite statements
|
|
||||||
Adding an if statement
|
|
||||||
Adding suite statements
|
|
||||||
Adding an expression statement
|
|
||||||
Adding a definition statement
|
|
||||||
recorded variable type is [none-array]int
|
|
||||||
Adding an expression statement
|
|
||||||
Adding an expression statement
|
|
||||||
Adding a definition statement
|
|
||||||
recorded variable type is [none-array]int
|
|
||||||
Adding an expression statement
|
|
||||||
Adding an expression statement
|
|
||||||
Adding a jmp statement
|
|
||||||
return_type_str=void
|
|
||||||
recorded return type is [none-array]void
|
|
||||||
func_name=quick_sort
|
|
||||||
recorded parameter type is [array]int with dimensions=1
|
|
||||||
recorded parameter name is a
|
|
||||||
recorded parameter type is [none-array]int
|
|
||||||
recorded parameter name is p
|
|
||||||
recorded parameter type is [none-array]int
|
|
||||||
recorded parameter name is r
|
|
||||||
Adding suite statements
|
|
||||||
Adding an if statement
|
|
||||||
Adding a jmp statement
|
|
||||||
Adding a definition statement
|
|
||||||
recorded variable type is [none-array]int
|
|
||||||
Adding an expression statement
|
|
||||||
Adding an expression statement
|
|
||||||
return_type_str=void
|
|
||||||
recorded return type is [none-array]void
|
|
||||||
func_name=quick_sort_inf
|
|
||||||
recorded parameter type is [array]int with dimensions=1
|
|
||||||
recorded parameter name is a
|
|
||||||
Adding suite statements
|
|
||||||
Adding an expression statement
|
|
||||||
return_type_str=int
|
|
||||||
recorded return type is [none-array]int
|
|
||||||
func_name=main
|
|
||||||
Adding suite statements
|
|
||||||
Adding a definition statement
|
|
||||||
recorded variable type is [none-array]int
|
|
||||||
Adding a definition statement
|
|
||||||
recorded variable type is [array]int with dimensions=1
|
|
||||||
Adding a new array expression
|
|
||||||
dim 0 has size
|
|
||||||
Adding a definition statement
|
|
||||||
recorded variable type is [none-array]int
|
|
||||||
Adding a for statement
|
|
||||||
initial is an expression statement
|
|
||||||
condition is an expression
|
|
||||||
update is an expression statement
|
|
||||||
Adding an expression statement
|
|
||||||
Adding an expression statement
|
|
||||||
Adding a for statement
|
|
||||||
initial is an expression statement
|
|
||||||
condition is an expression
|
|
||||||
update is an expression statement
|
|
||||||
Adding an expression statement
|
|
||||||
Adding an expression statement
|
|
||||||
Adding a jmp statement
|
|
||||||
enter function partition
|
|
||||||
visit definition statement
|
|
||||||
visit definition statement
|
|
||||||
visit definition statement
|
|
||||||
visit definition statement
|
|
||||||
visit definition statement
|
|
||||||
leave function partition
|
|
||||||
enter function quick_sort
|
|
||||||
visit definition statement
|
|
||||||
function to call is partition
|
|
||||||
function to call is quick_sort
|
|
||||||
function to call is quick_sort
|
|
||||||
leave function quick_sort
|
|
||||||
enter function quick_sort_inf
|
|
||||||
function to call is quick_sort
|
|
||||||
leave function quick_sort_inf
|
|
||||||
enter function main
|
|
||||||
visit definition statement
|
|
||||||
function to call is getInt
|
|
||||||
visit definition statement
|
|
||||||
visit definition statement
|
|
||||||
function to call is getInt
|
|
||||||
function to call is quick_sort_inf
|
|
||||||
function to call is print
|
|
||||||
function to call is toString
|
|
||||||
function to call is println
|
|
||||||
leave function main
|
|
||||||
label_init_partition:
|
|
||||||
dom: label_init_partition
|
|
||||||
dom_frontier:
|
|
||||||
cfg pred:
|
|
||||||
successors_in_dom_tree: label_0
|
|
||||||
label_0:
|
|
||||||
dom: label_init_partition label_0
|
|
||||||
idom: label_init_partition
|
|
||||||
dom_frontier:
|
|
||||||
cfg pred: label_init_partition
|
|
||||||
successors_in_dom_tree: label_1
|
|
||||||
label_1:
|
|
||||||
dom: label_init_partition label_0 label_1
|
|
||||||
idom: label_0
|
|
||||||
dom_frontier: label_1
|
|
||||||
cfg pred: label_0 label_3
|
|
||||||
successors_in_dom_tree: label_2 label_4
|
|
||||||
label_2:
|
|
||||||
dom: label_init_partition label_0 label_1 label_2
|
|
||||||
idom: label_1
|
|
||||||
dom_frontier: label_1
|
|
||||||
cfg pred: label_1
|
|
||||||
successors_in_dom_tree: label_5 label_6
|
|
||||||
label_5:
|
|
||||||
dom: label_init_partition label_0 label_1 label_2 label_5
|
|
||||||
idom: label_2
|
|
||||||
dom_frontier: label_6
|
|
||||||
cfg pred: label_2
|
|
||||||
successors_in_dom_tree:
|
|
||||||
label_6:
|
|
||||||
dom: label_init_partition label_0 label_1 label_2 label_6
|
|
||||||
idom: label_2
|
|
||||||
dom_frontier: label_1
|
|
||||||
cfg pred: label_2 label_5
|
|
||||||
successors_in_dom_tree: label_3
|
|
||||||
label_3:
|
|
||||||
dom: label_init_partition label_0 label_1 label_2 label_6 label_3
|
|
||||||
idom: label_6
|
|
||||||
dom_frontier: label_1
|
|
||||||
cfg pred: label_6
|
|
||||||
successors_in_dom_tree:
|
|
||||||
label_4:
|
|
||||||
dom: label_init_partition label_0 label_1 label_4
|
|
||||||
idom: label_1
|
|
||||||
dom_frontier:
|
|
||||||
cfg pred: label_1
|
|
||||||
successors_in_dom_tree:
|
|
||||||
label_init_quick_sort:
|
|
||||||
dom: label_init_quick_sort
|
|
||||||
dom_frontier:
|
|
||||||
cfg pred:
|
|
||||||
successors_in_dom_tree: label_7
|
|
||||||
label_7:
|
|
||||||
dom: label_init_quick_sort label_7
|
|
||||||
idom: label_init_quick_sort
|
|
||||||
dom_frontier:
|
|
||||||
cfg pred: label_init_quick_sort
|
|
||||||
successors_in_dom_tree: label_8 label_9
|
|
||||||
label_8:
|
|
||||||
dom: label_init_quick_sort label_7 label_8
|
|
||||||
idom: label_7
|
|
||||||
dom_frontier:
|
|
||||||
cfg pred: label_7
|
|
||||||
successors_in_dom_tree:
|
|
||||||
label_9:
|
|
||||||
dom: label_init_quick_sort label_7 label_9
|
|
||||||
idom: label_7
|
|
||||||
dom_frontier:
|
|
||||||
cfg pred: label_7
|
|
||||||
successors_in_dom_tree:
|
|
||||||
label_init_quick_sort_inf:
|
|
||||||
dom: label_init_quick_sort_inf
|
|
||||||
dom_frontier:
|
|
||||||
cfg pred:
|
|
||||||
successors_in_dom_tree: label_10
|
|
||||||
label_10:
|
|
||||||
dom: label_init_quick_sort_inf label_10
|
|
||||||
idom: label_init_quick_sort_inf
|
|
||||||
dom_frontier:
|
|
||||||
cfg pred: label_init_quick_sort_inf
|
|
||||||
successors_in_dom_tree:
|
|
||||||
main_init:
|
|
||||||
dom: main_init
|
|
||||||
dom_frontier:
|
|
||||||
cfg pred:
|
|
||||||
successors_in_dom_tree: label_11
|
|
||||||
label_11:
|
|
||||||
dom: main_init label_11
|
|
||||||
idom: main_init
|
|
||||||
dom_frontier:
|
|
||||||
cfg pred: main_init
|
|
||||||
successors_in_dom_tree: label_12
|
|
||||||
label_12:
|
|
||||||
dom: main_init label_11 label_12
|
|
||||||
idom: label_11
|
|
||||||
dom_frontier: label_12
|
|
||||||
cfg pred: label_11 label_14
|
|
||||||
successors_in_dom_tree: label_13 label_15
|
|
||||||
label_13:
|
|
||||||
dom: main_init label_11 label_12 label_13
|
|
||||||
idom: label_12
|
|
||||||
dom_frontier: label_12
|
|
||||||
cfg pred: label_12
|
|
||||||
successors_in_dom_tree: label_14
|
|
||||||
label_14:
|
|
||||||
dom: main_init label_11 label_12 label_13 label_14
|
|
||||||
idom: label_13
|
|
||||||
dom_frontier: label_12
|
|
||||||
cfg pred: label_13
|
|
||||||
successors_in_dom_tree:
|
|
||||||
label_15:
|
|
||||||
dom: main_init label_11 label_12 label_15
|
|
||||||
idom: label_12
|
|
||||||
dom_frontier:
|
|
||||||
cfg pred: label_12
|
|
||||||
successors_in_dom_tree: label_16
|
|
||||||
label_16:
|
|
||||||
dom: main_init label_11 label_12 label_15 label_16
|
|
||||||
idom: label_15
|
|
||||||
dom_frontier: label_16
|
|
||||||
cfg pred: label_15 label_18
|
|
||||||
successors_in_dom_tree: label_17 label_19
|
|
||||||
label_17:
|
|
||||||
dom: main_init label_11 label_12 label_15 label_16 label_17
|
|
||||||
idom: label_16
|
|
||||||
dom_frontier: label_16
|
|
||||||
cfg pred: label_16
|
|
||||||
successors_in_dom_tree: label_18
|
|
||||||
label_18:
|
|
||||||
dom: main_init label_11 label_12 label_15 label_16 label_17 label_18
|
|
||||||
idom: label_17
|
|
||||||
dom_frontier: label_16
|
|
||||||
cfg pred: label_17
|
|
||||||
successors_in_dom_tree:
|
|
||||||
label_19:
|
|
||||||
dom: main_init label_11 label_12 label_15 label_16 label_19
|
|
||||||
idom: label_16
|
|
||||||
dom_frontier:
|
|
||||||
cfg pred: label_16
|
|
||||||
successors_in_dom_tree:
|
|
||||||
processing function partition
|
|
||||||
totally allocating 45 nodes
|
|
||||||
21
|
|
||||||
spilled 0 nodes
|
|
||||||
define i32 @partition(ptr %.var.local.1.a.val,i32 %.var.local.1.p.val,i32 %.var.local.1.r.val)
|
|
||||||
{
|
|
||||||
label_init_partition:
|
|
||||||
br label %label_0
|
|
||||||
label_0:
|
|
||||||
$reg.17 = getelementptr i32, ptr $reg.10, i32 $reg.12
|
|
||||||
$reg.17 = load i32, ptr $reg.17
|
|
||||||
$reg.14 = sub i32 $reg.11, 1
|
|
||||||
[Persudo] $reg.15 <-- 0
|
|
||||||
br label %label_1
|
|
||||||
label_1:
|
|
||||||
$reg.16 = icmp slt i32 $reg.11, $reg.12
|
|
||||||
br i1 $reg.16, label %label_2, label %label_4
|
|
||||||
label_2:
|
|
||||||
$reg.16 = getelementptr i32, ptr $reg.10, i32 $reg.11
|
|
||||||
$reg.16 = load i32, ptr $reg.16
|
|
||||||
$reg.16 = icmp sle i32 $reg.16, $reg.17
|
|
||||||
br i1 $reg.16, label %label_5, label %label_6.phieliminate.0
|
|
||||||
label_5:
|
|
||||||
$reg.14 = add i32 $reg.14, 1
|
|
||||||
$reg.16 = getelementptr i32, ptr $reg.10, i32 $reg.14
|
|
||||||
$reg.15 = load i32, ptr $reg.16
|
|
||||||
$reg.13 = getelementptr i32, ptr $reg.10, i32 $reg.14
|
|
||||||
$reg.16 = getelementptr i32, ptr $reg.10, i32 $reg.11
|
|
||||||
$reg.16 = load i32, ptr $reg.16
|
|
||||||
store i32 $reg.16, ptr $reg.13
|
|
||||||
$reg.16 = getelementptr i32, ptr $reg.10, i32 $reg.11
|
|
||||||
store i32 $reg.15, ptr $reg.16
|
|
||||||
br label %label_6
|
|
||||||
label_6:
|
|
||||||
br label %label_3
|
|
||||||
label_3:
|
|
||||||
$reg.11 = add i32 $reg.11, 1
|
|
||||||
br label %label_1
|
|
||||||
label_4:
|
|
||||||
$reg.17 = add i32 $reg.14, 1
|
|
||||||
$reg.17 = getelementptr i32, ptr $reg.10, i32 $reg.17
|
|
||||||
$reg.17 = load i32, ptr $reg.17
|
|
||||||
$reg.16 = add i32 $reg.14, 1
|
|
||||||
$reg.16 = getelementptr i32, ptr $reg.10, i32 $reg.16
|
|
||||||
$reg.15 = getelementptr i32, ptr $reg.10, i32 $reg.12
|
|
||||||
$reg.15 = load i32, ptr $reg.15
|
|
||||||
store i32 $reg.15, ptr $reg.16
|
|
||||||
$reg.16 = getelementptr i32, ptr $reg.10, i32 $reg.12
|
|
||||||
store i32 $reg.17, ptr $reg.16
|
|
||||||
$reg.10 = add i32 $reg.14, 1
|
|
||||||
ret i32 $reg.10
|
|
||||||
label_6.phieliminate.0:
|
|
||||||
br label %label_6
|
|
||||||
}
|
|
||||||
processing function quick_sort
|
|
||||||
totally allocating 20 nodes
|
|
||||||
5
|
|
||||||
spilled 4 nodes
|
|
||||||
define void @quick_sort(ptr %.var.local.6.a.val,i32 %.var.local.6.p.val,i32 %.var.local.6.r.val)
|
|
||||||
{
|
|
||||||
label_init_quick_sort:
|
|
||||||
[Persudo] #0 <-- $reg.12
|
|
||||||
[Persudo] #1 <-- $reg.11
|
|
||||||
[Persudo] #2 <-- $reg.10
|
|
||||||
br label %label_7
|
|
||||||
label_7:
|
|
||||||
$reg.17 = icmp sge i32 #1, #0
|
|
||||||
br i1 $reg.17, label %label_8, label %label_9
|
|
||||||
label_8:
|
|
||||||
ret void
|
|
||||||
label_9:
|
|
||||||
[Persudo] $reg.10 <-- #2
|
|
||||||
[Persudo] $reg.11 <-- #1
|
|
||||||
[Persudo] $reg.12 <-- #0
|
|
||||||
$reg.10 = call i32 @partition(ptr $reg.10, i32 $reg.11, i32 $reg.12)
|
|
||||||
[Persudo] #0 <-- $reg.10
|
|
||||||
$reg.12 = sub i32 #0, 1
|
|
||||||
[Persudo] $reg.10 <-- #2
|
|
||||||
[Persudo] $reg.11 <-- #1
|
|
||||||
call void @quick_sort(ptr $reg.10, i32 $reg.11, i32 $reg.12)
|
|
||||||
$reg.11 = add i32 #0, 1
|
|
||||||
[Persudo] $reg.10 <-- #2
|
|
||||||
[Persudo] $reg.12 <-- #0
|
|
||||||
call void @quick_sort(ptr $reg.10, i32 $reg.11, i32 $reg.12)
|
|
||||||
ret void
|
|
||||||
}
|
|
||||||
processing function quick_sort_inf
|
|
||||||
totally allocating 16 nodes
|
|
||||||
2
|
|
||||||
spilled 2 nodes
|
|
||||||
define void @quick_sort_inf(ptr %.var.local.8.a.val)
|
|
||||||
{
|
|
||||||
label_init_quick_sort_inf:
|
|
||||||
[Persudo] #0 <-- $reg.10
|
|
||||||
br label %label_10
|
|
||||||
label_10:
|
|
||||||
[Persudo] $reg.10 <-- #0
|
|
||||||
$reg.10 = call i32 @.builtin.GetArrayLength(ptr $reg.10)
|
|
||||||
[Persudo] #0 <-- $reg.10
|
|
||||||
$reg.12 = sub i32 #0, 1
|
|
||||||
[Persudo] $reg.10 <-- #0
|
|
||||||
[Persudo] $reg.11 <-- 0
|
|
||||||
call void @quick_sort(ptr $reg.10, i32 $reg.11, i32 $reg.12)
|
|
||||||
ret void
|
|
||||||
}
|
|
||||||
processing function main
|
|
||||||
totally allocating 29 nodes
|
|
||||||
19
|
|
||||||
spilled 5 nodes
|
|
||||||
define i32 @main()
|
|
||||||
{
|
|
||||||
main_init:
|
|
||||||
[Persudo] #0 <-- $reg.20
|
|
||||||
[Persudo] #1 <-- $reg.18
|
|
||||||
[Persudo] #2 <-- $reg.4
|
|
||||||
[Persudo] #3 <-- $reg.3
|
|
||||||
$reg.4 = alloca i32
|
|
||||||
br label %label_11
|
|
||||||
label_11:
|
|
||||||
$reg.10 = call i32 @getInt()
|
|
||||||
[Persudo] $reg.3 <-- $reg.10
|
|
||||||
$reg.17 = getelementptr i32, ptr $reg.4, i32 0
|
|
||||||
store i32 $reg.3, ptr $reg.17
|
|
||||||
[Persudo] $reg.10 <-- 1
|
|
||||||
[Persudo] $reg.11 <-- 4
|
|
||||||
[Persudo] $reg.12 <-- $reg.4
|
|
||||||
$reg.10 = call ptr @.builtin.RecursiveAllocateArray(i32 $reg.10, i32 $reg.11, ptr $reg.12)
|
|
||||||
[Persudo] $reg.4 <-- $reg.10
|
|
||||||
[Persudo] $reg.20 <-- 0
|
|
||||||
br label %label_12
|
|
||||||
label_12:
|
|
||||||
$reg.17 = icmp slt i32 $reg.20, $reg.3
|
|
||||||
br i1 $reg.17, label %label_13, label %label_15
|
|
||||||
label_13:
|
|
||||||
#0 = getelementptr i32, ptr $reg.4, i32 $reg.20
|
|
||||||
$reg.10 = call i32 @getInt()
|
|
||||||
[Persudo] $reg.18 <-- $reg.10
|
|
||||||
store i32 $reg.18, ptr #0
|
|
||||||
br label %label_14
|
|
||||||
label_14:
|
|
||||||
$reg.17 = add i32 $reg.20, 1
|
|
||||||
[Persudo] $reg.20 <-- $reg.17
|
|
||||||
br label %label_12
|
|
||||||
label_15:
|
|
||||||
[Persudo] $reg.10 <-- $reg.4
|
|
||||||
call void @quick_sort_inf(ptr $reg.10)
|
|
||||||
[Persudo] $reg.18 <-- 0
|
|
||||||
br label %label_16
|
|
||||||
label_16:
|
|
||||||
$reg.17 = icmp slt i32 $reg.18, $reg.3
|
|
||||||
br i1 $reg.17, label %label_17, label %label_19
|
|
||||||
label_17:
|
|
||||||
$reg.17 = getelementptr i32, ptr $reg.4, i32 $reg.18
|
|
||||||
$reg.10 = load i32, ptr $reg.17
|
|
||||||
$reg.10 = call ptr @toString(i32 $reg.10)
|
|
||||||
[Persudo] $reg.20 <-- $reg.10
|
|
||||||
[Persudo] $reg.10 <-- $reg.20
|
|
||||||
[Persudo] $reg.11 <-- @.str.2
|
|
||||||
$reg.10 = call ptr @.builtin.strcat(ptr $reg.10, ptr $reg.11)
|
|
||||||
[Persudo] $reg.20 <-- $reg.10
|
|
||||||
[Persudo] $reg.10 <-- $reg.20
|
|
||||||
call void @print(ptr $reg.10)
|
|
||||||
br label %label_18
|
|
||||||
label_18:
|
|
||||||
$reg.17 = add i32 $reg.18, 1
|
|
||||||
[Persudo] $reg.18 <-- $reg.17
|
|
||||||
br label %label_16
|
|
||||||
label_19:
|
|
||||||
[Persudo] $reg.10 <-- @.str.3
|
|
||||||
call void @println(ptr $reg.10)
|
|
||||||
[Persudo] $reg.3 <-- #3
|
|
||||||
[Persudo] $reg.4 <-- #2
|
|
||||||
[Persudo] $reg.18 <-- #1
|
|
||||||
[Persudo] $reg.20 <-- #0
|
|
||||||
[Persudo] $reg.10 <-- 0
|
|
||||||
ret i32 $reg.10
|
|
||||||
}
|
|
@ -158,7 +158,7 @@ bool GetCollectionsIsSame(const Container &a, const Container &b, Compare comp =
|
|||||||
return ita == a.end() && itb == b.end();
|
return ita == a.end() && itb == b.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
CFGType BuildCFGForFunction(const std::shared_ptr<FunctionDefItem> &func);
|
CFGType BuildCFGForFunction(const std::shared_ptr<FunctionDefItem> &func, bool remove_poison_entry = false);
|
||||||
|
|
||||||
// RISC-V calling convention compatible
|
// RISC-V calling convention compatible
|
||||||
const static std::vector<std::string> held_tmp_regs = {"x28", "x29", "x30", "x31"};
|
const static std::vector<std::string> held_tmp_regs = {"x28", "x29", "x30", "x31"};
|
||||||
|
@ -137,6 +137,7 @@ class IRClassInfo {
|
|||||||
alread_arranged = true;
|
alread_arranged = true;
|
||||||
size_t cur_pos = 0;
|
size_t cur_pos = 0;
|
||||||
size_t align_size = 1;
|
size_t align_size = 1;
|
||||||
|
class_size_after_align = 0;
|
||||||
for (size_t cur_size : member_var_size) {
|
for (size_t cur_size : member_var_size) {
|
||||||
if (cur_size != 1 && cur_size != 4) throw std::runtime_error("Invalid member variable size");
|
if (cur_size != 1 && cur_size != 4) throw std::runtime_error("Invalid member variable size");
|
||||||
if (cur_pos % cur_size == 0) {
|
if (cur_pos % cur_size == 0) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
include_directories(${CMAKE_SOURCE_DIR}/include/IR)
|
include_directories(${CMAKE_SOURCE_DIR}/include/IR)
|
||||||
file(GLOB IR_SOURCES "*.cpp")
|
file(GLOB IR_SOURCES "*.cpp")
|
||||||
|
|
||||||
add_library(IR STATIC ${IR_SOURCES})
|
add_library(IR SHARED ${IR_SOURCES})
|
||||||
target_link_libraries(IR PUBLIC ast)
|
target_link_libraries(IR PUBLIC ast)
|
@ -1180,6 +1180,7 @@ void IRBuilder::ActuralVisit(ThisExpr_ASTNode *node) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void IRBuilder::ActuralVisit(ParenExpr_ASTNode *node) {
|
void IRBuilder::ActuralVisit(ParenExpr_ASTNode *node) {
|
||||||
|
node->expr->is_requiring_lvalue = node->is_requiring_lvalue;
|
||||||
node->expr->accept(this); // just visit it
|
node->expr->accept(this); // just visit it
|
||||||
node->IR_result_full = node->expr->IR_result_full;
|
node->IR_result_full = node->expr->IR_result_full;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
include_directories(${CMAKE_SOURCE_DIR}/include/ast)
|
include_directories(${CMAKE_SOURCE_DIR}/include/ast)
|
||||||
file(GLOB AST_SOURCES "*.cpp")
|
file(GLOB AST_SOURCES "*.cpp")
|
||||||
add_library(ast STATIC ${AST_SOURCES})
|
add_library(ast SHARED ${AST_SOURCES})
|
||||||
target_include_directories(ast PUBLIC /usr/include/antlr4-runtime/)
|
target_include_directories(ast PUBLIC /usr/include/antlr4-runtime/)
|
||||||
target_include_directories(ast PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../semantic/antlr-generated)
|
target_include_directories(ast PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../semantic/antlr-generated)
|
||||||
target_link_libraries(ast PUBLIC antlr4-runtime)
|
target_link_libraries(ast PUBLIC antlr4-runtime)
|
@ -45,11 +45,13 @@ int main(int argc, char **argv) {
|
|||||||
if (!optimize_all) {
|
if (!optimize_all) {
|
||||||
GenerateNaiveASM(fout, IR);
|
GenerateNaiveASM(fout, IR);
|
||||||
} else {
|
} else {
|
||||||
|
// IR->RecursivePrint(std::cerr);
|
||||||
auto IR_with_out_allocas = Mem2Reg(IR);
|
auto IR_with_out_allocas = Mem2Reg(IR);
|
||||||
// IR_with_out_allocas->RecursivePrint(fout);
|
// IR_with_out_allocas->RecursivePrint(std::cerr);
|
||||||
auto IR_with_out_phis = PhiEliminate(IR_with_out_allocas);
|
auto IR_with_out_phis = PhiEliminate(IR_with_out_allocas);
|
||||||
// IR_with_out_phis->RecursivePrint(fout);
|
// IR_with_out_phis->RecursivePrint(std::cerr);
|
||||||
auto alloced_code = RegAlloc(IR_with_out_phis);
|
auto alloced_code = RegAlloc(IR_with_out_phis);
|
||||||
|
// alloced_code->RecursivePrint(std::cerr);
|
||||||
OptBackend::GenerateOptASM(fout, alloced_code);
|
OptBackend::GenerateOptASM(fout, alloced_code);
|
||||||
}
|
}
|
||||||
} catch (const SemanticError &err) {
|
} catch (const SemanticError &err) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
include_directories(${CMAKE_SOURCE_DIR}/include/naivebackend)
|
include_directories(${CMAKE_SOURCE_DIR}/include/naivebackend)
|
||||||
|
|
||||||
file(GLOB NAIVE_BACKEND_SOURCES "*.cpp")
|
file(GLOB NAIVE_BACKEND_SOURCES "*.cpp")
|
||||||
add_library(naivebackend STATIC ${NAIVE_BACKEND_SOURCES})
|
add_library(naivebackend SHARED ${NAIVE_BACKEND_SOURCES})
|
||||||
target_link_libraries(naivebackend PUBLIC ast)
|
target_link_libraries(naivebackend PUBLIC ast)
|
@ -1,5 +1,5 @@
|
|||||||
include_directories(${CMAKE_SOURCE_DIR}/include/opt)
|
include_directories(${CMAKE_SOURCE_DIR}/include/opt)
|
||||||
|
|
||||||
file(GLOB NAIVE_BACKEND_SOURCES "*.cpp")
|
file(GLOB NAIVE_BACKEND_SOURCES "*.cpp")
|
||||||
add_library(opt STATIC ${NAIVE_BACKEND_SOURCES})
|
add_library(opt SHARED ${NAIVE_BACKEND_SOURCES})
|
||||||
target_link_libraries(opt PUBLIC ast)
|
target_link_libraries(opt PUBLIC ast)
|
@ -1,7 +1,8 @@
|
|||||||
#include "cfg.h"
|
#include "cfg.h"
|
||||||
|
#include <queue>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
CFGType BuildCFGForFunction(const std::shared_ptr<FunctionDefItem> &func) {
|
CFGType BuildCFGForFunction(const std::shared_ptr<FunctionDefItem> &func, bool remove_poison_entry) {
|
||||||
CFGType res;
|
CFGType res;
|
||||||
if (func->init_block) {
|
if (func->init_block) {
|
||||||
res.label_to_block[func->init_block->label_full] = func->init_block.get();
|
res.label_to_block[func->init_block->label_full] = func->init_block.get();
|
||||||
@ -39,5 +40,35 @@ CFGType BuildCFGForFunction(const std::shared_ptr<FunctionDefItem> &func) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
res.corresponding_func = func.get();
|
res.corresponding_func = func.get();
|
||||||
|
bool need_rebuild = false;
|
||||||
|
if (remove_poison_entry) {
|
||||||
|
auto tmp = func->basic_blocks;
|
||||||
|
func->basic_blocks.clear();
|
||||||
|
std::queue<CFGNodeType *> Q;
|
||||||
|
std::unordered_set<CFGNodeType *> visited;
|
||||||
|
Q.push(res.entry);
|
||||||
|
visited.insert(res.entry);
|
||||||
|
while (Q.size() > 0) {
|
||||||
|
auto cur = Q.front();
|
||||||
|
Q.pop();
|
||||||
|
for (auto succ : cur->successors) {
|
||||||
|
if (visited.find(succ) == visited.end()) {
|
||||||
|
visited.insert(succ);
|
||||||
|
Q.push(succ);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (auto block : tmp) {
|
||||||
|
auto node = res.block_to_node[block.get()];
|
||||||
|
if (visited.find(node) == visited.end()) {
|
||||||
|
need_rebuild = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
func->basic_blocks.push_back(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (need_rebuild) {
|
||||||
|
res = BuildCFGForFunction(func, false);
|
||||||
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
@ -57,6 +57,8 @@ ConfGraph BuildConfGraph(CFGType &cfg) {
|
|||||||
if (auto move_act = std::dynamic_pointer_cast<opt::MoveInstruct>(act)) {
|
if (auto move_act = std::dynamic_pointer_cast<opt::MoveInstruct>(act)) {
|
||||||
if (!VRegCheck(move_act->src_full)) continue;
|
if (!VRegCheck(move_act->src_full)) continue;
|
||||||
if (cfg.var_to_id.find(move_act->src_full) == cfg.var_to_id.end()) {
|
if (cfg.var_to_id.find(move_act->src_full) == cfg.var_to_id.end()) {
|
||||||
|
move_act->src_full = "0";
|
||||||
|
continue;
|
||||||
move_act->RecursivePrint(std::cerr);
|
move_act->RecursivePrint(std::cerr);
|
||||||
std::cerr << std::endl;
|
std::cerr << std::endl;
|
||||||
throw std::runtime_error("move_act->src_full not found in var_to_id");
|
throw std::runtime_error("move_act->src_full not found in var_to_id");
|
||||||
@ -457,7 +459,8 @@ bool ConductColoring(std::shared_ptr<FunctionDefItem> src, CFGType &cfg, ConfGra
|
|||||||
size_t round_counter = 0;
|
size_t round_counter = 0;
|
||||||
do {
|
do {
|
||||||
// std::cerr << std::endl << "\n\na new round begins " << ++round_counter << std::endl;
|
// std::cerr << std::endl << "\n\na new round begins " << ++round_counter << std::endl;
|
||||||
// std::cerr << "confgraph.low_degree_and_not_move_related.size()=" << confgraph.low_degree_and_not_move_related.size()
|
// std::cerr << "confgraph.low_degree_and_not_move_related.size()=" <<
|
||||||
|
// confgraph.low_degree_and_not_move_related.size()
|
||||||
// << std::endl;
|
// << std::endl;
|
||||||
// std::cerr << "confgraph.pending_moves.size()=" << confgraph.pending_moves.size() << std::endl;
|
// std::cerr << "confgraph.pending_moves.size()=" << confgraph.pending_moves.size() << std::endl;
|
||||||
// std::cerr << "confgraph.low_degree_and_move_related.size()=" << confgraph.low_degree_and_move_related.size()
|
// std::cerr << "confgraph.low_degree_and_move_related.size()=" << confgraph.low_degree_and_move_related.size()
|
||||||
|
@ -290,7 +290,7 @@ std::shared_ptr<ModuleItem> Mem2Reg(std::shared_ptr<ModuleItem> src) {
|
|||||||
auto res = src;
|
auto res = src;
|
||||||
for (auto &func : res->function_defs) {
|
for (auto &func : res->function_defs) {
|
||||||
// func = std::make_shared<FunctionDefItem>(*func);
|
// func = std::make_shared<FunctionDefItem>(*func);
|
||||||
auto cfg = BuildCFGForFunction(func);
|
auto cfg = BuildCFGForFunction(func, true);
|
||||||
ConductMem2RegForFunction(func, cfg);
|
ConductMem2RegForFunction(func, cfg);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
|
@ -368,7 +368,7 @@ void ConductRegAllocForFunction(std::shared_ptr<FunctionDefItem> func) {
|
|||||||
} while (ConductColoring(func, cfg, confgraph));
|
} while (ConductColoring(func, cfg, confgraph));
|
||||||
TranslateColorResult(func, cfg, confgraph);
|
TranslateColorResult(func, cfg, confgraph);
|
||||||
RemoveCallingConventionKeeper(func, cfg, confgraph);
|
RemoveCallingConventionKeeper(func, cfg, confgraph);
|
||||||
func->RecursivePrint(std::cerr);
|
// func->RecursivePrint(std::cerr);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<ModuleItem> RegAlloc(std::shared_ptr<ModuleItem> src) {
|
std::shared_ptr<ModuleItem> RegAlloc(std::shared_ptr<ModuleItem> src) {
|
||||||
|
@ -2,8 +2,8 @@ include_directories(/usr/include/antlr4-runtime/)
|
|||||||
include_directories(${CMAKE_SOURCE_DIR}/include/semantic)
|
include_directories(${CMAKE_SOURCE_DIR}/include/semantic)
|
||||||
file(GLOB ANLTR_SOURCES "antlr-generated/*.cpp")
|
file(GLOB ANLTR_SOURCES "antlr-generated/*.cpp")
|
||||||
file(GLOB SEMANTIC_SOURCES "*.cpp")
|
file(GLOB SEMANTIC_SOURCES "*.cpp")
|
||||||
add_library(mx-antlr STATIC ${ANLTR_SOURCES})
|
add_library(mx-antlr SHARED ${ANLTR_SOURCES})
|
||||||
add_library(semantic STATIC ${SEMANTIC_SOURCES})
|
add_library(semantic SHARED ${SEMANTIC_SOURCES})
|
||||||
target_include_directories(semantic PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/antlr-generated)
|
target_include_directories(semantic PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/antlr-generated)
|
||||||
target_include_directories(semantic PUBLIC /usr/include/antlr4-runtime/)
|
target_include_directories(semantic PUBLIC /usr/include/antlr4-runtime/)
|
||||||
target_link_libraries(mx-antlr PUBLIC antlr4-runtime)
|
target_link_libraries(mx-antlr PUBLIC antlr4-runtime)
|
||||||
|
Reference in New Issue
Block a user