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