322 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes='sroa<preserve-cfg>' -data-layout="e-n8:16:32:64" -S %s | FileCheck %s --check-prefixes=CHECK-ALL,CHECK-SCALAR,CHECK-SCALAR-64,CHECK-LE-643; RUN: opt -passes='sroa<modify-cfg>' -data-layout="e-n8:16:32:64" -S %s | FileCheck %s --check-prefixes=CHECK-ALL,CHECK-SCALAR,CHECK-SCALAR-64,CHECK-LE-644; RUN: opt -passes='sroa<preserve-cfg>' -data-layout="e-n8:16:32" -S %s | FileCheck %s --check-prefixes=CHECK-ALL,CHECK-SCALAR,CHECK-SCALAR-32,CHECK-LE-325; RUN: opt -passes='sroa<modify-cfg>' -data-layout="e-n8:16:32" -S %s | FileCheck %s --check-prefixes=CHECK-ALL,CHECK-SCALAR,CHECK-SCALAR-32,CHECK-LE-326; RUN: opt -passes='sroa<preserve-cfg>' -data-layout="E-n8:16:32:64" -S %s | FileCheck %s --check-prefixes=CHECK-ALL,CHECK-SCALAR,CHECK-SCALAR-64,CHECK-BE-647; RUN: opt -passes='sroa<modify-cfg>' -data-layout="E-n8:16:32:64" -S %s | FileCheck %s --check-prefixes=CHECK-ALL,CHECK-SCALAR,CHECK-SCALAR-64,CHECK-BE-648; RUN: opt -passes='sroa<preserve-cfg>' -data-layout="E-n8:16:32" -S %s | FileCheck %s --check-prefixes=CHECK-ALL,CHECK-SCALAR,CHECK-SCALAR-32,CHECK-BE-329; RUN: opt -passes='sroa<modify-cfg>' -data-layout="E-n8:16:32" -S %s | FileCheck %s --check-prefixes=CHECK-ALL,CHECK-SCALAR,CHECK-SCALAR-32,CHECK-BE-3210 11;; Special test12 13define void @load_2byte_chunk_of_8byte_alloca_with_2byte_step(ptr %src, i64 %byteOff, ptr %dst) nounwind {14; CHECK-ALL-LABEL: @load_2byte_chunk_of_8byte_alloca_with_2byte_step(15; CHECK-ALL-NEXT: [[INTERMEDIATE:%.*]] = alloca [8 x i8], align 6416; CHECK-ALL-NEXT: [[INIT:%.*]] = load <8 x i8>, ptr [[SRC:%.*]], align 117; CHECK-ALL-NEXT: store <8 x i8> [[INIT]], ptr [[INTERMEDIATE]], align 6418; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF_ADDR:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE]], i64 [[BYTEOFF:%.*]]19; CHECK-ALL-NEXT: [[CHUNK:%.*]] = load <2 x i8>, ptr [[INTERMEDIATE_OFF_ADDR]], align 120; CHECK-ALL-NEXT: store <2 x i8> [[CHUNK]], ptr [[DST:%.*]], align 221; CHECK-ALL-NEXT: ret void22;23 %intermediate = alloca [8 x i8], align 6424 %init = load <8 x i8>, ptr %src, align 125 store <8 x i8> %init, ptr %intermediate, align 6426 %intermediate.off.addr = getelementptr inbounds i16, ptr %intermediate, i64 %byteOff27 %chunk = load <2 x i8>, ptr %intermediate.off.addr, align 128 store <2 x i8> %chunk, ptr %dst29 ret void30}31 32define void @load_volatile_2byte_chunk_of_8byte_alloca_with_2byte_step(ptr %src, i64 %byteOff, ptr %dst) nounwind {33; CHECK-ALL-LABEL: @load_volatile_2byte_chunk_of_8byte_alloca_with_2byte_step(34; CHECK-ALL-NEXT: [[INTERMEDIATE:%.*]] = alloca [8 x i8], align 6435; CHECK-ALL-NEXT: [[INIT:%.*]] = load <8 x i8>, ptr [[SRC:%.*]], align 136; CHECK-ALL-NEXT: store <8 x i8> [[INIT]], ptr [[INTERMEDIATE]], align 6437; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF_ADDR:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE]], i64 [[BYTEOFF:%.*]]38; CHECK-ALL-NEXT: [[CHUNK:%.*]] = load volatile <2 x i8>, ptr [[INTERMEDIATE_OFF_ADDR]], align 139; CHECK-ALL-NEXT: store <2 x i8> [[CHUNK]], ptr [[DST:%.*]], align 240; CHECK-ALL-NEXT: ret void41;42 %intermediate = alloca [8 x i8], align 6443 %init = load <8 x i8>, ptr %src, align 144 store <8 x i8> %init, ptr %intermediate, align 6445 %intermediate.off.addr = getelementptr inbounds i16, ptr %intermediate, i64 %byteOff46 %chunk = load volatile <2 x i8>, ptr %intermediate.off.addr, align 147 store <2 x i8> %chunk, ptr %dst48 ret void49}50 51define void @store_2byte_chunk_of_8byte_alloca_with_2byte_step(ptr %src, i64 %byteOff, <2 x i8> %reinit, ptr %dst) nounwind {52; CHECK-ALL-LABEL: @store_2byte_chunk_of_8byte_alloca_with_2byte_step(53; CHECK-ALL-NEXT: [[INTERMEDIATE:%.*]] = alloca [8 x i8], align 6454; CHECK-ALL-NEXT: [[INIT:%.*]] = load <8 x i8>, ptr [[SRC:%.*]], align 155; CHECK-ALL-NEXT: store <8 x i8> [[INIT]], ptr [[INTERMEDIATE]], align 6456; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF_ADDR:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE]], i64 [[BYTEOFF:%.*]]57; CHECK-ALL-NEXT: store <2 x i8> [[REINIT:%.*]], ptr [[INTERMEDIATE_OFF_ADDR]], align 158; CHECK-ALL-NEXT: [[FINAL:%.*]] = load <8 x i8>, ptr [[INTERMEDIATE]], align 159; CHECK-ALL-NEXT: store <8 x i8> [[FINAL]], ptr [[DST:%.*]], align 860; CHECK-ALL-NEXT: ret void61;62 %intermediate = alloca [8 x i8], align 6463 %init = load <8 x i8>, ptr %src, align 164 store <8 x i8> %init, ptr %intermediate, align 6465 %intermediate.off.addr = getelementptr inbounds i16, ptr %intermediate, i64 %byteOff66 store <2 x i8> %reinit, ptr %intermediate.off.addr, align 167 %final = load <8 x i8>, ptr %intermediate, align 168 store <8 x i8> %final, ptr %dst69 ret void70}71 72define void @store_volatile_2byte_chunk_of_8byte_alloca_with_2byte_step(ptr %src, i64 %byteOff, <2 x i8> %reinit, ptr %dst) nounwind {73; CHECK-ALL-LABEL: @store_volatile_2byte_chunk_of_8byte_alloca_with_2byte_step(74; CHECK-ALL-NEXT: [[INTERMEDIATE:%.*]] = alloca [8 x i8], align 6475; CHECK-ALL-NEXT: [[INIT:%.*]] = load <8 x i8>, ptr [[SRC:%.*]], align 176; CHECK-ALL-NEXT: store <8 x i8> [[INIT]], ptr [[INTERMEDIATE]], align 6477; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF_ADDR:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE]], i64 [[BYTEOFF:%.*]]78; CHECK-ALL-NEXT: store volatile <2 x i8> [[REINIT:%.*]], ptr [[INTERMEDIATE_OFF_ADDR]], align 179; CHECK-ALL-NEXT: [[FINAL:%.*]] = load <8 x i8>, ptr [[INTERMEDIATE]], align 180; CHECK-ALL-NEXT: store <8 x i8> [[FINAL]], ptr [[DST:%.*]], align 881; CHECK-ALL-NEXT: ret void82;83 %intermediate = alloca [8 x i8], align 6484 %init = load <8 x i8>, ptr %src, align 185 store <8 x i8> %init, ptr %intermediate, align 6486 %intermediate.off.addr = getelementptr inbounds i16, ptr %intermediate, i64 %byteOff87 store volatile <2 x i8> %reinit, ptr %intermediate.off.addr, align 188 %final = load <8 x i8>, ptr %intermediate, align 189 store <8 x i8> %final, ptr %dst90 ret void91}92 93define void @load_2byte_chunk_of_8byte_alloca_with_2byte_step_with_constant_offset_beforehand(ptr %src, i64 %byteOff, ptr %dst) nounwind {94; CHECK-ALL-LABEL: @load_2byte_chunk_of_8byte_alloca_with_2byte_step_with_constant_offset_beforehand(95; CHECK-ALL-NEXT: [[INTERMEDIATE:%.*]] = alloca [8 x i8], align 6496; CHECK-ALL-NEXT: [[INIT:%.*]] = load <8 x i8>, ptr [[SRC:%.*]], align 197; CHECK-ALL-NEXT: store <8 x i8> [[INIT]], ptr [[INTERMEDIATE]], align 6498; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF_ADDR_CST:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE]], i64 199; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF_ADDR:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE_OFF_ADDR_CST]], i64 [[BYTEOFF:%.*]]100; CHECK-ALL-NEXT: [[CHUNK:%.*]] = load <2 x i8>, ptr [[INTERMEDIATE_OFF_ADDR]], align 1101; CHECK-ALL-NEXT: store <2 x i8> [[CHUNK]], ptr [[DST:%.*]], align 2102; CHECK-ALL-NEXT: ret void103;104 %intermediate = alloca [8 x i8], align 64105 %init = load <8 x i8>, ptr %src, align 1106 store <8 x i8> %init, ptr %intermediate, align 64107 %intermediate.off.addr.cst = getelementptr inbounds i16, ptr %intermediate, i64 1108 %intermediate.off.addr = getelementptr inbounds i16, ptr %intermediate.off.addr.cst, i64 %byteOff109 %chunk = load <2 x i8>, ptr %intermediate.off.addr, align 1110 store <2 x i8> %chunk, ptr %dst111 ret void112}113 114define void @load_2byte_chunk_of_8byte_alloca_with_2byte_step_with_constant_offset_afterwards(ptr %src, i64 %byteOff, ptr %dst) nounwind {115; CHECK-ALL-LABEL: @load_2byte_chunk_of_8byte_alloca_with_2byte_step_with_constant_offset_afterwards(116; CHECK-ALL-NEXT: [[INTERMEDIATE:%.*]] = alloca [8 x i8], align 64117; CHECK-ALL-NEXT: [[INIT:%.*]] = load <8 x i8>, ptr [[SRC:%.*]], align 1118; CHECK-ALL-NEXT: store <8 x i8> [[INIT]], ptr [[INTERMEDIATE]], align 64119; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF_ADDR_VARIABLE:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE]], i64 [[BYTEOFF:%.*]]120; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF_ADDR:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE_OFF_ADDR_VARIABLE]], i64 1121; CHECK-ALL-NEXT: [[CHUNK:%.*]] = load <2 x i8>, ptr [[INTERMEDIATE_OFF_ADDR]], align 1122; CHECK-ALL-NEXT: store <2 x i8> [[CHUNK]], ptr [[DST:%.*]], align 2123; CHECK-ALL-NEXT: ret void124;125 %intermediate = alloca [8 x i8], align 64126 %init = load <8 x i8>, ptr %src, align 1127 store <8 x i8> %init, ptr %intermediate, align 64128 %intermediate.off.addr.variable = getelementptr inbounds i16, ptr %intermediate, i64 %byteOff129 %intermediate.off.addr = getelementptr inbounds i16, ptr %intermediate.off.addr.variable, i64 1130 %chunk = load <2 x i8>, ptr %intermediate.off.addr, align 1131 store <2 x i8> %chunk, ptr %dst132 ret void133}134 135define void @load_2byte_chunk_of_8byte_alloca_with_2byte_step_with_variable_offset_inbetween_constant_offsets(ptr %src, i64 %byteOff, ptr %dst) nounwind {136; CHECK-ALL-LABEL: @load_2byte_chunk_of_8byte_alloca_with_2byte_step_with_variable_offset_inbetween_constant_offsets(137; CHECK-ALL-NEXT: [[INTERMEDIATE:%.*]] = alloca [8 x i8], align 64138; CHECK-ALL-NEXT: [[INIT:%.*]] = load <8 x i8>, ptr [[SRC:%.*]], align 1139; CHECK-ALL-NEXT: store <8 x i8> [[INIT]], ptr [[INTERMEDIATE]], align 64140; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF_ADDR_CST:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE]], i64 1141; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF_ADDR_VARIABLE:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE_OFF_ADDR_CST]], i64 [[BYTEOFF:%.*]]142; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF_ADDR:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE_OFF_ADDR_VARIABLE]], i64 1143; CHECK-ALL-NEXT: [[CHUNK:%.*]] = load <2 x i8>, ptr [[INTERMEDIATE_OFF_ADDR]], align 1144; CHECK-ALL-NEXT: store <2 x i8> [[CHUNK]], ptr [[DST:%.*]], align 2145; CHECK-ALL-NEXT: ret void146;147 %intermediate = alloca [8 x i8], align 64148 %init = load <8 x i8>, ptr %src, align 1149 store <8 x i8> %init, ptr %intermediate, align 64150 %intermediate.off.addr.cst = getelementptr inbounds i16, ptr %intermediate, i64 1151 %intermediate.off.addr.variable = getelementptr inbounds i16, ptr %intermediate.off.addr.cst, i64 %byteOff152 %intermediate.off.addr = getelementptr inbounds i16, ptr %intermediate.off.addr.variable, i64 1153 %chunk = load <2 x i8>, ptr %intermediate.off.addr, align 1154 store <2 x i8> %chunk, ptr %dst155 ret void156}157 158define void @load_2byte_chunk_of_8byte_alloca_with_2byte_step_select_of_variable_geps(ptr %src, i64 %byteOff0, i64 %byteOff1, i1 %cond, ptr %dst) nounwind {159; CHECK-ALL-LABEL: @load_2byte_chunk_of_8byte_alloca_with_2byte_step_select_of_variable_geps(160; CHECK-ALL-NEXT: [[INTERMEDIATE:%.*]] = alloca [8 x i8], align 64161; CHECK-ALL-NEXT: [[INIT:%.*]] = load <8 x i8>, ptr [[SRC:%.*]], align 1162; CHECK-ALL-NEXT: store <8 x i8> [[INIT]], ptr [[INTERMEDIATE]], align 64163; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF0:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE]], i64 [[BYTEOFF0:%.*]]164; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF1:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE]], i64 [[BYTEOFF1:%.*]]165; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF_ADDR:%.*]] = select i1 [[COND:%.*]], ptr [[INTERMEDIATE_OFF0]], ptr [[INTERMEDIATE_OFF1]]166; CHECK-ALL-NEXT: [[CHUNK:%.*]] = load <2 x i8>, ptr [[INTERMEDIATE_OFF_ADDR]], align 1167; CHECK-ALL-NEXT: store <2 x i8> [[CHUNK]], ptr [[DST:%.*]], align 2168; CHECK-ALL-NEXT: ret void169;170 %intermediate = alloca [8 x i8], align 64171 %init = load <8 x i8>, ptr %src, align 1172 store <8 x i8> %init, ptr %intermediate, align 64173 %intermediate.off0 = getelementptr inbounds i16, ptr %intermediate, i64 %byteOff0174 %intermediate.off1 = getelementptr inbounds i16, ptr %intermediate, i64 %byteOff1175 %intermediate.off.addr = select i1 %cond, ptr %intermediate.off0, ptr %intermediate.off1176 %chunk = load <2 x i8>, ptr %intermediate.off.addr, align 1177 store <2 x i8> %chunk, ptr %dst178 ret void179}180 181define void @load_2byte_chunk_of_8byte_alloca_with_2byte_step_select_of_variable_and_const_geps(ptr %src, i64 %byteOff0, i64 %byteOff1, i1 %cond, ptr %dst) nounwind {182; CHECK-ALL-LABEL: @load_2byte_chunk_of_8byte_alloca_with_2byte_step_select_of_variable_and_const_geps(183; CHECK-ALL-NEXT: [[INTERMEDIATE:%.*]] = alloca [8 x i8], align 64184; CHECK-ALL-NEXT: [[INIT:%.*]] = load <8 x i8>, ptr [[SRC:%.*]], align 1185; CHECK-ALL-NEXT: store <8 x i8> [[INIT]], ptr [[INTERMEDIATE]], align 64186; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF0:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE]], i64 1187; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF1:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE]], i64 [[BYTEOFF1:%.*]]188; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF_ADDR:%.*]] = select i1 [[COND:%.*]], ptr [[INTERMEDIATE_OFF0]], ptr [[INTERMEDIATE_OFF1]]189; CHECK-ALL-NEXT: [[CHUNK:%.*]] = load <2 x i8>, ptr [[INTERMEDIATE_OFF_ADDR]], align 1190; CHECK-ALL-NEXT: store <2 x i8> [[CHUNK]], ptr [[DST:%.*]], align 2191; CHECK-ALL-NEXT: ret void192;193 %intermediate = alloca [8 x i8], align 64194 %init = load <8 x i8>, ptr %src, align 1195 store <8 x i8> %init, ptr %intermediate, align 64196 %intermediate.off0 = getelementptr inbounds i16, ptr %intermediate, i64 1197 %intermediate.off1 = getelementptr inbounds i16, ptr %intermediate, i64 %byteOff1198 %intermediate.off.addr = select i1 %cond, ptr %intermediate.off0, ptr %intermediate.off1199 %chunk = load <2 x i8>, ptr %intermediate.off.addr, align 1200 store <2 x i8> %chunk, ptr %dst201 ret void202}203 204define void @load_2byte_chunk_of_8byte_alloca_with_2byte_step_variable_gep_of_select_of_const_geps(ptr %src, i64 %byteOff, i1 %cond, ptr %dst) nounwind {205; CHECK-ALL-LABEL: @load_2byte_chunk_of_8byte_alloca_with_2byte_step_variable_gep_of_select_of_const_geps(206; CHECK-ALL-NEXT: [[INTERMEDIATE:%.*]] = alloca [8 x i8], align 64207; CHECK-ALL-NEXT: [[INIT:%.*]] = load <8 x i8>, ptr [[SRC:%.*]], align 1208; CHECK-ALL-NEXT: store <8 x i8> [[INIT]], ptr [[INTERMEDIATE]], align 64209; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF0:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE]], i64 0210; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF1:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE]], i64 2211; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF_ADDR:%.*]] = select i1 [[COND:%.*]], ptr [[INTERMEDIATE_OFF0]], ptr [[INTERMEDIATE_OFF1]]212; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF_ADDR_VAR:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE_OFF_ADDR]], i64 [[BYTEOFF:%.*]]213; CHECK-ALL-NEXT: [[CHUNK:%.*]] = load <2 x i8>, ptr [[INTERMEDIATE_OFF_ADDR_VAR]], align 1214; CHECK-ALL-NEXT: store <2 x i8> [[CHUNK]], ptr [[DST:%.*]], align 2215; CHECK-ALL-NEXT: ret void216;217 %intermediate = alloca [8 x i8], align 64218 %init = load <8 x i8>, ptr %src, align 1219 store <8 x i8> %init, ptr %intermediate, align 64220 %intermediate.off0 = getelementptr inbounds i16, ptr %intermediate, i64 0221 %intermediate.off1 = getelementptr inbounds i16, ptr %intermediate, i64 2222 %intermediate.off.addr = select i1 %cond, ptr %intermediate.off0, ptr %intermediate.off1223 %intermediate.off.addr.var = getelementptr inbounds i16, ptr %intermediate.off.addr, i64 %byteOff224 %chunk = load <2 x i8>, ptr %intermediate.off.addr.var, align 1225 store <2 x i8> %chunk, ptr %dst226 ret void227}228 229define void @load_ptr_chunk_of_16byte_alloca(ptr %src, i64 %byteOff, ptr %dst) nounwind {230; CHECK-ALL-LABEL: @load_ptr_chunk_of_16byte_alloca(231; CHECK-ALL-NEXT: [[INTERMEDIATE:%.*]] = alloca [16 x i8], align 64232; CHECK-ALL-NEXT: [[INIT:%.*]] = load <16 x i8>, ptr [[SRC:%.*]], align 1233; CHECK-ALL-NEXT: store <16 x i8> [[INIT]], ptr [[INTERMEDIATE]], align 64234; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF_ADDR:%.*]] = getelementptr inbounds i8, ptr [[INTERMEDIATE]], i64 [[BYTEOFF:%.*]]235; CHECK-ALL-NEXT: [[CHUNK:%.*]] = load <1 x ptr>, ptr [[INTERMEDIATE_OFF_ADDR]], align 1236; CHECK-ALL-NEXT: store <1 x ptr> [[CHUNK]], ptr [[DST:%.*]], align 8237; CHECK-ALL-NEXT: ret void238;239 %intermediate = alloca [16 x i8], align 64240 %init = load <16 x i8>, ptr %src, align 1241 store <16 x i8> %init, ptr %intermediate, align 64242 %intermediate.off.addr = getelementptr inbounds i8, ptr %intermediate, i64 %byteOff243 %chunk = load <1 x ptr>, ptr %intermediate.off.addr, align 1244 store <1 x ptr> %chunk, ptr %dst245 ret void246}247 248define void @load_float_chunk_of_16byte_alloca(ptr %src, i64 %byteOff, ptr %dst) nounwind {249; CHECK-ALL-LABEL: @load_float_chunk_of_16byte_alloca(250; CHECK-ALL-NEXT: [[INTERMEDIATE:%.*]] = alloca [16 x i8], align 64251; CHECK-ALL-NEXT: [[INIT:%.*]] = load <16 x i8>, ptr [[SRC:%.*]], align 1252; CHECK-ALL-NEXT: store <16 x i8> [[INIT]], ptr [[INTERMEDIATE]], align 64253; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF_ADDR:%.*]] = getelementptr inbounds i8, ptr [[INTERMEDIATE]], i64 [[BYTEOFF:%.*]]254; CHECK-ALL-NEXT: [[CHUNK:%.*]] = load <1 x float>, ptr [[INTERMEDIATE_OFF_ADDR]], align 1255; CHECK-ALL-NEXT: store <1 x float> [[CHUNK]], ptr [[DST:%.*]], align 4256; CHECK-ALL-NEXT: ret void257;258 %intermediate = alloca [16 x i8], align 64259 %init = load <16 x i8>, ptr %src, align 1260 store <16 x i8> %init, ptr %intermediate, align 64261 %intermediate.off.addr = getelementptr inbounds i8, ptr %intermediate, i64 %byteOff262 %chunk = load <1 x float>, ptr %intermediate.off.addr, align 1263 store <1 x float> %chunk, ptr %dst264 ret void265}266 267define void @two_loads_of_same_2byte_chunks_of_8byte_alloca_with_2byte_step_variable_gep(ptr %src, i64 %byteOff, ptr %dst0, ptr %dst1) nounwind {268; CHECK-ALL-LABEL: @two_loads_of_same_2byte_chunks_of_8byte_alloca_with_2byte_step_variable_gep(269; CHECK-ALL-NEXT: [[INTERMEDIATE:%.*]] = alloca [8 x i8], align 64270; CHECK-ALL-NEXT: [[INIT:%.*]] = load <8 x i8>, ptr [[SRC:%.*]], align 1271; CHECK-ALL-NEXT: store <8 x i8> [[INIT]], ptr [[INTERMEDIATE]], align 64272; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE]], i64 [[BYTEOFF:%.*]]273; CHECK-ALL-NEXT: [[CHUNK0:%.*]] = load <2 x i8>, ptr [[INTERMEDIATE_OFF]], align 1274; CHECK-ALL-NEXT: store <2 x i8> [[CHUNK0]], ptr [[DST0:%.*]], align 2275; CHECK-ALL-NEXT: [[CHUNK1:%.*]] = load <2 x i8>, ptr [[INTERMEDIATE_OFF]], align 1276; CHECK-ALL-NEXT: store <2 x i8> [[CHUNK1]], ptr [[DST1:%.*]], align 2277; CHECK-ALL-NEXT: ret void278;279 %intermediate = alloca [8 x i8], align 64280 %init = load <8 x i8>, ptr %src, align 1281 store <8 x i8> %init, ptr %intermediate, align 64282 %intermediate.off = getelementptr inbounds i16, ptr %intermediate, i64 %byteOff283 %chunk0 = load <2 x i8>, ptr %intermediate.off, align 1284 store <2 x i8> %chunk0, ptr %dst0285 %chunk1 = load <2 x i8>, ptr %intermediate.off, align 1286 store <2 x i8> %chunk1, ptr %dst1287 ret void288}289 290define void @two_loads_of_two_2byte_chunks_of_8byte_alloca_with_2byte_step_variable_geps(ptr %src, i64 %byteOff0, i64 %byteOff1, ptr %dst0, ptr %dst1) nounwind {291; CHECK-ALL-LABEL: @two_loads_of_two_2byte_chunks_of_8byte_alloca_with_2byte_step_variable_geps(292; CHECK-ALL-NEXT: [[INTERMEDIATE:%.*]] = alloca [8 x i8], align 64293; CHECK-ALL-NEXT: [[INIT:%.*]] = load <8 x i8>, ptr [[SRC:%.*]], align 1294; CHECK-ALL-NEXT: store <8 x i8> [[INIT]], ptr [[INTERMEDIATE]], align 64295; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF0:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE]], i64 [[BYTEOFF0:%.*]]296; CHECK-ALL-NEXT: [[CHUNK0:%.*]] = load <2 x i8>, ptr [[INTERMEDIATE_OFF0]], align 1297; CHECK-ALL-NEXT: store <2 x i8> [[CHUNK0]], ptr [[DST0:%.*]], align 2298; CHECK-ALL-NEXT: [[INTERMEDIATE_OFF1:%.*]] = getelementptr inbounds i16, ptr [[INTERMEDIATE_OFF0]], i64 [[BYTEOFF1:%.*]]299; CHECK-ALL-NEXT: [[CHUNK1:%.*]] = load <2 x i8>, ptr [[INTERMEDIATE_OFF1]], align 1300; CHECK-ALL-NEXT: store <2 x i8> [[CHUNK1]], ptr [[DST1:%.*]], align 2301; CHECK-ALL-NEXT: ret void302;303 %intermediate = alloca [8 x i8], align 64304 %init = load <8 x i8>, ptr %src, align 1305 store <8 x i8> %init, ptr %intermediate, align 64306 %intermediate.off0 = getelementptr inbounds i16, ptr %intermediate, i64 %byteOff0307 %chunk0 = load <2 x i8>, ptr %intermediate.off0, align 1308 store <2 x i8> %chunk0, ptr %dst0309 %intermediate.off1 = getelementptr inbounds i16, ptr %intermediate.off0, i64 %byteOff1310 %chunk1 = load <2 x i8>, ptr %intermediate.off1, align 1311 store <2 x i8> %chunk1, ptr %dst1312 ret void313}314;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:315; CHECK-BE-32: {{.*}}316; CHECK-BE-64: {{.*}}317; CHECK-LE-32: {{.*}}318; CHECK-LE-64: {{.*}}319; CHECK-SCALAR: {{.*}}320; CHECK-SCALAR-32: {{.*}}321; CHECK-SCALAR-64: {{.*}}322