llvm-project/llvm/test/CodeGen/DirectX/legalize-memcpy.ll

155 lines
8.0 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -S -dxil-legalize -dxil-finalize-linkage -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s
define void @replace_int_memcpy_test() #0 {
; CHECK-LABEL: define void @replace_int_memcpy_test(
; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: [[TMP1:%.*]] = alloca [1 x i32], align 4
; CHECK-NEXT: [[TMP2:%.*]] = alloca [1 x i32], align 4
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [1 x i32], ptr [[TMP1]], i32 0, i32 0
; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[GEP]], align 4
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds [1 x i32], ptr [[TMP2]], i32 0, i32 0
; CHECK-NEXT: store i32 [[TMP3]], ptr [[GEP1]], align 4
; CHECK-NEXT: ret void
;
%1 = alloca [1 x i32], align 4
%2 = alloca [1 x i32], align 4
call void @llvm.memcpy.p0.p0.i32(ptr nonnull align 4 dereferenceable(4) %2, ptr align 4 dereferenceable(4) %1, i32 4, i1 false)
ret void
}
define void @replace_3int_memcpy_test() #0 {
; CHECK-LABEL: define void @replace_3int_memcpy_test(
; CHECK-SAME: ) #[[ATTR0]] {
; CHECK-NEXT: [[TMP1:%.*]] = alloca [3 x i32], align 4
; CHECK-NEXT: [[TMP2:%.*]] = alloca [3 x i32], align 4
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [3 x i32], ptr [[TMP1]], i32 0, i32 0
; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[GEP]], align 4
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds [3 x i32], ptr [[TMP2]], i32 0, i32 0
; CHECK-NEXT: store i32 [[TMP3]], ptr [[GEP1]], align 4
; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds [3 x i32], ptr [[TMP1]], i32 0, i32 1
; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[GEP2]], align 4
; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds [3 x i32], ptr [[TMP2]], i32 0, i32 1
; CHECK-NEXT: store i32 [[TMP4]], ptr [[GEP3]], align 4
; CHECK-NEXT: [[GEP4:%.*]] = getelementptr inbounds [3 x i32], ptr [[TMP1]], i32 0, i32 2
; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[GEP4]], align 4
; CHECK-NEXT: [[GEP5:%.*]] = getelementptr inbounds [3 x i32], ptr [[TMP2]], i32 0, i32 2
; CHECK-NEXT: store i32 [[TMP5]], ptr [[GEP5]], align 4
; CHECK-NEXT: ret void
;
%1 = alloca [3 x i32], align 4
%2 = alloca [3 x i32], align 4
call void @llvm.memcpy.p0.p0.i32(ptr nonnull align 4 dereferenceable(12) %2, ptr align 4 dereferenceable(12) %1, i32 12, i1 false)
ret void
}
define void @replace_mismatched_size_int_memcpy_test() #0 {
; CHECK-LABEL: define void @replace_mismatched_size_int_memcpy_test(
; CHECK-SAME: ) #[[ATTR0]] {
; CHECK-NEXT: [[TMP1:%.*]] = alloca [2 x i32], align 4
; CHECK-NEXT: [[TMP2:%.*]] = alloca [3 x i32], align 4
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x i32], ptr [[TMP1]], i32 0, i32 0
; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[GEP]], align 4
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds [3 x i32], ptr [[TMP2]], i32 0, i32 0
; CHECK-NEXT: store i32 [[TMP3]], ptr [[GEP1]], align 4
; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds [2 x i32], ptr [[TMP1]], i32 0, i32 1
; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[GEP2]], align 4
; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds [3 x i32], ptr [[TMP2]], i32 0, i32 1
; CHECK-NEXT: store i32 [[TMP4]], ptr [[GEP3]], align 4
; CHECK-NEXT: ret void
;
%1 = alloca [2 x i32], align 4
%2 = alloca [3 x i32], align 4
call void @llvm.memcpy.p0.p0.i32(ptr nonnull align 4 dereferenceable(12) %2, ptr align 4 dereferenceable(8) %1, i32 8, i1 false)
ret void
}
define void @replace_int16_memcpy_test() #0 {
; CHECK-LABEL: define void @replace_int16_memcpy_test(
; CHECK-SAME: ) #[[ATTR0]] {
; CHECK-NEXT: [[TMP1:%.*]] = alloca [2 x i16], align 2
; CHECK-NEXT: [[TMP2:%.*]] = alloca [2 x i16], align 2
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x i16], ptr [[TMP1]], i32 0, i32 0
; CHECK-NEXT: [[TMP3:%.*]] = load i16, ptr [[GEP]], align 2
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds [2 x i16], ptr [[TMP2]], i32 0, i32 0
; CHECK-NEXT: store i16 [[TMP3]], ptr [[GEP1]], align 2
; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds [2 x i16], ptr [[TMP1]], i32 0, i32 1
; CHECK-NEXT: [[TMP4:%.*]] = load i16, ptr [[GEP2]], align 2
; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds [2 x i16], ptr [[TMP2]], i32 0, i32 1
; CHECK-NEXT: store i16 [[TMP4]], ptr [[GEP3]], align 2
; CHECK-NEXT: ret void
;
%1 = alloca [2 x i16], align 2
%2 = alloca [2 x i16], align 2
call void @llvm.memcpy.p0.p0.i32(ptr nonnull align 2 dereferenceable(4) %2, ptr align 2 dereferenceable(4) %1, i32 4, i1 false)
ret void
}
define void @replace_float_memcpy_test() #0 {
; CHECK-LABEL: define void @replace_float_memcpy_test(
; CHECK-SAME: ) #[[ATTR0]] {
; CHECK-NEXT: [[TMP1:%.*]] = alloca [2 x float], align 4
; CHECK-NEXT: [[TMP2:%.*]] = alloca [2 x float], align 4
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x float], ptr [[TMP1]], i32 0, i32 0
; CHECK-NEXT: [[TMP3:%.*]] = load float, ptr [[GEP]], align 4
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds [2 x float], ptr [[TMP2]], i32 0, i32 0
; CHECK-NEXT: store float [[TMP3]], ptr [[GEP1]], align 4
; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds [2 x float], ptr [[TMP1]], i32 0, i32 1
; CHECK-NEXT: [[TMP4:%.*]] = load float, ptr [[GEP2]], align 4
; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds [2 x float], ptr [[TMP2]], i32 0, i32 1
; CHECK-NEXT: store float [[TMP4]], ptr [[GEP3]], align 4
; CHECK-NEXT: ret void
;
%1 = alloca [2 x float], align 4
%2 = alloca [2 x float], align 4
call void @llvm.memcpy.p0.p0.i32(ptr nonnull align 4 dereferenceable(8) %2, ptr align 4 dereferenceable(8) %1, i32 8, i1 false)
ret void
}
define void @replace_double_memcpy_test() #0 {
; CHECK-LABEL: define void @replace_double_memcpy_test(
; CHECK-SAME: ) #[[ATTR0]] {
; CHECK-NEXT: [[TMP1:%.*]] = alloca [2 x double], align 4
; CHECK-NEXT: [[TMP2:%.*]] = alloca [2 x double], align 4
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x double], ptr [[TMP1]], i32 0, i32 0
; CHECK-NEXT: [[TMP3:%.*]] = load double, ptr [[GEP]], align 8
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds [2 x double], ptr [[TMP2]], i32 0, i32 0
; CHECK-NEXT: store double [[TMP3]], ptr [[GEP1]], align 8
; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds [2 x double], ptr [[TMP1]], i32 0, i32 1
; CHECK-NEXT: [[TMP4:%.*]] = load double, ptr [[GEP2]], align 8
; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds [2 x double], ptr [[TMP2]], i32 0, i32 1
; CHECK-NEXT: store double [[TMP4]], ptr [[GEP3]], align 8
; CHECK-NEXT: ret void
;
%1 = alloca [2 x double], align 4
%2 = alloca [2 x double], align 4
call void @llvm.memcpy.p0.p0.i32(ptr nonnull align 4 dereferenceable(8) %2, ptr align 4 dereferenceable(8) %1, i32 16, i1 false)
ret void
}
define void @replace_half_memcpy_test() #0 {
; CHECK-LABEL: define void @replace_half_memcpy_test(
; CHECK-SAME: ) #[[ATTR0]] {
; CHECK-NEXT: [[TMP1:%.*]] = alloca [2 x half], align 2
; CHECK-NEXT: [[TMP2:%.*]] = alloca [2 x half], align 2
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x half], ptr [[TMP1]], i32 0, i32 0
; CHECK-NEXT: [[TMP3:%.*]] = load half, ptr [[GEP]], align 2
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds [2 x half], ptr [[TMP2]], i32 0, i32 0
; CHECK-NEXT: store half [[TMP3]], ptr [[GEP1]], align 2
; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds [2 x half], ptr [[TMP1]], i32 0, i32 1
; CHECK-NEXT: [[TMP4:%.*]] = load half, ptr [[GEP2]], align 2
; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds [2 x half], ptr [[TMP2]], i32 0, i32 1
; CHECK-NEXT: store half [[TMP4]], ptr [[GEP3]], align 2
; CHECK-NEXT: ret void
;
%1 = alloca [2 x half], align 2
%2 = alloca [2 x half], align 2
call void @llvm.memcpy.p0.p0.i32(ptr nonnull align 2 dereferenceable(4) %2, ptr align 2 dereferenceable(4) %1, i32 4, i1 false)
ret void
}
attributes #0 = {"hlsl.export"}
declare void @llvm.memcpy.p0.p2.i32(ptr noalias, ptr addrspace(2) noalias readonly, i32, i1)
declare void @llvm.memcpy.p0.p0.i32(ptr noalias, ptr noalias readonly, i32, i1)