155 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -S -dxil-legalize -dxil-finalize-linkage -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s3 4define void @replace_int_memcpy_test() #0 {5; CHECK-LABEL: define void @replace_int_memcpy_test(6; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {7; CHECK-NEXT: [[TMP1:%.*]] = alloca [1 x i32], align 48; CHECK-NEXT: [[TMP2:%.*]] = alloca [1 x i32], align 49; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [1 x i32], ptr [[TMP1]], i32 0, i32 010; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[GEP]], align 411; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds [1 x i32], ptr [[TMP2]], i32 0, i32 012; CHECK-NEXT: store i32 [[TMP3]], ptr [[GEP1]], align 413; CHECK-NEXT: ret void14;15 %1 = alloca [1 x i32], align 416 %2 = alloca [1 x i32], align 417 call void @llvm.memcpy.p0.p0.i32(ptr nonnull align 4 dereferenceable(4) %2, ptr align 4 dereferenceable(4) %1, i32 4, i1 false)18 ret void19}20 21define void @replace_3int_memcpy_test() #0 {22; CHECK-LABEL: define void @replace_3int_memcpy_test(23; CHECK-SAME: ) #[[ATTR0]] {24; CHECK-NEXT: [[TMP1:%.*]] = alloca [3 x i32], align 425; CHECK-NEXT: [[TMP2:%.*]] = alloca [3 x i32], align 426; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [3 x i32], ptr [[TMP1]], i32 0, i32 027; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[GEP]], align 428; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds [3 x i32], ptr [[TMP2]], i32 0, i32 029; CHECK-NEXT: store i32 [[TMP3]], ptr [[GEP1]], align 430; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds [3 x i32], ptr [[TMP1]], i32 0, i32 131; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[GEP2]], align 432; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds [3 x i32], ptr [[TMP2]], i32 0, i32 133; CHECK-NEXT: store i32 [[TMP4]], ptr [[GEP3]], align 434; CHECK-NEXT: [[GEP4:%.*]] = getelementptr inbounds [3 x i32], ptr [[TMP1]], i32 0, i32 235; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[GEP4]], align 436; CHECK-NEXT: [[GEP5:%.*]] = getelementptr inbounds [3 x i32], ptr [[TMP2]], i32 0, i32 237; CHECK-NEXT: store i32 [[TMP5]], ptr [[GEP5]], align 438; CHECK-NEXT: ret void39;40 %1 = alloca [3 x i32], align 441 %2 = alloca [3 x i32], align 442 call void @llvm.memcpy.p0.p0.i32(ptr nonnull align 4 dereferenceable(12) %2, ptr align 4 dereferenceable(12) %1, i32 12, i1 false)43 ret void44}45 46define void @replace_mismatched_size_int_memcpy_test() #0 {47; CHECK-LABEL: define void @replace_mismatched_size_int_memcpy_test(48; CHECK-SAME: ) #[[ATTR0]] {49; CHECK-NEXT: [[TMP1:%.*]] = alloca [2 x i32], align 450; CHECK-NEXT: [[TMP2:%.*]] = alloca [3 x i32], align 451; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x i32], ptr [[TMP1]], i32 0, i32 052; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[GEP]], align 453; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds [3 x i32], ptr [[TMP2]], i32 0, i32 054; CHECK-NEXT: store i32 [[TMP3]], ptr [[GEP1]], align 455; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds [2 x i32], ptr [[TMP1]], i32 0, i32 156; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[GEP2]], align 457; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds [3 x i32], ptr [[TMP2]], i32 0, i32 158; CHECK-NEXT: store i32 [[TMP4]], ptr [[GEP3]], align 459; CHECK-NEXT: ret void60;61 %1 = alloca [2 x i32], align 462 %2 = alloca [3 x i32], align 463 call void @llvm.memcpy.p0.p0.i32(ptr nonnull align 4 dereferenceable(12) %2, ptr align 4 dereferenceable(8) %1, i32 8, i1 false)64 ret void65}66 67define void @replace_int16_memcpy_test() #0 {68; CHECK-LABEL: define void @replace_int16_memcpy_test(69; CHECK-SAME: ) #[[ATTR0]] {70; CHECK-NEXT: [[TMP1:%.*]] = alloca [2 x i16], align 271; CHECK-NEXT: [[TMP2:%.*]] = alloca [2 x i16], align 272; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x i16], ptr [[TMP1]], i32 0, i32 073; CHECK-NEXT: [[TMP3:%.*]] = load i16, ptr [[GEP]], align 274; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds [2 x i16], ptr [[TMP2]], i32 0, i32 075; CHECK-NEXT: store i16 [[TMP3]], ptr [[GEP1]], align 276; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds [2 x i16], ptr [[TMP1]], i32 0, i32 177; CHECK-NEXT: [[TMP4:%.*]] = load i16, ptr [[GEP2]], align 278; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds [2 x i16], ptr [[TMP2]], i32 0, i32 179; CHECK-NEXT: store i16 [[TMP4]], ptr [[GEP3]], align 280; CHECK-NEXT: ret void81;82 %1 = alloca [2 x i16], align 283 %2 = alloca [2 x i16], align 284 call void @llvm.memcpy.p0.p0.i32(ptr nonnull align 2 dereferenceable(4) %2, ptr align 2 dereferenceable(4) %1, i32 4, i1 false)85 ret void86}87 88define void @replace_float_memcpy_test() #0 {89; CHECK-LABEL: define void @replace_float_memcpy_test(90; CHECK-SAME: ) #[[ATTR0]] {91; CHECK-NEXT: [[TMP1:%.*]] = alloca [2 x float], align 492; CHECK-NEXT: [[TMP2:%.*]] = alloca [2 x float], align 493; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x float], ptr [[TMP1]], i32 0, i32 094; CHECK-NEXT: [[TMP3:%.*]] = load float, ptr [[GEP]], align 495; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds [2 x float], ptr [[TMP2]], i32 0, i32 096; CHECK-NEXT: store float [[TMP3]], ptr [[GEP1]], align 497; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds [2 x float], ptr [[TMP1]], i32 0, i32 198; CHECK-NEXT: [[TMP4:%.*]] = load float, ptr [[GEP2]], align 499; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds [2 x float], ptr [[TMP2]], i32 0, i32 1100; CHECK-NEXT: store float [[TMP4]], ptr [[GEP3]], align 4101; CHECK-NEXT: ret void102;103 %1 = alloca [2 x float], align 4104 %2 = alloca [2 x float], align 4105 call void @llvm.memcpy.p0.p0.i32(ptr nonnull align 4 dereferenceable(8) %2, ptr align 4 dereferenceable(8) %1, i32 8, i1 false)106 ret void107}108 109define void @replace_double_memcpy_test() #0 {110; CHECK-LABEL: define void @replace_double_memcpy_test(111; CHECK-SAME: ) #[[ATTR0]] {112; CHECK-NEXT: [[TMP1:%.*]] = alloca [2 x double], align 4113; CHECK-NEXT: [[TMP2:%.*]] = alloca [2 x double], align 4114; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x double], ptr [[TMP1]], i32 0, i32 0115; CHECK-NEXT: [[TMP3:%.*]] = load double, ptr [[GEP]], align 8116; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds [2 x double], ptr [[TMP2]], i32 0, i32 0117; CHECK-NEXT: store double [[TMP3]], ptr [[GEP1]], align 8118; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds [2 x double], ptr [[TMP1]], i32 0, i32 1119; CHECK-NEXT: [[TMP4:%.*]] = load double, ptr [[GEP2]], align 8120; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds [2 x double], ptr [[TMP2]], i32 0, i32 1121; CHECK-NEXT: store double [[TMP4]], ptr [[GEP3]], align 8122; CHECK-NEXT: ret void123;124 %1 = alloca [2 x double], align 4125 %2 = alloca [2 x double], align 4126 call void @llvm.memcpy.p0.p0.i32(ptr nonnull align 4 dereferenceable(8) %2, ptr align 4 dereferenceable(8) %1, i32 16, i1 false)127 ret void128}129 130define void @replace_half_memcpy_test() #0 {131; CHECK-LABEL: define void @replace_half_memcpy_test(132; CHECK-SAME: ) #[[ATTR0]] {133; CHECK-NEXT: [[TMP1:%.*]] = alloca [2 x half], align 2134; CHECK-NEXT: [[TMP2:%.*]] = alloca [2 x half], align 2135; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x half], ptr [[TMP1]], i32 0, i32 0136; CHECK-NEXT: [[TMP3:%.*]] = load half, ptr [[GEP]], align 2137; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds [2 x half], ptr [[TMP2]], i32 0, i32 0138; CHECK-NEXT: store half [[TMP3]], ptr [[GEP1]], align 2139; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds [2 x half], ptr [[TMP1]], i32 0, i32 1140; CHECK-NEXT: [[TMP4:%.*]] = load half, ptr [[GEP2]], align 2141; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds [2 x half], ptr [[TMP2]], i32 0, i32 1142; CHECK-NEXT: store half [[TMP4]], ptr [[GEP3]], align 2143; CHECK-NEXT: ret void144;145 %1 = alloca [2 x half], align 2146 %2 = alloca [2 x half], align 2147 call void @llvm.memcpy.p0.p0.i32(ptr nonnull align 2 dereferenceable(4) %2, ptr align 2 dereferenceable(4) %1, i32 4, i1 false)148 ret void149}150 151attributes #0 = {"hlsl.export"}152 153declare void @llvm.memcpy.p0.p2.i32(ptr noalias, ptr addrspace(2) noalias readonly, i32, i1)154declare void @llvm.memcpy.p0.p0.i32(ptr noalias, ptr noalias readonly, i32, i1)155