Commit 65f92b2a authored by 李晓奇's avatar 李晓奇

update README for TA to debug

parent 763c9d66
# 重现问题
- 构建`cminusfc`
- ```
$ # at path `2022fall-compiler_cminus`
$ cd tests/3-ir-gen/testcases/lv3/
$ cminusfc complex4.cminus
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::erase: __pos (which is 18446744073709551615) > this->size() (which is 8)
[1] 22357 IOT instruction (core dumped) cminusfc complex4.cminus
```
-
# 实验说明
请 fork 此 repo 到自己的仓库下,随后在自己的仓库中完成实验,请确保自己的 repo 为 Private。
......@@ -5,13 +20,16 @@
## 目前已布置的实验
* [lab1](./Documentations/1-parser/)
+ DDL:2022-10-03 23:59:59 (UTC+8)
+ DDL:2022-10-03 23:59:59 (UTC+8)
* [lab2](./Documentations/2-ir-gen-warmup/)
+ DDL:2022-10-23 23:59:59 (UTC+8)
+ DDL:2022-10-23 23:59:59 (UTC+8)
* [lab3](./Documentations/3-ir-gen/)
+ DDL:2022-11-07 23:59:59 (UTC+8)
+ DDL:2022-11-07 23:59:59 (UTC+8)
## FAQ: How to merge upstream remote branches
......
; ModuleID = 'cminus'
source_filename = "complex4.cminus"
declare i32 @input()
declare void @output(i32)
declare void @outputFloat(float)
declare void @neg_idx_except()
define float @get(float* %arg0, i32 %arg1, i32 %arg2, i32 %arg3) {
label_entry:
%op4 = alloca float*
store float* %arg0, float** %op4
%op5 = alloca i32
store i32 %arg1, i32* %op5
%op6 = alloca i32
store i32 %arg2, i32* %op6
%op7 = alloca i32
store i32 %arg3, i32* %op7
%op8 = load i32, i32* %op5
%op9 = load i32, i32* %op7
%op10 = mul i32 %op8, %op9
%op11 = load i32, i32* %op6
%op12 = add i32 %op10, %op11
%op13 = icmp slt i32 %op12, 0
br i1 %op13, label %label14, label %label15
label14: ; preds = %label_entry
call void @neg_idx_except()
br label %label15
label15: ; preds = %label_entry, %label14
%op16 = load float*, float** %op4
%op17 = getelementptr float, float* %op16, i32 %op12
%op18 = load float, float* %op17
ret float %op18
}
define float @abs(float %arg0) {
label_entry:
%op1 = alloca float
store float %arg0, float* %op1
%op2 = load float, float* %op1
%op3 = sitofp i32 0 to float
%op4 = fcmp ugt float %op2,%op3
br i1 %op4, label %label5, label %label8
label5: ; preds = %label_entry
%op6 = load float, float* %op1
ret float %op6
br label %label7
label7: ; preds = %label5, %label8
ret float 0x0
label8: ; preds = %label_entry
%op9 = load float, float* %op1
%op10 = sitofp i32 0 to float
%op11 = fsub float %op10, %op9
ret float %op11
br label %label7
}
define float @isZero(float %arg0) {
label_entry:
%op1 = alloca float
store float %arg0, float* %op1
%op2 = load float, float* %op1
%op3 = call float @abs(float %op2)
%op4 = fcmp ult float %op3,0x3eb0c6f7a0000000
%op5 = sitofp i1 %op4 to float
ret float %op5
}
define i32 @gauss(float* %arg0, float* %arg1, i32 %arg2) {
label_entry:
%op3 = alloca float*
store float* %arg0, float** %op3
%op4 = alloca float*
store float* %arg1, float** %op4
%op5 = alloca i32
store i32 %arg2, i32* %op5
%op6 = alloca i32
%op7 = alloca i32
%op8 = alloca i32
%op9 = alloca i32
%op10 = alloca i32
%op11 = alloca i32
%op12 = alloca i32
%op13 = load i32, i32* %op5
%op14 = add i32 %op13, 1
store i32 %op14, i32* %op9
store i32 0, i32* %op6
br label %label15
label15: ; preds = %label_entry, %label24
%op16 = load i32, i32* %op6
%op17 = load i32, i32* %op5
%op18 = icmp slt i32 %op16, %op17
br i1 %op18, label %label19, label %label22
label19: ; preds = %label15
%op20 = load i32, i32* %op6
%op21 = icmp slt i32 %op20, 0
br i1 %op21, label %label23, label %label24
label22: ; preds = %label15
store i32 0, i32* %op11
store i32 0, i32* %op8
br label %label30
label23: ; preds = %label19
call void @neg_idx_except()
br label %label24
label24: ; preds = %label19, %label23
%op25 = load float*, float** %op3
%op26 = getelementptr float, float* %op25, i32 %op20
%op27 = sitofp i32 0 to float
store float %op27, float* %op26
%op28 = load i32, i32* %op6
%op29 = add i32 %op28, 1
store i32 %op29, i32* %op6
br label %label15
label30: ; preds = %label22, %label122
%op31 = load i32, i32* %op8
%op32 = load i32, i32* %op5
%op33 = icmp slt i32 %op31, %op32
br i1 %op33, label %label34, label %label38
label34: ; preds = %label30
%op35 = load i32, i32* %op8
store i32 %op35, i32* %op10
%op36 = load i32, i32* %op8
%op37 = add i32 %op36, 1
store i32 %op37, i32* %op6
br label %label41
label38: ; preds = %label30
%op39 = load i32, i32* %op5
%op40 = sub i32 %op39, 1
store i32 %op40, i32* %op6
br label %label200
label41: ; preds = %label34, %label65
%op42 = load i32, i32* %op6
%op43 = load i32, i32* %op5
%op44 = icmp slt i32 %op42, %op43
br i1 %op44, label %label45, label %label59
label45: ; preds = %label41
%op46 = load float*, float** %op4
%op47 = load i32, i32* %op6
%op48 = load i32, i32* %op11
%op49 = load i32, i32* %op9
%op50 = call float @get(float* %op46, i32 %op47, i32 %op48, i32 %op49)
%op51 = call float @abs(float %op50)
%op52 = load float*, float** %op4
%op53 = load i32, i32* %op10
%op54 = load i32, i32* %op11
%op55 = load i32, i32* %op9
%op56 = call float @get(float* %op52, i32 %op53, i32 %op54, i32 %op55)
%op57 = call float @abs(float %op56)
%op58 = fcmp ugt float %op51,%op57
br i1 %op58, label %label63, label %label65
label59: ; preds = %label41
%op60 = load i32, i32* %op10
%op61 = load i32, i32* %op8
%op62 = icmp ne i32 %op60, %op61
br i1 %op62, label %label68, label %label70
label63: ; preds = %label45
%op64 = load i32, i32* %op6
store i32 %op64, i32* %op10
br label %label65
label65: ; preds = %label45, %label63
%op66 = load i32, i32* %op6
%op67 = add i32 %op66, 1
store i32 %op67, i32* %op6
br label %label41
label68: ; preds = %label59
%op69 = load i32, i32* %op8
store i32 %op69, i32* %op7
br label %label78
label70: ; preds = %label59, %label95
%op71 = load float*, float** %op4
%op72 = load i32, i32* %op8
%op73 = load i32, i32* %op11
%op74 = load i32, i32* %op9
%op75 = call float @get(float* %op71, i32 %op72, i32 %op73, i32 %op74)
%op76 = call float @isZero(float %op75)
%op77 = fcmp une float %op76,0x0
br i1 %op77, label %label119, label %label127
label78: ; preds = %label68, %label112
%op79 = load i32, i32* %op7
%op80 = load i32, i32* %op9
%op81 = icmp slt i32 %op79, %op80
br i1 %op81, label %label82, label %label95
label82: ; preds = %label78
%op83 = load float*, float** %op4
%op84 = load i32, i32* %op8
%op85 = load i32, i32* %op7
%op86 = load i32, i32* %op9
%op87 = call float @get(float* %op83, i32 %op84, i32 %op85, i32 %op86)
%op88 = fptosi float %op87 to i32
store i32 %op88, i32* %op12
%op89 = load i32, i32* %op8
%op90 = load i32, i32* %op9
%op91 = mul i32 %op89, %op90
%op92 = load i32, i32* %op7
%op93 = add i32 %op91, %op92
%op94 = icmp slt i32 %op93, 0
br i1 %op94, label %label96, label %label97
label95: ; preds = %label78
br label %label70
label96: ; preds = %label82
call void @neg_idx_except()
br label %label97
label97: ; preds = %label82, %label96
%op98 = load float*, float** %op4
%op99 = getelementptr float, float* %op98, i32 %op93
%op100 = load float*, float** %op4
%op101 = load i32, i32* %op10
%op102 = load i32, i32* %op7
%op103 = load i32, i32* %op9
%op104 = call float @get(float* %op100, i32 %op101, i32 %op102, i32 %op103)
store float %op104, float* %op99
%op105 = load i32, i32* %op10
%op106 = load i32, i32* %op9
%op107 = mul i32 %op105, %op106
%op108 = load i32, i32* %op7
%op109 = add i32 %op107, %op108
%op110 = icmp slt i32 %op109, 0
br i1 %op110, label %label111, label %label112
label111: ; preds = %label97
call void @neg_idx_except()
br label %label112
label112: ; preds = %label97, %label111
%op113 = load float*, float** %op4
%op114 = getelementptr float, float* %op113, i32 %op109
%op115 = load i32, i32* %op12
%op116 = sitofp i32 %op115 to float
store float %op116, float* %op114
%op117 = load i32, i32* %op7
%op118 = add i32 %op117, 1
store i32 %op118, i32* %op7
br label %label78
label119: ; preds = %label70
%op120 = load i32, i32* %op8
%op121 = sub i32 %op120, 1
store i32 %op121, i32* %op8
br label %label122
label122: ; preds = %label119, %label144
%op123 = load i32, i32* %op8
%op124 = add i32 %op123, 1
store i32 %op124, i32* %op8
%op125 = load i32, i32* %op11
%op126 = add i32 %op125, 1
store i32 %op126, i32* %op11
br label %label30
label127: ; preds = %label70
%op128 = load i32, i32* %op8
%op129 = add i32 %op128, 1
store i32 %op129, i32* %op6
br label %label130
label130: ; preds = %label127, %label159
%op131 = load i32, i32* %op6
%op132 = load i32, i32* %op5
%op133 = icmp slt i32 %op131, %op132
br i1 %op133, label %label134, label %label144
label134: ; preds = %label130
%op135 = load float*, float** %op4
%op136 = load i32, i32* %op6
%op137 = load i32, i32* %op11
%op138 = load i32, i32* %op9
%op139 = call float @get(float* %op135, i32 %op136, i32 %op137, i32 %op138)
%op140 = call float @isZero(float %op139)
%op141 = sitofp i32 1 to float
%op142 = fsub float %op141, %op140
%op143 = fcmp une float %op142,0x0
br i1 %op143, label %label145, label %label159
label144: ; preds = %label130
br label %label122
label145: ; preds = %label134
%op146 = load float*, float** %op4
%op147 = load i32, i32* %op6
%op148 = load i32, i32* %op11
%op149 = load i32, i32* %op9
%op150 = call float @get(float* %op146, i32 %op147, i32 %op148, i32 %op149)
%op151 = load float*, float** %op4
%op152 = load i32, i32* %op8
%op153 = load i32, i32* %op11
%op154 = load i32, i32* %op9
%op155 = call float @get(float* %op151, i32 %op152, i32 %op153, i32 %op154)
%op156 = fdiv float %op150, %op155
%op157 = fptosi float %op156 to i32
store i32 %op157, i32* %op12
%op158 = load i32, i32* %op11
store i32 %op158, i32* %op7
br label %label162
label159: ; preds = %label134, %label173
%op160 = load i32, i32* %op6
%op161 = add i32 %op160, 1
store i32 %op161, i32* %op6
br label %label130
label162: ; preds = %label145, %label185
%op163 = load i32, i32* %op7
%op164 = load i32, i32* %op9
%op165 = icmp slt i32 %op163, %op164
br i1 %op165, label %label166, label %label173
label166: ; preds = %label162
%op167 = load i32, i32* %op6
%op168 = load i32, i32* %op9
%op169 = mul i32 %op167, %op168
%op170 = load i32, i32* %op7
%op171 = add i32 %op169, %op170
%op172 = icmp slt i32 %op171, 0
br i1 %op172, label %label174, label %label175
label173: ; preds = %label162
br label %label159
label174: ; preds = %label166
call void @neg_idx_except()
br label %label175
label175: ; preds = %label166, %label174
%op176 = load float*, float** %op4
%op177 = getelementptr float, float* %op176, i32 %op171
%op178 = load i32, i32* %op6
%op179 = load i32, i32* %op9
%op180 = mul i32 %op178, %op179
%op181 = load i32, i32* %op7
%op182 = add i32 %op180, %op181
%op183 = icmp slt i32 %op182, 0
br i1 %op183, label %label184, label %label185
label184: ; preds = %label175
call void @neg_idx_except()
br label %label185
label185: ; preds = %label175, %label184
%op186 = load float*, float** %op4
%op187 = getelementptr float, float* %op186, i32 %op182
%op188 = load float, float* %op187
%op189 = load float*, float** %op4
%op190 = load i32, i32* %op8
%op191 = load i32, i32* %op7
%op192 = load i32, i32* %op9
%op193 = call float @get(float* %op189, i32 %op190, i32 %op191, i32 %op192)
%op194 = load i32, i32* %op12
%op195 = sitofp i32 %op194 to float
%op196 = fmul float %op193, %op195
%op197 = fsub float %op188, %op196
store float %op197, float* %op177
%op198 = load i32, i32* %op7
%op199 = add i32 %op198, 1
store i32 %op199, i32* %op7
br label %label162
label200: ; preds = %label38, %label252
%op201 = load i32, i32* %op6
%op202 = icmp sge i32 %op201, 0
br i1 %op202, label %label203, label %label212
label203: ; preds = %label200
%op204 = load float*, float** %op4
%op205 = load i32, i32* %op6
%op206 = load i32, i32* %op5
%op207 = load i32, i32* %op9
%op208 = call float @get(float* %op204, i32 %op205, i32 %op206, i32 %op207)
%op209 = fptosi float %op208 to i32
store i32 %op209, i32* %op12
%op210 = load i32, i32* %op6
%op211 = add i32 %op210, 1
store i32 %op211, i32* %op7
br label %label213
label212: ; preds = %label200
ret i32 0
label213: ; preds = %label203, %label239
%op214 = load i32, i32* %op7
%op215 = load i32, i32* %op5
%op216 = icmp slt i32 %op214, %op215
br i1 %op216, label %label217, label %label227
label217: ; preds = %label213
%op218 = load float*, float** %op4
%op219 = load i32, i32* %op6
%op220 = load i32, i32* %op7
%op221 = load i32, i32* %op9
%op222 = call float @get(float* %op218, i32 %op219, i32 %op220, i32 %op221)
%op223 = call float @isZero(float %op222)
%op224 = sitofp i32 1 to float
%op225 = fsub float %op224, %op223
%op226 = fcmp une float %op225,0x0
br i1 %op226, label %label230, label %label239
label227: ; preds = %label213
%op228 = load i32, i32* %op6
%op229 = icmp slt i32 %op228, 0
br i1 %op229, label %label251, label %label252
label230: ; preds = %label217
%op231 = load i32, i32* %op12
%op232 = load float*, float** %op4
%op233 = load i32, i32* %op6
%op234 = load i32, i32* %op7
%op235 = load i32, i32* %op9
%op236 = call float @get(float* %op232, i32 %op233, i32 %op234, i32 %op235)
%op237 = load i32, i32* %op7
%op238 = icmp slt i32 %op237, 0
br i1 %op238, label %label242, label %label243
label239: ; preds = %label217, %label243
%op240 = load i32, i32* %op7
%op241 = add i32 %op240, 1
store i32 %op241, i32* %op7
br label %label213
label242: ; preds = %label230
call void @neg_idx_except()
br label %label243
label243: ; preds = %label230, %label242
%op244 = load float*, float** %op3
%op245 = getelementptr float, float* %op244, i32 %op237
%op246 = load float, float* %op245
%op247 = fmul float %op236, %op246
%op248 = sitofp i32 %op231 to float
%op249 = fsub float %op248, %op247
%op250 = fptosi float %op249 to i32
store i32 %op250, i32* %op12
br label %label239
label251: ; preds = %label227
call void @neg_idx_except()
br label %label252
label252: ; preds = %label227, %label251
%op253 = load float*, float** %op3
%op254 = getelementptr float, float* %op253, i32 %op228
%op255 = load i32, i32* %op12
%op256 = load float*, float** %op4
%op257 = load i32, i32* %op6
%op258 = load i32, i32* %op6
%op259 = load i32, i32* %op9
%op260 = call float @get(float* %op256, i32 %op257, i32 %op258, i32 %op259)
%op261 = sitofp i32 %op255 to float
%op262 = fdiv float %op261, %op260
store float %op262, float* %op254
%op263 = load i32, i32* %op6
%op264 = sub i32 %op263, 1
store i32 %op264, i32* %op6
br label %label200
}
define void @main() {
label_entry:
%op0 = alloca i32
%op1 = alloca [3 x float]
%op2 = alloca [12 x float]
%op3 = icmp slt i32 0, 0
br i1 %op3, label %label4, label %label5
label4: ; preds = %label_entry
call void @neg_idx_except()
br label %label5
label5: ; preds = %label_entry, %label4
%op6 = getelementptr [12 x float], [12 x float]* %op2, i32 0, i32 0
%op7 = sitofp i32 1 to float
store float %op7, float* %op6
%op8 = icmp slt i32 1, 0
br i1 %op8, label %label9, label %label10
label9: ; preds = %label5
call void @neg_idx_except()
br label %label10
label10: ; preds = %label5, %label9
%op11 = getelementptr [12 x float], [12 x float]* %op2, i32 0, i32 1
%op12 = sitofp i32 2 to float
store float %op12, float* %op11
%op13 = icmp slt i32 2, 0
br i1 %op13, label %label14, label %label15
label14: ; preds = %label10
call void @neg_idx_except()
br label %label15
label15: ; preds = %label10, %label14
%op16 = getelementptr [12 x float], [12 x float]* %op2, i32 0, i32 2
%op17 = sitofp i32 1 to float
store float %op17, float* %op16
%op18 = icmp slt i32 3, 0
br i1 %op18, label %label19, label %label20
label19: ; preds = %label15
call void @neg_idx_except()
br label %label20
label20: ; preds = %label15, %label19
%op21 = getelementptr [12 x float], [12 x float]* %op2, i32 0, i32 3
%op22 = sitofp i32 1 to float
store float %op22, float* %op21
%op23 = mul i32 1, 4
%op24 = add i32 %op23, 0
%op25 = icmp slt i32 %op24, 0
br i1 %op25, label %label26, label %label27
label26: ; preds = %label20
call void @neg_idx_except()
br label %label27
label27: ; preds = %label20, %label26
%op28 = getelementptr [12 x float], [12 x float]* %op2, i32 0, i32 %op24
%op29 = sitofp i32 2 to float
store float %op29, float* %op28
%op30 = mul i32 1, 4
%op31 = add i32 %op30, 1
%op32 = icmp slt i32 %op31, 0
br i1 %op32, label %label33, label %label34
label33: ; preds = %label27
call void @neg_idx_except()
br label %label34
label34: ; preds = %label27, %label33
%op35 = getelementptr [12 x float], [12 x float]* %op2, i32 0, i32 %op31
%op36 = sitofp i32 3 to float
store float %op36, float* %op35
%op37 = mul i32 1, 4
%op38 = add i32 %op37, 2
%op39 = icmp slt i32 %op38, 0
br i1 %op39, label %label40, label %label41
label40: ; preds = %label34
call void @neg_idx_except()
br label %label41
label41: ; preds = %label34, %label40
%op42 = getelementptr [12 x float], [12 x float]* %op2, i32 0, i32 %op38
%op43 = sitofp i32 4 to float
store float %op43, float* %op42
%op44 = mul i32 1, 4
%op45 = add i32 %op44, 3
%op46 = icmp slt i32 %op45, 0
br i1 %op46, label %label47, label %label48
label47: ; preds = %label41
call void @neg_idx_except()
br label %label48
label48: ; preds = %label41, %label47
%op49 = getelementptr [12 x float], [12 x float]* %op2, i32 0, i32 %op45
%op50 = sitofp i32 3 to float
store float %op50, float* %op49
%op51 = mul i32 2, 4
%op52 = add i32 %op51, 0
%op53 = icmp slt i32 %op52, 0
br i1 %op53, label %label54, label %label55
label54: ; preds = %label48
call void @neg_idx_except()
br label %label55
label55: ; preds = %label48, %label54
%op56 = getelementptr [12 x float], [12 x float]* %op2, i32 0, i32 %op52
%op57 = sitofp i32 1 to float
store float %op57, float* %op56
%op58 = mul i32 2, 4
%op59 = add i32 %op58, 1
%op60 = icmp slt i32 %op59, 0
br i1 %op60, label %label61, label %label62
label61: ; preds = %label55
call void @neg_idx_except()
br label %label62
label62: ; preds = %label55, %label61
%op63 = getelementptr [12 x float], [12 x float]* %op2, i32 0, i32 %op59
%op64 = sitofp i32 1 to float
store float %op64, float* %op63
%op65 = mul i32 2, 4
%op66 = add i32 %op65, 2
%op67 = icmp slt i32 %op66, 0
br i1 %op67, label %label68, label %label69
label68: ; preds = %label62
call void @neg_idx_except()
br label %label69
label69: ; preds = %label62, %label68
%op70 = getelementptr [12 x float], [12 x float]* %op2, i32 0, i32 %op66
%op71 = sub i32 0, 2
%op72 = sitofp i32 %op71 to float
store float %op72, float* %op70
%op73 = mul i32 2, 4
%op74 = add i32 %op73, 3
%op75 = icmp slt i32 %op74, 0
br i1 %op75, label %label76, label %label77
label76: ; preds = %label69
call void @neg_idx_except()
br label %label77
label77: ; preds = %label69, %label76
%op78 = getelementptr [12 x float], [12 x float]* %op2, i32 0, i32 %op74
%op79 = sitofp i32 0 to float
store float %op79, float* %op78
%op80 = getelementptr [3 x float], [3 x float]* %op1, i32 0, i32 0
%op81 = getelementptr [12 x float], [12 x float]* %op2, i32 0, i32 0
%op82 = call i32 @gauss(float* %op80, float* %op81, i32 3)
store i32 0, i32* %op0
br label %label83
label83: ; preds = %label77, %label91
%op84 = load i32, i32* %op0
%op85 = icmp slt i32 %op84, 3
br i1 %op85, label %label86, label %label89
label86: ; preds = %label83
%op87 = load i32, i32* %op0
%op88 = icmp slt i32 %op87, 0
br i1 %op88, label %label90, label %label91
label89: ; preds = %label83
ret void
label90: ; preds = %label86
call void @neg_idx_except()
br label %label91
label91: ; preds = %label86, %label90
%op92 = getelementptr [3 x float], [3 x float]* %op1, i32 0, i32 %op87
%op93 = load float, float* %op92
call void @outputFloat(float %op93)
%op94 = load i32, i32* %op0
%op95 = add i32 %op94, 1
store i32 %op95, i32* %op0
br label %label83
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment