diff --git a/cranelift/codegen/src/isa/riscv64/inst/emit.rs b/cranelift/codegen/src/isa/riscv64/inst/emit.rs index 4bdb66c7c9..f1ae445809 100644 --- a/cranelift/codegen/src/isa/riscv64/inst/emit.rs +++ b/cranelift/codegen/src/isa/riscv64/inst/emit.rs @@ -27,6 +27,9 @@ impl EmitInfo { /// load constant by put the constant in the code stream. /// 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)] pub(crate) enum LoadConstant { U32(u32), @@ -464,14 +467,13 @@ impl MachInstEmit for Inst { x.emit(&[], sink, emit_info, state) } &Inst::RawData { ref data } => { - // emit_island if need, right now data is not very long. - let length = data.len() as CodeOffset; - if sink.island_needed(length) { - sink.emit_island(length); - } + // Right now we only put a u32 or u64 in this instruction. + // It is not very long, no need to check if need `emit_island`. + // If data is very long , this is a bug because RawData is typecial + // 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[..]); - // safe to disable code length check. - start_off = sink.cur_offset(); } &Inst::Lui { rd, ref imm } => { let rd = allocs.next_writable(rd); diff --git a/cranelift/filetests/filetests/runtests/issue5569.clif b/cranelift/filetests/filetests/runtests/issue5569.clif new file mode 100644 index 0000000000..3e29664988 --- /dev/null +++ b/cranelift/filetests/filetests/runtests/issue5569.clif @@ -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