1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -O3 -S | FileCheck %s 3 4target triple = "x86_64-unknown-linux-gnu" 5 6%struct.data_t = type { [16 x i8] } 7 8declare void @process6data_t(i64, i64) 9declare void @process36data_tS_S_(i64, i64, i64, i64, i64, i64) 10 11; See https://llvm.org/PR47023 for source examples. 12; In all tests, we expect the i8 constant stores to get merged optimally 13; (through SROA, combining, etc.) so that there are no store insts left. 14 15define void @bad1() { 16; CHECK-LABEL: @bad1( 17; CHECK-NEXT: bb: 18; CHECK-NEXT: tail call void @process6data_t(i64 21542142465, i64 0) 19; CHECK-NEXT: ret void 20; 21bb: 22 %i = alloca %struct.data_t, align 1 23 store i8 1, ptr %i, align 1 24 %i3 = getelementptr inbounds i8, ptr %i, i64 1 25 store i8 2, ptr %i3, align 1 26 %i4 = getelementptr inbounds i8, ptr %i3, i64 1 27 store i8 3, ptr %i4, align 1 28 %i5 = getelementptr inbounds i8, ptr %i4, i64 1 29 store i8 4, ptr %i5, align 1 30 %i6 = getelementptr inbounds i8, ptr %i5, i64 1 31 store i8 5, ptr %i6, align 1 32 %i7 = getelementptr inbounds i8, ptr %i6, i64 1 33 %i8 = getelementptr inbounds i8, ptr %i, i64 16 34 br label %bb9 35 36bb9: ; preds = %bb9, %bb 37 %i10 = phi ptr [ %i7, %bb ], [ %i11, %bb9 ] 38 store i8 0, ptr %i10, align 1 39 %i11 = getelementptr inbounds i8, ptr %i10, i64 1 40 %i12 = icmp eq ptr %i11, %i8 41 br i1 %i12, label %bb13, label %bb9 42 43bb13: ; preds = %bb9 44 %i15 = getelementptr inbounds { i64, i64 }, ptr %i, i32 0, i32 0 45 %i16 = load i64, ptr %i15, align 1 46 %i17 = getelementptr inbounds { i64, i64 }, ptr %i, i32 0, i32 1 47 %i18 = load i64, ptr %i17, align 1 48 call void @process6data_t(i64 %i16, i64 %i18) 49 ret void 50} 51 52define void @bad2() { 53; CHECK-LABEL: @bad2( 54; CHECK-NEXT: bb: 55; CHECK-NEXT: tail call void @process6data_t(i64 216736853120975361, i64 1411785848587524) 56; CHECK-NEXT: ret void 57; 58bb: 59 %i = alloca %struct.data_t, align 1 60 store i8 1, ptr %i, align 1 61 %i3 = getelementptr inbounds i8, ptr %i, i64 1 62 store i8 2, ptr %i3, align 1 63 %i4 = getelementptr inbounds i8, ptr %i3, i64 1 64 store i8 3, ptr %i4, align 1 65 %i5 = getelementptr inbounds i8, ptr %i4, i64 1 66 store i8 4, ptr %i5, align 1 67 %i6 = getelementptr inbounds i8, ptr %i5, i64 1 68 store i8 5, ptr %i6, align 1 69 %i7 = getelementptr inbounds i8, ptr %i6, i64 1 70 store i8 1, ptr %i7, align 1 71 %i8 = getelementptr inbounds i8, ptr %i7, i64 1 72 store i8 2, ptr %i8, align 1 73 %i9 = getelementptr inbounds i8, ptr %i8, i64 1 74 store i8 3, ptr %i9, align 1 75 %i10 = getelementptr inbounds i8, ptr %i9, i64 1 76 store i8 4, ptr %i10, align 1 77 %i11 = getelementptr inbounds i8, ptr %i10, i64 1 78 store i8 5, ptr %i11, align 1 79 %i12 = getelementptr inbounds i8, ptr %i11, i64 1 80 store i8 1, ptr %i12, align 1 81 %i13 = getelementptr inbounds i8, ptr %i12, i64 1 82 store i8 2, ptr %i13, align 1 83 %i14 = getelementptr inbounds i8, ptr %i13, i64 1 84 store i8 3, ptr %i14, align 1 85 %i15 = getelementptr inbounds i8, ptr %i14, i64 1 86 store i8 4, ptr %i15, align 1 87 %i16 = getelementptr inbounds i8, ptr %i15, i64 1 88 store i8 5, ptr %i16, align 1 89 %i17 = getelementptr inbounds i8, ptr %i16, i64 1 90 %i18 = getelementptr inbounds i8, ptr %i, i64 16 91 br label %bb19 92 93bb19: ; preds = %bb19, %bb 94 %i20 = phi ptr [ %i17, %bb ], [ %i21, %bb19 ] 95 store i8 0, ptr %i20, align 1 96 %i21 = getelementptr inbounds i8, ptr %i20, i64 1 97 %i22 = icmp eq ptr %i21, %i18 98 br i1 %i22, label %bb23, label %bb19 99 100bb23: ; preds = %bb19 101 %i25 = getelementptr inbounds { i64, i64 }, ptr %i, i32 0, i32 0 102 %i26 = load i64, ptr %i25, align 1 103 %i27 = getelementptr inbounds { i64, i64 }, ptr %i, i32 0, i32 1 104 %i28 = load i64, ptr %i27, align 1 105 call void @process6data_t(i64 %i26, i64 %i28) 106 ret void 107} 108 109define void @bad3() { 110; CHECK-LABEL: @bad3( 111; CHECK-NEXT: bb: 112; CHECK-NEXT: tail call void @process36data_tS_S_(i64 21542142465, i64 0, i64 723401749922909195, i64 723401728380766730, i64 1446803478303675925, i64 5651576002974730) 113; CHECK-NEXT: ret void 114; 115bb: 116 %i = alloca %struct.data_t, align 1 117 %i1 = alloca %struct.data_t, align 1 118 %i2 = alloca %struct.data_t, align 1 119 store i8 1, ptr %i, align 1 120 %i5 = getelementptr inbounds i8, ptr %i, i64 1 121 store i8 2, ptr %i5, align 1 122 %i6 = getelementptr inbounds i8, ptr %i5, i64 1 123 store i8 3, ptr %i6, align 1 124 %i7 = getelementptr inbounds i8, ptr %i6, i64 1 125 store i8 4, ptr %i7, align 1 126 %i8 = getelementptr inbounds i8, ptr %i7, i64 1 127 store i8 5, ptr %i8, align 1 128 %i9 = getelementptr inbounds i8, ptr %i8, i64 1 129 store i8 0, ptr %i9, align 1 130 %i10 = getelementptr inbounds i8, ptr %i9, i64 1 131 store i8 0, ptr %i10, align 1 132 %i11 = getelementptr inbounds i8, ptr %i10, i64 1 133 store i8 0, ptr %i11, align 1 134 %i12 = getelementptr inbounds i8, ptr %i11, i64 1 135 store i8 0, ptr %i12, align 1 136 %i13 = getelementptr inbounds i8, ptr %i12, i64 1 137 store i8 0, ptr %i13, align 1 138 %i14 = getelementptr inbounds i8, ptr %i13, i64 1 139 store i8 0, ptr %i14, align 1 140 %i15 = getelementptr inbounds i8, ptr %i14, i64 1 141 store i8 0, ptr %i15, align 1 142 %i16 = getelementptr inbounds i8, ptr %i15, i64 1 143 store i8 0, ptr %i16, align 1 144 %i17 = getelementptr inbounds i8, ptr %i16, i64 1 145 store i8 0, ptr %i17, align 1 146 %i18 = getelementptr inbounds i8, ptr %i17, i64 1 147 store i8 0, ptr %i18, align 1 148 %i19 = getelementptr inbounds i8, ptr %i18, i64 1 149 store i8 0, ptr %i19, align 1 150 store i8 11, ptr %i1, align 1 151 %i22 = getelementptr inbounds i8, ptr %i1, i64 1 152 store i8 12, ptr %i22, align 1 153 %i23 = getelementptr inbounds i8, ptr %i22, i64 1 154 store i8 13, ptr %i23, align 1 155 %i24 = getelementptr inbounds i8, ptr %i23, i64 1 156 store i8 14, ptr %i24, align 1 157 %i25 = getelementptr inbounds i8, ptr %i24, i64 1 158 store i8 15, ptr %i25, align 1 159 %i26 = getelementptr inbounds i8, ptr %i25, i64 1 160 store i8 10, ptr %i26, align 1 161 %i27 = getelementptr inbounds i8, ptr %i26, i64 1 162 store i8 10, ptr %i27, align 1 163 %i28 = getelementptr inbounds i8, ptr %i27, i64 1 164 store i8 10, ptr %i28, align 1 165 %i29 = getelementptr inbounds i8, ptr %i28, i64 1 166 store i8 10, ptr %i29, align 1 167 %i30 = getelementptr inbounds i8, ptr %i29, i64 1 168 store i8 10, ptr %i30, align 1 169 %i31 = getelementptr inbounds i8, ptr %i30, i64 1 170 store i8 10, ptr %i31, align 1 171 %i32 = getelementptr inbounds i8, ptr %i31, i64 1 172 store i8 10, ptr %i32, align 1 173 %i33 = getelementptr inbounds i8, ptr %i32, i64 1 174 store i8 10, ptr %i33, align 1 175 %i34 = getelementptr inbounds i8, ptr %i33, i64 1 176 store i8 10, ptr %i34, align 1 177 %i35 = getelementptr inbounds i8, ptr %i34, i64 1 178 store i8 10, ptr %i35, align 1 179 %i36 = getelementptr inbounds i8, ptr %i35, i64 1 180 store i8 10, ptr %i36, align 1 181 store i8 21, ptr %i2, align 1 182 %i39 = getelementptr inbounds i8, ptr %i2, i64 1 183 store i8 22, ptr %i39, align 1 184 %i40 = getelementptr inbounds i8, ptr %i39, i64 1 185 store i8 23, ptr %i40, align 1 186 %i41 = getelementptr inbounds i8, ptr %i40, i64 1 187 store i8 24, ptr %i41, align 1 188 %i42 = getelementptr inbounds i8, ptr %i41, i64 1 189 store i8 25, ptr %i42, align 1 190 %i43 = getelementptr inbounds i8, ptr %i42, i64 1 191 store i8 20, ptr %i43, align 1 192 %i44 = getelementptr inbounds i8, ptr %i43, i64 1 193 store i8 20, ptr %i44, align 1 194 %i45 = getelementptr inbounds i8, ptr %i44, i64 1 195 store i8 20, ptr %i45, align 1 196 %i46 = getelementptr inbounds i8, ptr %i45, i64 1 197 store i8 10, ptr %i46, align 1 198 %i47 = getelementptr inbounds i8, ptr %i46, i64 1 199 store i8 20, ptr %i47, align 1 200 %i48 = getelementptr inbounds i8, ptr %i47, i64 1 201 store i8 20, ptr %i48, align 1 202 %i49 = getelementptr inbounds i8, ptr %i48, i64 1 203 store i8 20, ptr %i49, align 1 204 %i50 = getelementptr inbounds i8, ptr %i49, i64 1 205 store i8 20, ptr %i50, align 1 206 %i51 = getelementptr inbounds i8, ptr %i50, i64 1 207 store i8 20, ptr %i51, align 1 208 %i52 = getelementptr inbounds i8, ptr %i51, i64 1 209 store i8 20, ptr %i52, align 1 210 %i53 = getelementptr inbounds i8, ptr %i52, i64 1 211 %i54 = getelementptr inbounds i8, ptr %i2, i64 16 212 br label %bb55 213 214bb55: ; preds = %bb55, %bb 215 %i56 = phi ptr [ %i53, %bb ], [ %i57, %bb55 ] 216 store i8 0, ptr %i56, align 1 217 %i57 = getelementptr inbounds i8, ptr %i56, i64 1 218 %i58 = icmp eq ptr %i57, %i54 219 br i1 %i58, label %bb59, label %bb55 220 221bb59: ; preds = %bb55 222 %i61 = getelementptr inbounds { i64, i64 }, ptr %i, i32 0, i32 0 223 %i62 = load i64, ptr %i61, align 1 224 %i63 = getelementptr inbounds { i64, i64 }, ptr %i, i32 0, i32 1 225 %i64 = load i64, ptr %i63, align 1 226 %i66 = getelementptr inbounds { i64, i64 }, ptr %i1, i32 0, i32 0 227 %i67 = load i64, ptr %i66, align 1 228 %i68 = getelementptr inbounds { i64, i64 }, ptr %i1, i32 0, i32 1 229 %i69 = load i64, ptr %i68, align 1 230 %i71 = getelementptr inbounds { i64, i64 }, ptr %i2, i32 0, i32 0 231 %i72 = load i64, ptr %i71, align 1 232 %i73 = getelementptr inbounds { i64, i64 }, ptr %i2, i32 0, i32 1 233 %i74 = load i64, ptr %i73, align 1 234 call void @process36data_tS_S_(i64 %i62, i64 %i64, i64 %i67, i64 %i69, i64 %i72, i64 %i74) 235 ret void 236} 237 238define void @bad4() { 239; CHECK-LABEL: @bad4( 240; CHECK-NEXT: bb: 241; CHECK-NEXT: tail call void @process36data_tS_S_(i64 21542142465, i64 0, i64 723401749922909195, i64 723401728380766730, i64 1446803478303675925, i64 798285110420182026) 242; CHECK-NEXT: ret void 243; 244bb: 245 %i = alloca %struct.data_t, align 1 246 %i1 = alloca %struct.data_t, align 1 247 %i2 = alloca %struct.data_t, align 1 248 store i8 1, ptr %i, align 1 249 %i5 = getelementptr inbounds i8, ptr %i, i64 1 250 store i8 2, ptr %i5, align 1 251 %i6 = getelementptr inbounds i8, ptr %i5, i64 1 252 store i8 3, ptr %i6, align 1 253 %i7 = getelementptr inbounds i8, ptr %i6, i64 1 254 store i8 4, ptr %i7, align 1 255 %i8 = getelementptr inbounds i8, ptr %i7, i64 1 256 store i8 5, ptr %i8, align 1 257 %i9 = getelementptr inbounds i8, ptr %i8, i64 1 258 store i8 0, ptr %i9, align 1 259 %i10 = getelementptr inbounds i8, ptr %i9, i64 1 260 store i8 0, ptr %i10, align 1 261 %i11 = getelementptr inbounds i8, ptr %i10, i64 1 262 store i8 0, ptr %i11, align 1 263 %i12 = getelementptr inbounds i8, ptr %i11, i64 1 264 store i8 0, ptr %i12, align 1 265 %i13 = getelementptr inbounds i8, ptr %i12, i64 1 266 store i8 0, ptr %i13, align 1 267 %i14 = getelementptr inbounds i8, ptr %i13, i64 1 268 store i8 0, ptr %i14, align 1 269 %i15 = getelementptr inbounds i8, ptr %i14, i64 1 270 store i8 0, ptr %i15, align 1 271 %i16 = getelementptr inbounds i8, ptr %i15, i64 1 272 store i8 0, ptr %i16, align 1 273 %i17 = getelementptr inbounds i8, ptr %i16, i64 1 274 store i8 0, ptr %i17, align 1 275 %i18 = getelementptr inbounds i8, ptr %i17, i64 1 276 store i8 0, ptr %i18, align 1 277 %i19 = getelementptr inbounds i8, ptr %i18, i64 1 278 store i8 0, ptr %i19, align 1 279 store i8 11, ptr %i1, align 1 280 %i22 = getelementptr inbounds i8, ptr %i1, i64 1 281 store i8 12, ptr %i22, align 1 282 %i23 = getelementptr inbounds i8, ptr %i22, i64 1 283 store i8 13, ptr %i23, align 1 284 %i24 = getelementptr inbounds i8, ptr %i23, i64 1 285 store i8 14, ptr %i24, align 1 286 %i25 = getelementptr inbounds i8, ptr %i24, i64 1 287 store i8 15, ptr %i25, align 1 288 %i26 = getelementptr inbounds i8, ptr %i25, i64 1 289 store i8 10, ptr %i26, align 1 290 %i27 = getelementptr inbounds i8, ptr %i26, i64 1 291 store i8 10, ptr %i27, align 1 292 %i28 = getelementptr inbounds i8, ptr %i27, i64 1 293 store i8 10, ptr %i28, align 1 294 %i29 = getelementptr inbounds i8, ptr %i28, i64 1 295 store i8 10, ptr %i29, align 1 296 %i30 = getelementptr inbounds i8, ptr %i29, i64 1 297 store i8 10, ptr %i30, align 1 298 %i31 = getelementptr inbounds i8, ptr %i30, i64 1 299 store i8 10, ptr %i31, align 1 300 %i32 = getelementptr inbounds i8, ptr %i31, i64 1 301 store i8 10, ptr %i32, align 1 302 %i33 = getelementptr inbounds i8, ptr %i32, i64 1 303 store i8 10, ptr %i33, align 1 304 %i34 = getelementptr inbounds i8, ptr %i33, i64 1 305 store i8 10, ptr %i34, align 1 306 %i35 = getelementptr inbounds i8, ptr %i34, i64 1 307 store i8 10, ptr %i35, align 1 308 %i36 = getelementptr inbounds i8, ptr %i35, i64 1 309 store i8 10, ptr %i36, align 1 310 store i8 21, ptr %i2, align 1 311 %i39 = getelementptr inbounds i8, ptr %i2, i64 1 312 store i8 22, ptr %i39, align 1 313 %i40 = getelementptr inbounds i8, ptr %i39, i64 1 314 store i8 23, ptr %i40, align 1 315 %i41 = getelementptr inbounds i8, ptr %i40, i64 1 316 store i8 24, ptr %i41, align 1 317 %i42 = getelementptr inbounds i8, ptr %i41, i64 1 318 store i8 25, ptr %i42, align 1 319 %i43 = getelementptr inbounds i8, ptr %i42, i64 1 320 store i8 20, ptr %i43, align 1 321 %i44 = getelementptr inbounds i8, ptr %i43, i64 1 322 store i8 20, ptr %i44, align 1 323 %i45 = getelementptr inbounds i8, ptr %i44, i64 1 324 store i8 20, ptr %i45, align 1 325 %i46 = getelementptr inbounds i8, ptr %i45, i64 1 326 store i8 10, ptr %i46, align 1 327 %i47 = getelementptr inbounds i8, ptr %i46, i64 1 328 store i8 20, ptr %i47, align 1 329 %i48 = getelementptr inbounds i8, ptr %i47, i64 1 330 store i8 20, ptr %i48, align 1 331 %i49 = getelementptr inbounds i8, ptr %i48, i64 1 332 store i8 20, ptr %i49, align 1 333 %i50 = getelementptr inbounds i8, ptr %i49, i64 1 334 store i8 20, ptr %i50, align 1 335 %i51 = getelementptr inbounds i8, ptr %i50, i64 1 336 store i8 20, ptr %i51, align 1 337 %i52 = getelementptr inbounds i8, ptr %i51, i64 1 338 store i8 20, ptr %i52, align 1 339 %i53 = getelementptr inbounds i8, ptr %i52, i64 1 340 store i8 11, ptr %i53, align 1 341 %i55 = getelementptr inbounds { i64, i64 }, ptr %i, i32 0, i32 0 342 %i56 = load i64, ptr %i55, align 1 343 %i57 = getelementptr inbounds { i64, i64 }, ptr %i, i32 0, i32 1 344 %i58 = load i64, ptr %i57, align 1 345 %i60 = getelementptr inbounds { i64, i64 }, ptr %i1, i32 0, i32 0 346 %i61 = load i64, ptr %i60, align 1 347 %i62 = getelementptr inbounds { i64, i64 }, ptr %i1, i32 0, i32 1 348 %i63 = load i64, ptr %i62, align 1 349 %i65 = getelementptr inbounds { i64, i64 }, ptr %i2, i32 0, i32 0 350 %i66 = load i64, ptr %i65, align 1 351 %i67 = getelementptr inbounds { i64, i64 }, ptr %i2, i32 0, i32 1 352 %i68 = load i64, ptr %i67, align 1 353 call void @process36data_tS_S_(i64 %i56, i64 %i58, i64 %i61, i64 %i63, i64 %i66, i64 %i68) 354 ret void 355} 356