xref: /llvm-project/llvm/test/Transforms/Inline/noalias.ll (revision 29441e4f5fa5f5c7709f7cf180815ba97f611297)
1; RUN: opt -passes=inline -enable-noalias-to-md-conversion -S < %s | FileCheck %s
2target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
3target triple = "x86_64-unknown-linux-gnu"
4
5define void @hello(ptr noalias nocapture %a, ptr nocapture readonly %c) #0 {
6entry:
7  %0 = load float, ptr %c, align 4
8  %arrayidx = getelementptr inbounds float, ptr %a, i64 5
9  store float %0, ptr %arrayidx, align 4
10  ret void
11}
12
13define void @foo(ptr nocapture %a, ptr nocapture readonly %c) #0 {
14entry:
15  tail call void @hello(ptr %a, ptr %c)
16  %0 = load float, ptr %c, align 4
17  %arrayidx = getelementptr inbounds float, ptr %a, i64 7
18  store float %0, ptr %arrayidx, align 4
19  ret void
20}
21
22; CHECK-LABEL: define void @foo(ptr captures(none) %a, ptr readonly captures(none) %c) #0 {
23; CHECK: entry:
24; CHECK:   call void @llvm.experimental.noalias.scope.decl
25; CHECK:   [[TMP0:%.+]] = load float, ptr %c, align 4, !noalias !0
26; CHECK:   %arrayidx.i = getelementptr inbounds float, ptr %a, i64 5
27; CHECK:   store float [[TMP0]], ptr %arrayidx.i, align 4, !alias.scope !0
28; CHECK:   [[TMP1:%.+]] = load float, ptr %c, align 4
29; CHECK:   %arrayidx = getelementptr inbounds float, ptr %a, i64 7
30; CHECK:   store float [[TMP1]], ptr %arrayidx, align 4
31; CHECK:   ret void
32; CHECK: }
33
34define void @hello2(ptr noalias nocapture %a, ptr noalias nocapture %b, ptr nocapture readonly %c) #0 {
35entry:
36  %0 = load float, ptr %c, align 4
37  %arrayidx = getelementptr inbounds float, ptr %a, i64 5
38  store float %0, ptr %arrayidx, align 4
39  %arrayidx1 = getelementptr inbounds float, ptr %b, i64 8
40  store float %0, ptr %arrayidx1, align 4
41  ret void
42}
43
44define void @foo2(ptr nocapture %a, ptr nocapture %b, ptr nocapture readonly %c) #0 {
45entry:
46  tail call void @hello2(ptr %a, ptr %b, ptr %c)
47  %0 = load float, ptr %c, align 4
48  %arrayidx = getelementptr inbounds float, ptr %a, i64 7
49  store float %0, ptr %arrayidx, align 4
50  ret void
51}
52
53; CHECK-LABEL: define void @foo2(ptr captures(none) %a, ptr captures(none) %b, ptr readonly captures(none) %c) #0 {
54; CHECK: entry:
55; CHECK:   call void @llvm.experimental.noalias.scope.decl(metadata !3)
56; CHECK:   call void @llvm.experimental.noalias.scope.decl(metadata !6)
57; CHECK:   [[TMP0:%.+]] = load float, ptr %c, align 4, !noalias !8
58; CHECK:   %arrayidx.i = getelementptr inbounds float, ptr %a, i64 5
59; CHECK:   store float [[TMP0]], ptr %arrayidx.i, align 4, !alias.scope !3, !noalias !6
60; CHECK:   %arrayidx1.i = getelementptr inbounds float, ptr %b, i64 8
61; CHECK:   store float [[TMP0]], ptr %arrayidx1.i, align 4, !alias.scope !6, !noalias !3
62; CHECK:   [[TMP1:%.+]] = load float, ptr %c, align 4
63; CHECK:   %arrayidx = getelementptr inbounds float, ptr %a, i64 7
64; CHECK:   store float [[TMP1]], ptr %arrayidx, align 4
65; CHECK:   ret void
66; CHECK: }
67
68attributes #0 = { nounwind uwtable }
69
70; CHECK: !0 = !{!1}
71; CHECK: !1 = distinct !{!1, !2, !"hello: %a"}
72; CHECK: !2 = distinct !{!2, !"hello"}
73; CHECK: !3 = !{!4}
74; CHECK: !4 = distinct !{!4, !5, !"hello2: %a"}
75; CHECK: !5 = distinct !{!5, !"hello2"}
76; CHECK: !6 = !{!7}
77; CHECK: !7 = distinct !{!7, !5, !"hello2: %b"}
78; CHECK: !8 = !{!4, !7}
79