| Krzysztof Parzyszek | 046090d | 2018-03-12 14:01:28 +0000 | [diff] [blame] | 1 | ; RUN: llc -march=hexagon < %s |
| 2 | ; REQUIRES: asserts |
| 3 | |
| 4 | ; This test used to fail with; |
| 5 | ; Assertion `ScavengingFrameIndex >= 0 && "Cannot scavenge register without an |
| 6 | ; emergency spill slot!"' failed. |
| 7 | |
| 8 | target triple = "hexagon-unknown-linux-gnu" |
| 9 | |
| 10 | ; Function Attrs: nounwind |
| 11 | define hidden fastcc void @f0(i8* nocapture %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i8* nocapture %a5) #0 { |
| 12 | b0: |
| 13 | %v0 = add i32 %a3, -4 |
| 14 | %v1 = icmp ult i32 %v0, %a1 |
| 15 | %v2 = add i32 %a2, -2 |
| 16 | br i1 %v1, label %b2, label %b1 |
| 17 | |
| 18 | b1: ; preds = %b0 |
| 19 | %v3 = add i32 %a4, -9 |
| 20 | %v4 = icmp ugt i32 %v2, %v3 |
| 21 | br i1 %v4, label %b2, label %b3 |
| 22 | |
| 23 | b2: ; preds = %b1, %b0 |
| 24 | %v5 = add nsw i32 %a4, -1 |
| 25 | %v6 = add nsw i32 %a3, -1 |
| 26 | %v7 = add i32 %a2, 1 |
| 27 | %v8 = add i32 %a2, 2 |
| 28 | %v9 = icmp slt i32 %v7, 0 |
| 29 | %v10 = icmp slt i32 %v7, %a4 |
| 30 | %v11 = select i1 %v10, i32 %v7, i32 %v5 |
| 31 | %v12 = select i1 %v9, i32 0, i32 %v11 |
| 32 | %v13 = mul i32 %v12, %a3 |
| 33 | %v14 = add i32 %a2, -1 |
| 34 | %v15 = icmp slt i32 %v2, 0 |
| 35 | %v16 = icmp slt i32 %v2, %a4 |
| 36 | %v17 = select i1 %v16, i32 %v2, i32 %v5 |
| 37 | %v18 = select i1 %v15, i32 0, i32 %v17 |
| 38 | %v19 = mul i32 %v18, %a3 |
| 39 | %v20 = icmp slt i32 %v14, 0 |
| 40 | %v21 = icmp slt i32 %v14, %a4 |
| 41 | %v22 = select i1 %v21, i32 %v14, i32 %v5 |
| 42 | %v23 = select i1 %v20, i32 0, i32 %v22 |
| 43 | %v24 = mul i32 %v23, %a3 |
| 44 | %v25 = icmp slt i32 %a2, 0 |
| 45 | %v26 = icmp slt i32 %a2, %a4 |
| 46 | %v27 = select i1 %v26, i32 %a2, i32 %v5 |
| 47 | %v28 = select i1 %v25, i32 0, i32 %v27 |
| 48 | %v29 = mul i32 %v28, %a3 |
| 49 | %v30 = add i32 %a2, 3 |
| 50 | %v31 = icmp slt i32 %v8, 0 |
| 51 | %v32 = icmp slt i32 %v8, %a4 |
| 52 | %v33 = select i1 %v32, i32 %v8, i32 %v5 |
| 53 | %v34 = select i1 %v31, i32 0, i32 %v33 |
| 54 | %v35 = mul i32 %v34, %a3 |
| 55 | %v36 = icmp slt i32 %v30, 0 |
| 56 | %v37 = icmp slt i32 %v30, %a4 |
| 57 | %v38 = select i1 %v37, i32 %v30, i32 %v5 |
| 58 | %v39 = select i1 %v36, i32 0, i32 %v38 |
| 59 | %v40 = mul i32 %v39, %a3 |
| 60 | %v41 = add i32 %a2, 4 |
| 61 | %v42 = icmp slt i32 %v41, 0 |
| 62 | %v43 = icmp slt i32 %v41, %a4 |
| 63 | %v44 = select i1 %v43, i32 %v41, i32 %v5 |
| 64 | %v45 = select i1 %v42, i32 0, i32 %v44 |
| 65 | %v46 = mul i32 %v45, %a3 |
| 66 | %v47 = add i32 %a2, 5 |
| 67 | %v48 = icmp slt i32 %v47, 0 |
| 68 | %v49 = icmp slt i32 %v47, %a4 |
| 69 | %v50 = select i1 %v49, i32 %v47, i32 %v5 |
| 70 | %v51 = select i1 %v48, i32 0, i32 %v50 |
| 71 | %v52 = mul i32 %v51, %a3 |
| 72 | %v53 = add i32 %a2, 6 |
| 73 | %v54 = icmp slt i32 %v53, 0 |
| 74 | %v55 = icmp slt i32 %v53, %a4 |
| 75 | %v56 = select i1 %v55, i32 %v53, i32 %v5 |
| 76 | %v57 = select i1 %v54, i32 0, i32 %v56 |
| 77 | %v58 = mul i32 %v57, %a3 |
| 78 | br label %b5 |
| 79 | |
| 80 | b3: ; preds = %b1 |
| 81 | %v59 = mul i32 %a3, %a2 |
| 82 | %v60 = add i32 %v59, %a1 |
| 83 | %v61 = getelementptr inbounds i8, i8* %a5, i32 %v60 |
| 84 | %v62 = shl i32 %a3, 1 |
| 85 | %v63 = sub i32 0, %v62 |
| 86 | %v64 = sub i32 %a3, %v62 |
| 87 | %v65 = add i32 %v64, %a3 |
| 88 | %v66 = add i32 %v65, %a3 |
| 89 | %v67 = add i32 %v66, %a3 |
| 90 | %v68 = add i32 %v67, %a3 |
| 91 | %v69 = add i32 %v68, %a3 |
| 92 | %v70 = add i32 %v69, %a3 |
| 93 | %v71 = add i32 %v70, %a3 |
| 94 | br label %b4 |
| 95 | |
| 96 | b4: ; preds = %b4, %b3 |
| 97 | %v72 = phi i8* [ %a0, %b3 ], [ %v165, %b4 ] |
| 98 | %v73 = phi i8* [ %v61, %b3 ], [ %v164, %b4 ] |
| 99 | %v74 = phi i32 [ 4, %b3 ], [ %v166, %b4 ] |
| 100 | %v75 = getelementptr inbounds i8, i8* %v73, i32 %v63 |
| 101 | %v76 = load i8, i8* %v75, align 1, !tbaa !0 |
| 102 | %v77 = zext i8 %v76 to i32 |
| 103 | %v78 = getelementptr inbounds i8, i8* %v73, i32 %v64 |
| 104 | %v79 = load i8, i8* %v78, align 1, !tbaa !0 |
| 105 | %v80 = zext i8 %v79 to i32 |
| 106 | %v81 = load i8, i8* %v73, align 1, !tbaa !0 |
| 107 | %v82 = zext i8 %v81 to i32 |
| 108 | %v83 = getelementptr inbounds i8, i8* %v73, i32 %v66 |
| 109 | %v84 = load i8, i8* %v83, align 1, !tbaa !0 |
| 110 | %v85 = zext i8 %v84 to i32 |
| 111 | %v86 = getelementptr inbounds i8, i8* %v73, i32 %v67 |
| 112 | %v87 = load i8, i8* %v86, align 1, !tbaa !0 |
| 113 | %v88 = zext i8 %v87 to i32 |
| 114 | %v89 = getelementptr inbounds i8, i8* %v73, i32 %v68 |
| 115 | %v90 = load i8, i8* %v89, align 1, !tbaa !0 |
| 116 | %v91 = zext i8 %v90 to i32 |
| 117 | %v92 = getelementptr inbounds i8, i8* %v73, i32 %v69 |
| 118 | %v93 = load i8, i8* %v92, align 1, !tbaa !0 |
| 119 | %v94 = zext i8 %v93 to i32 |
| 120 | %v95 = getelementptr inbounds i8, i8* %v73, i32 %v70 |
| 121 | %v96 = load i8, i8* %v95, align 1, !tbaa !0 |
| 122 | %v97 = zext i8 %v96 to i32 |
| 123 | %v98 = getelementptr inbounds i8, i8* %v73, i32 %v71 |
| 124 | %v99 = load i8, i8* %v98, align 1, !tbaa !0 |
| 125 | %v100 = zext i8 %v99 to i32 |
| 126 | %v101 = add nsw i32 %v88, %v80 |
| 127 | %v102 = mul i32 %v101, -5 |
| 128 | %v103 = add nsw i32 %v85, %v82 |
| 129 | %v104 = mul nsw i32 %v103, 20 |
| 130 | %v105 = add i32 %v77, 16 |
| 131 | %v106 = add i32 %v105, %v104 |
| 132 | %v107 = add i32 %v106, %v91 |
| 133 | %v108 = add i32 %v107, %v102 |
| 134 | %v109 = ashr i32 %v108, 5 |
| 135 | %v110 = and i32 %v109, 256 |
| 136 | %v111 = icmp ne i32 %v110, 0 |
| 137 | %v112 = lshr i32 %v108, 31 |
| 138 | %v113 = add i32 %v112, 255 |
| 139 | %v114 = select i1 %v111, i32 %v113, i32 %v109 |
| 140 | %v115 = trunc i32 %v114 to i8 |
| 141 | store i8 %v115, i8* %v72, align 1, !tbaa !0 |
| 142 | %v116 = add nsw i32 %v91, %v82 |
| 143 | %v117 = mul i32 %v116, -5 |
| 144 | %v118 = add nsw i32 %v88, %v85 |
| 145 | %v119 = mul nsw i32 %v118, 20 |
| 146 | %v120 = add i32 %v80, 16 |
| 147 | %v121 = add i32 %v120, %v119 |
| 148 | %v122 = add i32 %v121, %v94 |
| 149 | %v123 = add i32 %v122, %v117 |
| 150 | %v124 = ashr i32 %v123, 5 |
| 151 | %v125 = and i32 %v124, 256 |
| 152 | %v126 = icmp ne i32 %v125, 0 |
| 153 | %v127 = lshr i32 %v123, 31 |
| 154 | %v128 = add i32 %v127, 255 |
| 155 | %v129 = select i1 %v126, i32 %v128, i32 %v124 |
| 156 | %v130 = trunc i32 %v129 to i8 |
| 157 | %v131 = getelementptr inbounds i8, i8* %v72, i32 4 |
| 158 | store i8 %v130, i8* %v131, align 1, !tbaa !0 |
| 159 | %v132 = add nsw i32 %v94, %v85 |
| 160 | %v133 = mul i32 %v132, -5 |
| 161 | %v134 = add nsw i32 %v91, %v88 |
| 162 | %v135 = mul nsw i32 %v134, 20 |
| 163 | %v136 = add i32 %v82, 16 |
| 164 | %v137 = add i32 %v136, %v135 |
| 165 | %v138 = add i32 %v137, %v97 |
| 166 | %v139 = add i32 %v138, %v133 |
| 167 | %v140 = ashr i32 %v139, 5 |
| 168 | %v141 = and i32 %v140, 256 |
| 169 | %v142 = icmp ne i32 %v141, 0 |
| 170 | %v143 = lshr i32 %v139, 31 |
| 171 | %v144 = add i32 %v143, 255 |
| 172 | %v145 = select i1 %v142, i32 %v144, i32 %v140 |
| 173 | %v146 = trunc i32 %v145 to i8 |
| 174 | %v147 = getelementptr inbounds i8, i8* %v72, i32 8 |
| 175 | store i8 %v146, i8* %v147, align 1, !tbaa !0 |
| 176 | %v148 = add nsw i32 %v97, %v88 |
| 177 | %v149 = mul i32 %v148, -5 |
| 178 | %v150 = add nsw i32 %v94, %v91 |
| 179 | %v151 = mul nsw i32 %v150, 20 |
| 180 | %v152 = add i32 %v85, 16 |
| 181 | %v153 = add i32 %v152, %v151 |
| 182 | %v154 = add i32 %v153, %v100 |
| 183 | %v155 = add i32 %v154, %v149 |
| 184 | %v156 = ashr i32 %v155, 5 |
| 185 | %v157 = and i32 %v156, 256 |
| 186 | %v158 = icmp ne i32 %v157, 0 |
| 187 | %v159 = lshr i32 %v155, 31 |
| 188 | %v160 = add i32 %v159, 255 |
| 189 | %v161 = select i1 %v158, i32 %v160, i32 %v156 |
| 190 | %v162 = trunc i32 %v161 to i8 |
| 191 | %v163 = getelementptr inbounds i8, i8* %v72, i32 12 |
| 192 | store i8 %v162, i8* %v163, align 1, !tbaa !0 |
| 193 | %v164 = getelementptr inbounds i8, i8* %v73, i32 1 |
| 194 | %v165 = getelementptr inbounds i8, i8* %v72, i32 1 |
| 195 | %v166 = add i32 %v74, -1 |
| 196 | %v167 = icmp eq i32 %v166, 0 |
| 197 | br i1 %v167, label %b7, label %b4 |
| 198 | |
| 199 | b5: ; preds = %b5, %b2 |
| 200 | %v168 = phi i8* [ %a0, %b2 ], [ %v312, %b5 ] |
| 201 | %v169 = phi i32 [ 0, %b2 ], [ %v313, %b5 ] |
| 202 | %v170 = add i32 %v169, %a1 |
| 203 | %v171 = icmp slt i32 %v170, 0 |
| 204 | %v172 = icmp slt i32 %v170, %a3 |
| 205 | %v173 = select i1 %v172, i32 %v170, i32 %v6 |
| 206 | %v174 = select i1 %v171, i32 0, i32 %v173 |
| 207 | %v175 = add i32 %v19, %v174 |
| 208 | %v176 = getelementptr inbounds i8, i8* %a5, i32 %v175 |
| 209 | %v177 = load i8, i8* %v176, align 1, !tbaa !0 |
| 210 | %v178 = zext i8 %v177 to i32 |
| 211 | %v179 = add i32 %v24, %v174 |
| 212 | %v180 = getelementptr inbounds i8, i8* %a5, i32 %v179 |
| 213 | %v181 = load i8, i8* %v180, align 1, !tbaa !0 |
| 214 | %v182 = zext i8 %v181 to i32 |
| 215 | %v183 = mul nsw i32 %v182, -5 |
| 216 | %v184 = add nsw i32 %v183, %v178 |
| 217 | %v185 = add i32 %v29, %v174 |
| 218 | %v186 = getelementptr inbounds i8, i8* %a5, i32 %v185 |
| 219 | %v187 = load i8, i8* %v186, align 1, !tbaa !0 |
| 220 | %v188 = zext i8 %v187 to i32 |
| 221 | %v189 = mul nsw i32 %v188, 20 |
| 222 | %v190 = add nsw i32 %v189, %v184 |
| 223 | %v191 = add i32 %v13, %v174 |
| 224 | %v192 = getelementptr inbounds i8, i8* %a5, i32 %v191 |
| 225 | %v193 = load i8, i8* %v192, align 1, !tbaa !0 |
| 226 | %v194 = zext i8 %v193 to i32 |
| 227 | %v195 = mul nsw i32 %v194, 20 |
| 228 | %v196 = add nsw i32 %v195, %v190 |
| 229 | %v197 = add i32 %v35, %v174 |
| 230 | %v198 = getelementptr inbounds i8, i8* %a5, i32 %v197 |
| 231 | %v199 = load i8, i8* %v198, align 1, !tbaa !0 |
| 232 | %v200 = zext i8 %v199 to i32 |
| 233 | %v201 = mul nsw i32 %v200, -5 |
| 234 | %v202 = add nsw i32 %v201, %v196 |
| 235 | %v203 = add i32 %v40, %v174 |
| 236 | %v204 = getelementptr inbounds i8, i8* %a5, i32 %v203 |
| 237 | %v205 = load i8, i8* %v204, align 1, !tbaa !0 |
| 238 | %v206 = zext i8 %v205 to i32 |
| 239 | %v207 = add nsw i32 %v206, %v202 |
| 240 | %v208 = add nsw i32 %v207, 16 |
| 241 | %v209 = ashr i32 %v208, 5 |
| 242 | %v210 = and i32 %v209, 256 |
| 243 | %v211 = icmp ne i32 %v210, 0 |
| 244 | %v212 = lshr i32 %v208, 31 |
| 245 | %v213 = add i32 %v212, 255 |
| 246 | %v214 = select i1 %v211, i32 %v213, i32 %v209 |
| 247 | %v215 = trunc i32 %v214 to i8 |
| 248 | store i8 %v215, i8* %v168, align 1, !tbaa !0 |
| 249 | %v216 = getelementptr inbounds i8, i8* %v168, i32 4 |
| 250 | %v217 = load i8, i8* %v180, align 1, !tbaa !0 |
| 251 | %v218 = zext i8 %v217 to i32 |
| 252 | %v219 = load i8, i8* %v186, align 1, !tbaa !0 |
| 253 | %v220 = zext i8 %v219 to i32 |
| 254 | %v221 = mul nsw i32 %v220, -5 |
| 255 | %v222 = add nsw i32 %v221, %v218 |
| 256 | %v223 = load i8, i8* %v192, align 1, !tbaa !0 |
| 257 | %v224 = zext i8 %v223 to i32 |
| 258 | %v225 = mul nsw i32 %v224, 20 |
| 259 | %v226 = add nsw i32 %v225, %v222 |
| 260 | %v227 = load i8, i8* %v198, align 1, !tbaa !0 |
| 261 | %v228 = zext i8 %v227 to i32 |
| 262 | %v229 = mul nsw i32 %v228, 20 |
| 263 | %v230 = add nsw i32 %v229, %v226 |
| 264 | %v231 = load i8, i8* %v204, align 1, !tbaa !0 |
| 265 | %v232 = zext i8 %v231 to i32 |
| 266 | %v233 = mul nsw i32 %v232, -5 |
| 267 | %v234 = add nsw i32 %v233, %v230 |
| 268 | %v235 = add i32 %v46, %v174 |
| 269 | %v236 = getelementptr inbounds i8, i8* %a5, i32 %v235 |
| 270 | %v237 = load i8, i8* %v236, align 1, !tbaa !0 |
| 271 | %v238 = zext i8 %v237 to i32 |
| 272 | %v239 = add nsw i32 %v238, %v234 |
| 273 | %v240 = add nsw i32 %v239, 16 |
| 274 | %v241 = ashr i32 %v240, 5 |
| 275 | %v242 = and i32 %v241, 256 |
| 276 | %v243 = icmp ne i32 %v242, 0 |
| 277 | %v244 = lshr i32 %v240, 31 |
| 278 | %v245 = add i32 %v244, 255 |
| 279 | %v246 = select i1 %v243, i32 %v245, i32 %v241 |
| 280 | %v247 = trunc i32 %v246 to i8 |
| 281 | store i8 %v247, i8* %v216, align 1, !tbaa !0 |
| 282 | %v248 = getelementptr inbounds i8, i8* %v168, i32 8 |
| 283 | %v249 = load i8, i8* %v186, align 1, !tbaa !0 |
| 284 | %v250 = zext i8 %v249 to i32 |
| 285 | %v251 = load i8, i8* %v192, align 1, !tbaa !0 |
| 286 | %v252 = zext i8 %v251 to i32 |
| 287 | %v253 = mul nsw i32 %v252, -5 |
| 288 | %v254 = add nsw i32 %v253, %v250 |
| 289 | %v255 = load i8, i8* %v198, align 1, !tbaa !0 |
| 290 | %v256 = zext i8 %v255 to i32 |
| 291 | %v257 = mul nsw i32 %v256, 20 |
| 292 | %v258 = add nsw i32 %v257, %v254 |
| 293 | %v259 = load i8, i8* %v204, align 1, !tbaa !0 |
| 294 | %v260 = zext i8 %v259 to i32 |
| 295 | %v261 = mul nsw i32 %v260, 20 |
| 296 | %v262 = add nsw i32 %v261, %v258 |
| 297 | %v263 = load i8, i8* %v236, align 1, !tbaa !0 |
| 298 | %v264 = zext i8 %v263 to i32 |
| 299 | %v265 = mul nsw i32 %v264, -5 |
| 300 | %v266 = add nsw i32 %v265, %v262 |
| 301 | %v267 = add i32 %v52, %v174 |
| 302 | %v268 = getelementptr inbounds i8, i8* %a5, i32 %v267 |
| 303 | %v269 = load i8, i8* %v268, align 1, !tbaa !0 |
| 304 | %v270 = zext i8 %v269 to i32 |
| 305 | %v271 = add nsw i32 %v270, %v266 |
| 306 | %v272 = add nsw i32 %v271, 16 |
| 307 | %v273 = ashr i32 %v272, 5 |
| 308 | %v274 = and i32 %v273, 256 |
| 309 | %v275 = icmp ne i32 %v274, 0 |
| 310 | %v276 = lshr i32 %v272, 31 |
| 311 | %v277 = add i32 %v276, 255 |
| 312 | %v278 = select i1 %v275, i32 %v277, i32 %v273 |
| 313 | %v279 = trunc i32 %v278 to i8 |
| 314 | store i8 %v279, i8* %v248, align 1, !tbaa !0 |
| 315 | %v280 = getelementptr inbounds i8, i8* %v168, i32 12 |
| 316 | %v281 = load i8, i8* %v192, align 1, !tbaa !0 |
| 317 | %v282 = zext i8 %v281 to i32 |
| 318 | %v283 = load i8, i8* %v198, align 1, !tbaa !0 |
| 319 | %v284 = zext i8 %v283 to i32 |
| 320 | %v285 = mul nsw i32 %v284, -5 |
| 321 | %v286 = add nsw i32 %v285, %v282 |
| 322 | %v287 = load i8, i8* %v204, align 1, !tbaa !0 |
| 323 | %v288 = zext i8 %v287 to i32 |
| 324 | %v289 = mul nsw i32 %v288, 20 |
| 325 | %v290 = add nsw i32 %v289, %v286 |
| 326 | %v291 = load i8, i8* %v236, align 1, !tbaa !0 |
| 327 | %v292 = zext i8 %v291 to i32 |
| 328 | %v293 = mul nsw i32 %v292, 20 |
| 329 | %v294 = add nsw i32 %v293, %v290 |
| 330 | %v295 = load i8, i8* %v268, align 1, !tbaa !0 |
| 331 | %v296 = zext i8 %v295 to i32 |
| 332 | %v297 = mul nsw i32 %v296, -5 |
| 333 | %v298 = add nsw i32 %v297, %v294 |
| 334 | %v299 = add i32 %v58, %v174 |
| 335 | %v300 = getelementptr inbounds i8, i8* %a5, i32 %v299 |
| 336 | %v301 = load i8, i8* %v300, align 1, !tbaa !0 |
| 337 | %v302 = zext i8 %v301 to i32 |
| 338 | %v303 = add nsw i32 %v302, %v298 |
| 339 | %v304 = add nsw i32 %v303, 16 |
| 340 | %v305 = ashr i32 %v304, 5 |
| 341 | %v306 = and i32 %v305, 256 |
| 342 | %v307 = icmp ne i32 %v306, 0 |
| 343 | %v308 = lshr i32 %v304, 31 |
| 344 | %v309 = add i32 %v308, 255 |
| 345 | %v310 = select i1 %v307, i32 %v309, i32 %v305 |
| 346 | %v311 = trunc i32 %v310 to i8 |
| 347 | store i8 %v311, i8* %v280, align 1, !tbaa !0 |
| 348 | %v312 = getelementptr inbounds i8, i8* %v168, i32 1 |
| 349 | %v313 = add i32 %v169, 1 |
| 350 | %v314 = icmp eq i32 %v313, 4 |
| 351 | br i1 %v314, label %b6, label %b5 |
| 352 | |
| 353 | b6: ; preds = %b5 |
| 354 | br label %b8 |
| 355 | |
| 356 | b7: ; preds = %b4 |
| 357 | br label %b8 |
| 358 | |
| 359 | b8: ; preds = %b7, %b6 |
| 360 | ret void |
| 361 | } |
| 362 | |
| 363 | attributes #0 = { nounwind } |
| 364 | |
| 365 | !0 = !{!1, !1, i64 0} |
| 366 | !1 = !{!"omnipotent char", !2} |
| 367 | !2 = !{!"Simple C/C++ TBAA"} |