[AArch64] Regenerate fp16 tests.
[llvm-project.git] / llvm / test / CodeGen / PowerPC / memcpy_dereferenceable.ll
blob36d37f294ee734cda126805bc48985d1c4a41cc6
1 ; RUN: llc -verify-machineinstrs -mcpu=pwr8 -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s
3 ; This code causes an assertion failure if dereferenceable flag is not properly set in the load generated for memcpy
5 ; CHECK-LABEL: @func
6 ; CHECK: lxvd2x [[VREG:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}
7 ; CHECK-NOT: lxvd2x
8 ; CHECK: stxvd2x [[VREG:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}
9 ; CHECK: stxvd2x [[VREG:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}
10 ; CHECK: blr
12 define void @func(i1 %flag) {
13 entry:
14   %pairs = alloca [4 x <2 x i64>], align 8
15   %pair1 = getelementptr inbounds [4 x <2 x i64>], [4 x <2 x i64>]* %pairs, i64 0, i64 1
16   %pair2 = getelementptr inbounds [4 x <2 x i64>], [4 x <2 x i64>]* %pairs, i64 0, i64 2
17   %pvec1 = bitcast <2 x i64>* %pair1 to <2 x i64>*
18   %pvec2 = bitcast <2 x i64>* %pair2 to <2 x i64>*
19   %dst = bitcast [4 x <2 x i64>]* %pairs to i8*
20   %src = bitcast <2 x i64>* %pair2 to i8*
21   br i1 %flag, label %end, label %dummy
23 end:
24   ; copy third element into first element by memcpy
25   call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 nonnull %dst, i8* align 8 %src, i64 16, i1 false)
26   ; copy third element into second element by LD/ST
27   %vec2 = load <2 x i64>, <2 x i64>* %pvec2, align 8
28   store <2 x i64> %vec2, <2 x i64>* %pvec1, align 8
29   ret void
31 dummy:
32   ; to make use of %src in another BB
33   call void @llvm.memcpy.p0i8.p0i8.i64(i8* %src, i8* %src, i64 0, i1 false)
34   br label %end
38 ; CHECK-LABEL: @func2
39 ; CHECK: lxvd2x [[VREG:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}
40 ; CHECK-NOT: lxvd2x
41 ; CHECK: stxvd2x [[VREG:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}
42 ; CHECK: stxvd2x [[VREG:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}
43 ; CHECK: blr
45 define void @func2(i1 %flag) {
46 entry:
47   %pairs = alloca [4 x <2 x i64>], align 8
48   %pair1 = getelementptr inbounds [4 x <2 x i64>], [4 x <2 x i64>]* %pairs, i64 0, i64 1
49   %pair2 = getelementptr inbounds [4 x <2 x i64>], [4 x <2 x i64>]* %pairs, i64 0, i64 2
50   %pvec1 = bitcast <2 x i64>* %pair1 to <2 x i64>*
51   %pvec2 = bitcast <2 x i64>* %pair2 to <2 x i64>*
52   %dst = bitcast [4 x <2 x i64>]* %pairs to i8*
53   %src = bitcast <2 x i64>* %pair2 to i8*
54   br i1 %flag, label %end, label %dummy
56 end:
57   ; copy third element into first element by memcpy
58   call void @llvm.memmove.p0i8.p0i8.i64(i8* align 8 nonnull %dst, i8* align 8 %src, i64 16, i1 false)
59   ; copy third element into second element by LD/ST
60   %vec2 = load <2 x i64>, <2 x i64>* %pvec2, align 8
61   store <2 x i64> %vec2, <2 x i64>* %pvec1, align 8
62   ret void
64 dummy:
65   ; to make use of %src in another BB
66   call void @llvm.memcpy.p0i8.p0i8.i64(i8* %src, i8* %src, i64 0, i1 false)
67   br label %end
70 ; Function Attrs: argmemonly nounwind
71 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1) #1
72 declare void @llvm.memmove.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1) #1
74 attributes #1 = { argmemonly nounwind }