fix issue 5569. (#5612)

* add regression test file.

* fix issute5569.

* enable code length check.
This commit is contained in:
yuyang
2023-01-31 02:01:33 +08:00
committed by GitHub
parent e835255fbf
commit 77cf547f41
2 changed files with 403 additions and 7 deletions

View File

@@ -27,6 +27,9 @@ impl EmitInfo {
/// load constant by put the constant in the code stream. /// load constant by put the constant in the code stream.
/// calculate the pc and using load instruction. /// calculate the pc and using load instruction.
/// This is only allow used in the emit stage.
/// Because of those instruction must execute together.
/// see https://github.com/bytecodealliance/wasmtime/pull/5612
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
pub(crate) enum LoadConstant { pub(crate) enum LoadConstant {
U32(u32), U32(u32),
@@ -464,14 +467,13 @@ impl MachInstEmit for Inst {
x.emit(&[], sink, emit_info, state) x.emit(&[], sink, emit_info, state)
} }
&Inst::RawData { ref data } => { &Inst::RawData { ref data } => {
// emit_island if need, right now data is not very long. // Right now we only put a u32 or u64 in this instruction.
let length = data.len() as CodeOffset; // It is not very long, no need to check if need `emit_island`.
if sink.island_needed(length) { // If data is very long , this is a bug because RawData is typecial
sink.emit_island(length); // use to load some data and rely on some positon in the code stream.
} // and we may exceed `Inst::worst_case_size`.
// for more information see https://github.com/bytecodealliance/wasmtime/pull/5612.
sink.put_data(&data[..]); sink.put_data(&data[..]);
// safe to disable code length check.
start_off = sink.cur_offset();
} }
&Inst::Lui { rd, ref imm } => { &Inst::Lui { rd, ref imm } => {
let rd = allocs.next_writable(rd); let rd = allocs.next_writable(rd);

View File

@@ -0,0 +1,394 @@
test run
set use_egraphs=true
target riscv64
function %a(i16, f64, i32, i64, i16, i128, f32) -> i16 {
ss0 = explicit_slot 24
block0(v0: i16, v1: f64, v2: i32, v3: i64, v4: i16, v5: i128, v6: f32):
v8 = iconst.i8 0
v9 = iconst.i16 0
v10 = iconst.i32 0
v11 = iconst.i64 0
v12 = uextend.i128 v11 ; v11 = 0
stack_store v12, ss0
stack_store v11, ss0+16 ; v11 = 0
v55 = iconst.i32 0
v56 = iconst.i32 1
v57 = icmp eq v2, v55 ; v55 = 0
v58 = ishl_imm v56, 31 ; v56 = 1
v59 = isub v55, v56 ; v55 = 0, v56 = 1
v60 = icmp eq v2, v58
v61 = icmp eq v2, v59
v62 = band v60, v61
v63 = bor v57, v62
v64 = select v63, v56, v2 ; v56 = 1
v13 = sdiv v2, v64
v65 = iconst.i32 0
v66 = iconst.i32 1
v67 = icmp eq v13, v65 ; v65 = 0
v68 = ishl_imm v66, 31 ; v66 = 1
v69 = isub v65, v66 ; v65 = 0, v66 = 1
v70 = icmp eq v13, v68
v71 = icmp eq v13, v69
v72 = band v70, v71
v73 = bor v67, v72
v74 = select v73, v66, v13 ; v66 = 1
v14 = sdiv v13, v74
v75 = iconst.i32 0
v76 = iconst.i32 1
v77 = icmp eq v14, v75 ; v75 = 0
v78 = ishl_imm v76, 31 ; v76 = 1
v79 = isub v75, v76 ; v75 = 0, v76 = 1
v80 = icmp eq v14, v78
v81 = icmp eq v14, v79
v82 = band v80, v81
v83 = bor v77, v82
v84 = select v83, v76, v14 ; v76 = 1
v15 = sdiv v14, v84
v85 = iconst.i64 0
v86 = iconst.i64 1
v87 = icmp eq v3, v85 ; v85 = 0
v88 = ishl_imm v86, 63 ; v86 = 1
v89 = isub v85, v86 ; v85 = 0, v86 = 1
v90 = icmp eq v3, v88
v91 = icmp eq v3, v89
v92 = band v90, v91
v93 = bor v87, v92
v94 = select v93, v86, v3 ; v86 = 1
v16 = sdiv v3, v94
v95 = iconst.i32 0
v96 = iconst.i32 1
v97 = icmp eq v15, v95 ; v95 = 0
v98 = ishl_imm v96, 31 ; v96 = 1
v99 = isub v95, v96 ; v95 = 0, v96 = 1
v100 = icmp eq v15, v98
v101 = icmp eq v15, v99
v102 = band v100, v101
v103 = bor v97, v102
v104 = select v103, v96, v15 ; v96 = 1
v17 = sdiv v15, v104
v18 = fmax_pseudo v6, v6
v105 = iconst.i32 0
v106 = iconst.i32 1
v107 = icmp eq v17, v105 ; v105 = 0
v108 = ishl_imm v106, 31 ; v106 = 1
v109 = isub v105, v106 ; v105 = 0, v106 = 1
v110 = icmp eq v17, v108
v111 = icmp eq v17, v109
v112 = band v110, v111
v113 = bor v107, v112
v114 = select v113, v106, v17 ; v106 = 1
v19 = sdiv v17, v114
v115 = iconst.i32 0
v116 = iconst.i32 1
v117 = icmp eq v19, v115 ; v115 = 0
v118 = ishl_imm v116, 31 ; v116 = 1
v119 = isub v115, v116 ; v115 = 0, v116 = 1
v120 = icmp eq v19, v118
v121 = icmp eq v19, v119
v122 = band v120, v121
v123 = bor v117, v122
v124 = select v123, v116, v19 ; v116 = 1
v20 = sdiv v19, v124
v125 = iconst.i32 0
v126 = iconst.i32 1
v127 = icmp eq v20, v125 ; v125 = 0
v128 = ishl_imm v126, 31 ; v126 = 1
v129 = isub v125, v126 ; v125 = 0, v126 = 1
v130 = icmp eq v20, v128
v131 = icmp eq v20, v129
v132 = band v130, v131
v133 = bor v127, v132
v134 = select v133, v126, v20 ; v126 = 1
v21 = sdiv v20, v134
stack_store v16, ss0+4
v135 = iconst.i32 0
v136 = iconst.i32 1
v137 = icmp eq v21, v135 ; v135 = 0
v138 = ishl_imm v136, 31 ; v136 = 1
v139 = isub v135, v136 ; v135 = 0, v136 = 1
v140 = icmp eq v21, v138
v141 = icmp eq v21, v139
v142 = band v140, v141
v143 = bor v137, v142
v144 = select v143, v136, v21 ; v136 = 1
v22 = sdiv v21, v144
v145 = iconst.i32 0
v146 = iconst.i32 1
v147 = icmp eq v22, v145 ; v145 = 0
v148 = ishl_imm v146, 31 ; v146 = 1
v149 = isub v145, v146 ; v145 = 0, v146 = 1
v150 = icmp eq v22, v148
v151 = icmp eq v22, v149
v152 = band v150, v151
v153 = bor v147, v152
v154 = select v153, v146, v22 ; v146 = 1
v23 = sdiv v22, v154
v155 = iconst.i32 0
v156 = iconst.i32 1
v157 = icmp eq v23, v155 ; v155 = 0
v158 = ishl_imm v156, 31 ; v156 = 1
v159 = isub v155, v156 ; v155 = 0, v156 = 1
v160 = icmp eq v23, v158
v161 = icmp eq v23, v159
v162 = band v160, v161
v163 = bor v157, v162
v164 = select v163, v156, v23 ; v156 = 1
v24 = sdiv v23, v164
v165 = iconst.i32 0
v166 = iconst.i32 1
v167 = icmp eq v24, v165 ; v165 = 0
v168 = ishl_imm v166, 31 ; v166 = 1
v169 = isub v165, v166 ; v165 = 0, v166 = 1
v170 = icmp eq v24, v168
v171 = icmp eq v24, v169
v172 = band v170, v171
v173 = bor v167, v172
v174 = select v173, v166, v24 ; v166 = 1
v25 = sdiv v24, v174
v175 = iconst.i32 0
v176 = iconst.i32 1
v177 = icmp eq v25, v175 ; v175 = 0
v178 = ishl_imm v176, 31 ; v176 = 1
v179 = isub v175, v176 ; v175 = 0, v176 = 1
v180 = icmp eq v25, v178
v181 = icmp eq v25, v179
v182 = band v180, v181
v183 = bor v177, v182
v184 = select v183, v176, v25 ; v176 = 1
v26 = sdiv v25, v184
v185 = iconst.i32 0
v186 = iconst.i32 1
v187 = icmp eq v26, v185 ; v185 = 0
v188 = ishl_imm v186, 31 ; v186 = 1
v189 = isub v185, v186 ; v185 = 0, v186 = 1
v190 = icmp eq v26, v188
v191 = icmp eq v26, v189
v192 = band v190, v191
v193 = bor v187, v192
v194 = select v193, v186, v26 ; v186 = 1
v27 = sdiv v26, v194
v195 = iconst.i32 0
v196 = iconst.i32 1
v197 = icmp eq v27, v195 ; v195 = 0
v198 = ishl_imm v196, 31 ; v196 = 1
v199 = isub v195, v196 ; v195 = 0, v196 = 1
v200 = icmp eq v27, v198
v201 = icmp eq v27, v199
v202 = band v200, v201
v203 = bor v197, v202
v204 = select v203, v196, v27 ; v196 = 1
v28 = sdiv v27, v204
v205 = iconst.i32 0
v206 = iconst.i32 1
v207 = icmp eq v28, v205 ; v205 = 0
v208 = ishl_imm v206, 31 ; v206 = 1
v209 = isub v205, v206 ; v205 = 0, v206 = 1
v210 = icmp eq v28, v208
v211 = icmp eq v28, v209
v212 = band v210, v211
v213 = bor v207, v212
v214 = select v213, v206, v28 ; v206 = 1
v29 = sdiv v28, v214
v52 = nearest v1
v53 = fcmp ne v52, v52
v54 = f64const +NaN
v30 = select v53, v54, v52 ; v54 = +NaN
v215 = iconst.i32 0
v216 = iconst.i32 1
v217 = icmp eq v29, v215 ; v215 = 0
v218 = ishl_imm v216, 31 ; v216 = 1
v219 = isub v215, v216 ; v215 = 0, v216 = 1
v220 = icmp eq v29, v218
v221 = icmp eq v29, v219
v222 = band v220, v221
v223 = bor v217, v222
v224 = select v223, v216, v29 ; v216 = 1
v31 = sdiv v29, v224
v225 = iconst.i32 0
v226 = iconst.i32 1
v227 = icmp eq v31, v225 ; v225 = 0
v228 = ishl_imm v226, 31 ; v226 = 1
v229 = isub v225, v226 ; v225 = 0, v226 = 1
v230 = icmp eq v31, v228
v231 = icmp eq v31, v229
v232 = band v230, v231
v233 = bor v227, v232
v234 = select v233, v226, v31 ; v226 = 1
v32 = sdiv v31, v234
v235 = iconst.i32 0
v236 = iconst.i32 1
v237 = icmp eq v32, v235 ; v235 = 0
v238 = ishl_imm v236, 31 ; v236 = 1
v239 = isub v235, v236 ; v235 = 0, v236 = 1
v240 = icmp eq v32, v238
v241 = icmp eq v32, v239
v242 = band v240, v241
v243 = bor v237, v242
v244 = select v243, v236, v32 ; v236 = 1
v33 = sdiv v32, v244
v245 = iconst.i32 0
v246 = iconst.i32 1
v247 = icmp eq v33, v245 ; v245 = 0
v248 = ishl_imm v246, 31 ; v246 = 1
v249 = isub v245, v246 ; v245 = 0, v246 = 1
v250 = icmp eq v33, v248
v251 = icmp eq v33, v249
v252 = band v250, v251
v253 = bor v247, v252
v254 = select v253, v246, v33 ; v246 = 1
v34 = sdiv v33, v254
v35 = fmax_pseudo v18, v18
v255 = iconst.i32 0
v256 = iconst.i32 1
v257 = icmp eq v34, v255 ; v255 = 0
v258 = ishl_imm v256, 31 ; v256 = 1
v259 = isub v255, v256 ; v255 = 0, v256 = 1
v260 = icmp eq v34, v258
v261 = icmp eq v34, v259
v262 = band v260, v261
v263 = bor v257, v262
v264 = select v263, v256, v34 ; v256 = 1
v36 = sdiv v34, v264
v265 = iconst.i32 0
v266 = iconst.i32 1
v267 = icmp eq v36, v265 ; v265 = 0
v268 = ishl_imm v266, 31 ; v266 = 1
v269 = isub v265, v266 ; v265 = 0, v266 = 1
v270 = icmp eq v36, v268
v271 = icmp eq v36, v269
v272 = band v270, v271
v273 = bor v267, v272
v274 = select v273, v266, v36 ; v266 = 1
v37 = sdiv v36, v274
v275 = iconst.i32 0
v276 = iconst.i32 1
v277 = icmp eq v37, v275 ; v275 = 0
v278 = ishl_imm v276, 31 ; v276 = 1
v279 = isub v275, v276 ; v275 = 0, v276 = 1
v280 = icmp eq v37, v278
v281 = icmp eq v37, v279
v282 = band v280, v281
v283 = bor v277, v282
v284 = select v283, v276, v37 ; v276 = 1
v38 = sdiv v37, v284
stack_store v16, ss0+4
v285 = iconst.i32 0
v286 = iconst.i32 1
v287 = icmp eq v38, v285 ; v285 = 0
v288 = ishl_imm v286, 31 ; v286 = 1
v289 = isub v285, v286 ; v285 = 0, v286 = 1
v290 = icmp eq v38, v288
v291 = icmp eq v38, v289
v292 = band v290, v291
v293 = bor v287, v292
v294 = select v293, v286, v38 ; v286 = 1
v39 = sdiv v38, v294
v295 = iconst.i32 0
v296 = iconst.i32 1
v297 = icmp eq v39, v295 ; v295 = 0
v298 = ishl_imm v296, 31 ; v296 = 1
v299 = isub v295, v296 ; v295 = 0, v296 = 1
v300 = icmp eq v39, v298
v301 = icmp eq v39, v299
v302 = band v300, v301
v303 = bor v297, v302
v304 = select v303, v296, v39 ; v296 = 1
v40 = sdiv v39, v304
v41 = rotr v16, v16
v305 = iconst.i32 0
v306 = iconst.i32 1
v307 = icmp eq v40, v305 ; v305 = 0
v308 = ishl_imm v306, 31 ; v306 = 1
v309 = isub v305, v306 ; v305 = 0, v306 = 1
v310 = icmp eq v40, v308
v311 = icmp eq v40, v309
v312 = band v310, v311
v313 = bor v307, v312
v314 = select v313, v306, v40 ; v306 = 1
v42 = sdiv v40, v314
v315 = iconst.i32 0
v316 = iconst.i32 1
v317 = icmp eq v42, v315 ; v315 = 0
v318 = ishl_imm v316, 31 ; v316 = 1
v319 = isub v315, v316 ; v315 = 0, v316 = 1
v320 = icmp eq v42, v318
v321 = icmp eq v42, v319
v322 = band v320, v321
v323 = bor v317, v322
v324 = select v323, v316, v42 ; v316 = 1
v43 = sdiv v42, v324
v325 = iconst.i32 0
v326 = iconst.i32 1
v327 = icmp eq v43, v325 ; v325 = 0
v328 = ishl_imm v326, 31 ; v326 = 1
v329 = isub v325, v326 ; v325 = 0, v326 = 1
v330 = icmp eq v43, v328
v331 = icmp eq v43, v329
v332 = band v330, v331
v333 = bor v327, v332
v334 = select v333, v326, v43 ; v326 = 1
v44 = sdiv v43, v334
v335 = iconst.i32 0
v336 = iconst.i32 1
v337 = icmp eq v44, v335 ; v335 = 0
v338 = ishl_imm v336, 31 ; v336 = 1
v339 = isub v335, v336 ; v335 = 0, v336 = 1
v340 = icmp eq v44, v338
v341 = icmp eq v44, v339
v342 = band v340, v341
v343 = bor v337, v342
v344 = select v343, v336, v44 ; v336 = 1
v45 = sdiv v44, v344
v345 = iconst.i32 0
v346 = iconst.i32 1
v347 = icmp eq v45, v345 ; v345 = 0
v348 = ishl_imm v346, 31 ; v346 = 1
v349 = isub v345, v346 ; v345 = 0, v346 = 1
v350 = icmp eq v45, v348
v351 = icmp eq v45, v349
v352 = band v350, v351
v353 = bor v347, v352
v354 = select v353, v346, v45 ; v346 = 1
v46 = sdiv v45, v354
v355 = iconst.i32 0
v356 = iconst.i32 1
v357 = icmp eq v46, v355 ; v355 = 0
v358 = ishl_imm v356, 31 ; v356 = 1
v359 = isub v355, v356 ; v355 = 0, v356 = 1
v360 = icmp eq v46, v358
v361 = icmp eq v46, v359
v362 = band v360, v361
v363 = bor v357, v362
v364 = select v363, v356, v46 ; v356 = 1
v47 = sdiv v46, v364
v48 = bxor v5, v5
v365 = iconst.i32 0
v366 = iconst.i32 1
v367 = icmp eq v47, v365 ; v365 = 0
v368 = ishl_imm v366, 31 ; v366 = 1
v369 = isub v365, v366 ; v365 = 0, v366 = 1
v370 = icmp eq v47, v368
v371 = icmp eq v47, v369
v372 = band v370, v371
v373 = bor v367, v372
v374 = select v373, v366, v47 ; v366 = 1
v49 = sdiv v47, v374
v375 = iconst.i32 0
v376 = iconst.i32 1
v377 = icmp eq v49, v375 ; v375 = 0
v378 = ishl_imm v376, 31 ; v376 = 1
v379 = isub v375, v376 ; v375 = 0, v376 = 1
v380 = icmp eq v49, v378
v381 = icmp eq v49, v379
v382 = band v380, v381
v383 = bor v377, v382
v384 = select v383, v376, v49 ; v376 = 1
v50 = sdiv v49, v384
v51 = stack_addr.i64 ss0+4
store v30, v51+6
return v0
}
; run: %a(8, 0.0, 0, 0, 0, 0, 0.0) == 8