diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp index 60fc5b2e0a0d..201e4e1c58da 100644 --- a/llvm/lib/Transforms/Utils/InlineFunction.cpp +++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp @@ -1041,6 +1041,11 @@ static void AddAliasScopeMetadata(CallBase &CB, ValueToValueMapTy &VMap, IsFuncCall = true; if (CalleeAAR) { FunctionModRefBehavior MRB = CalleeAAR->getModRefBehavior(Call); + + // We'll retain this knowledge without additional metadata. + if (AAResults::onlyAccessesInaccessibleMem(MRB)) + continue; + if (AAResults::onlyAccessesArgPointees(MRB)) IsArgMemOnlyCall = true; } diff --git a/llvm/test/Transforms/Inline/noalias-calls2.ll b/llvm/test/Transforms/Inline/noalias-calls2.ll index 400bb1d6147c..28450021afee 100644 --- a/llvm/test/Transforms/Inline/noalias-calls2.ll +++ b/llvm/test/Transforms/Inline/noalias-calls2.ll @@ -29,10 +29,10 @@ define void @caller_equals_callee(i32* noalias %p0, i32* noalias %p1, i32 %cnt) ; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !8) ; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds i32, i32* [[ADD_PTR2]], i64 2 ; CHECK-NEXT: [[ADD_PTR1_I:%.*]] = getelementptr inbounds i32, i32* [[ADD_PTR3]], i64 2 -; CHECK-NEXT: tail call void @llvm.experimental.noalias.scope.decl(metadata !10), !noalias !13 -; CHECK-NEXT: tail call void @llvm.experimental.noalias.scope.decl(metadata !14), !noalias !13 -; CHECK-NEXT: store i32 10, i32* [[ADD_PTR_I]], align 4, !alias.scope !16, !noalias !17 -; CHECK-NEXT: store i32 20, i32* [[ADD_PTR1_I]], align 4, !alias.scope !17, !noalias !16 +; CHECK-NEXT: tail call void @llvm.experimental.noalias.scope.decl(metadata !10) +; CHECK-NEXT: tail call void @llvm.experimental.noalias.scope.decl(metadata !13) +; CHECK-NEXT: store i32 10, i32* [[ADD_PTR_I]], align 4, !alias.scope !15, !noalias !16 +; CHECK-NEXT: store i32 20, i32* [[ADD_PTR1_I]], align 4, !alias.scope !16, !noalias !15 ; CHECK-NEXT: store i32 11, i32* [[ADD_PTR2]], align 4, !alias.scope !5, !noalias !8 ; CHECK-NEXT: store i32 12, i32* [[P1]], align 4 ; CHECK-NEXT: br label [[IF_END]] @@ -71,32 +71,32 @@ define void @test01(i32* noalias %p0, i32* noalias %p1, i32 %cnt) { ; CHECK-NEXT: store i32 13, i32* [[P0]], align 4 ; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, i32* [[P0]], i64 1 ; CHECK-NEXT: [[ADD_PTR1:%.*]] = getelementptr inbounds i32, i32* [[P1]], i64 1 -; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !18) -; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !21) +; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !17) +; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !20) ; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds i32, i32* [[ADD_PTR]], i64 2 ; CHECK-NEXT: [[ADD_PTR1_I:%.*]] = getelementptr inbounds i32, i32* [[ADD_PTR1]], i64 2 -; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !23), !noalias !26 -; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !27), !noalias !26 -; CHECK-NEXT: store i32 10, i32* [[ADD_PTR_I]], align 4, !alias.scope !29, !noalias !30 -; CHECK-NEXT: store i32 20, i32* [[ADD_PTR1_I]], align 4, !alias.scope !30, !noalias !29 +; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !22) +; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !25) +; CHECK-NEXT: store i32 10, i32* [[ADD_PTR_I]], align 4, !alias.scope !27, !noalias !28 +; CHECK-NEXT: store i32 20, i32* [[ADD_PTR1_I]], align 4, !alias.scope !28, !noalias !27 ; CHECK-NEXT: [[CMP_I:%.*]] = icmp eq i32 [[CNT]], 0 ; CHECK-NEXT: br i1 [[CMP_I]], label [[IF_THEN_I:%.*]], label [[IF_ELSE_I:%.*]] ; CHECK: if.then.i: -; CHECK-NEXT: store i32 11, i32* [[ADD_PTR]], align 4, !alias.scope !18, !noalias !21 +; CHECK-NEXT: store i32 11, i32* [[ADD_PTR]], align 4, !alias.scope !17, !noalias !20 ; CHECK-NEXT: br label [[CALLER_EQUALS_CALLEE_EXIT:%.*]] ; CHECK: if.else.i: ; CHECK-NEXT: [[ADD_PTR2_I:%.*]] = getelementptr inbounds i32, i32* [[ADD_PTR1]], i64 1 ; CHECK-NEXT: [[ADD_PTR3_I:%.*]] = getelementptr inbounds i32, i32* [[ADD_PTR]], i64 1 -; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !31), !noalias !26 -; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !34), !noalias !26 +; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !29) +; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !32) ; CHECK-NEXT: [[ADD_PTR_I_I:%.*]] = getelementptr inbounds i32, i32* [[ADD_PTR2_I]], i64 2 ; CHECK-NEXT: [[ADD_PTR1_I_I:%.*]] = getelementptr inbounds i32, i32* [[ADD_PTR3_I]], i64 2 -; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !36), !noalias !39 -; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !40), !noalias !39 -; CHECK-NEXT: store i32 10, i32* [[ADD_PTR_I_I]], align 4, !alias.scope !42, !noalias !43 -; CHECK-NEXT: store i32 20, i32* [[ADD_PTR1_I_I]], align 4, !alias.scope !43, !noalias !42 -; CHECK-NEXT: store i32 11, i32* [[ADD_PTR2_I]], align 4, !alias.scope !44, !noalias !45 -; CHECK-NEXT: store i32 12, i32* [[ADD_PTR1]], align 4, !alias.scope !21, !noalias !18 +; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !34) +; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !37) +; CHECK-NEXT: store i32 10, i32* [[ADD_PTR_I_I]], align 4, !alias.scope !39, !noalias !40 +; CHECK-NEXT: store i32 20, i32* [[ADD_PTR1_I_I]], align 4, !alias.scope !40, !noalias !39 +; CHECK-NEXT: store i32 11, i32* [[ADD_PTR2_I]], align 4, !alias.scope !41, !noalias !42 +; CHECK-NEXT: store i32 12, i32* [[ADD_PTR1]], align 4, !alias.scope !20, !noalias !17 ; CHECK-NEXT: br label [[CALLER_EQUALS_CALLEE_EXIT]] ; CHECK: caller_equals_callee.exit: ; CHECK-NEXT: ret void @@ -130,37 +130,33 @@ attributes #0 = { inaccessiblememonly nofree nosync nounwind willreturn } ; CHECK: !10 = !{!11} ; CHECK: !11 = distinct !{!11, !12, !"do_store: %p0"} ; CHECK: !12 = distinct !{!12, !"do_store"} -; CHECK: !13 = !{!6, !9} -; CHECK: !14 = !{!15} -; CHECK: !15 = distinct !{!15, !12, !"do_store: %p1"} -; CHECK: !16 = !{!11, !6} -; CHECK: !17 = !{!15, !9} - -; CHECK: !18 = !{!19} -; CHECK: !19 = distinct !{!19, !20, !"caller_equals_callee: %p0"} -; CHECK: !20 = distinct !{!20, !"caller_equals_callee"} -; CHECK: !21 = !{!22} -; CHECK: !22 = distinct !{!22, !20, !"caller_equals_callee: %p1"} -; CHECK: !23 = !{!24} -; CHECK: !24 = distinct !{!24, !25, !"do_store: %p0"} -; CHECK: !25 = distinct !{!25, !"do_store"} -; CHECK: !26 = !{!19, !22} -; CHECK: !27 = !{!28} -; CHECK: !28 = distinct !{!28, !25, !"do_store: %p1"} -; CHECK: !29 = !{!24, !19} -; CHECK: !30 = !{!28, !22} -; CHECK: !31 = !{!32} -; CHECK: !32 = distinct !{!32, !33, !"caller_equals_callee: %p0"} -; CHECK: !33 = distinct !{!33, !"caller_equals_callee"} +; CHECK: !13 = !{!14} +; CHECK: !14 = distinct !{!14, !12, !"do_store: %p1"} +; CHECK: !15 = !{!11, !6} +; CHECK: !16 = !{!14, !9} +; CHECK: !17 = !{!18} +; CHECK: !18 = distinct !{!18, !19, !"caller_equals_callee: %p0"} +; CHECK: !19 = distinct !{!19, !"caller_equals_callee"} +; CHECK: !20 = !{!21} +; CHECK: !21 = distinct !{!21, !19, !"caller_equals_callee: %p1"} +; CHECK: !22 = !{!23} +; CHECK: !23 = distinct !{!23, !24, !"do_store: %p0"} +; CHECK: !24 = distinct !{!24, !"do_store"} +; CHECK: !25 = !{!26} +; CHECK: !26 = distinct !{!26, !24, !"do_store: %p1"} +; CHECK: !27 = !{!23, !18} +; CHECK: !28 = !{!26, !21} +; CHECK: !29 = !{!30} +; CHECK: !30 = distinct !{!30, !31, !"caller_equals_callee: %p0"} +; CHECK: !31 = distinct !{!31, !"caller_equals_callee"} +; CHECK: !32 = !{!33} +; CHECK: !33 = distinct !{!33, !31, !"caller_equals_callee: %p1"} ; CHECK: !34 = !{!35} -; CHECK: !35 = distinct !{!35, !33, !"caller_equals_callee: %p1"} -; CHECK: !36 = !{!37} -; CHECK: !37 = distinct !{!37, !38, !"do_store: %p0"} -; CHECK: !38 = distinct !{!38, !"do_store"} -; CHECK: !39 = !{!32, !35, !19, !22} -; CHECK: !40 = !{!41} -; CHECK: !41 = distinct !{!41, !38, !"do_store: %p1"} -; CHECK: !42 = !{!37, !32, !22} -; CHECK: !43 = !{!41, !35, !19} -; CHECK: !44 = !{!32, !22} -; CHECK: !45 = !{!35, !19} +; CHECK: !35 = distinct !{!35, !36, !"do_store: %p0"} +; CHECK: !36 = distinct !{!36, !"do_store"} +; CHECK: !37 = !{!38} +; CHECK: !38 = distinct !{!38, !36, !"do_store: %p1"} +; CHECK: !39 = !{!35, !30, !21} +; CHECK: !40 = !{!38, !33, !18} +; CHECK: !41 = !{!30, !21} +; CHECK: !42 = !{!33, !18} diff --git a/llvm/test/Transforms/Inline/noalias2.ll b/llvm/test/Transforms/Inline/noalias2.ll index c2c743605699..58ef1cb88ce2 100644 --- a/llvm/test/Transforms/Inline/noalias2.ll +++ b/llvm/test/Transforms/Inline/noalias2.ll @@ -71,21 +71,21 @@ define void @foo2(float* nocapture %a, float* nocapture %b, float* nocapture rea ; CHECK-NEXT: entry: ; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !5) ; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !8) -; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !10) [[ATTR2:#.*]], !noalias !13 -; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !14) [[ATTR2]], !noalias !13 -; CHECK-NEXT: [[TMP0:%.*]] = load float, float* [[C]], align 4, !alias.scope !16, !noalias !17 +; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !10) [[ATTR2:#.*]] +; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !13) [[ATTR2]] +; CHECK-NEXT: [[TMP0:%.*]] = load float, float* [[C]], align 4, !alias.scope !15, !noalias !16 ; CHECK-NEXT: [[ARRAYIDX_I_I:%.*]] = getelementptr inbounds float, float* [[A]], i64 5 -; CHECK-NEXT: store float [[TMP0]], float* [[ARRAYIDX_I_I]], align 4, !alias.scope !17, !noalias !16 +; CHECK-NEXT: store float [[TMP0]], float* [[ARRAYIDX_I_I]], align 4, !alias.scope !16, !noalias !15 ; CHECK-NEXT: [[TMP1:%.*]] = load float, float* [[C]], align 4, !alias.scope !8, !noalias !5 ; CHECK-NEXT: [[ARRAYIDX_I:%.*]] = getelementptr inbounds float, float* [[A]], i64 7 ; CHECK-NEXT: store float [[TMP1]], float* [[ARRAYIDX_I]], align 4, !alias.scope !5, !noalias !8 -; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !18) -; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !21) -; CHECK-NEXT: [[TMP2:%.*]] = load float, float* [[C]], align 4, !noalias !23 +; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !17) +; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata !20) +; CHECK-NEXT: [[TMP2:%.*]] = load float, float* [[C]], align 4, !noalias !22 ; CHECK-NEXT: [[ARRAYIDX_I1:%.*]] = getelementptr inbounds float, float* [[A]], i64 6 -; CHECK-NEXT: store float [[TMP2]], float* [[ARRAYIDX_I1]], align 4, !alias.scope !18, !noalias !21 +; CHECK-NEXT: store float [[TMP2]], float* [[ARRAYIDX_I1]], align 4, !alias.scope !17, !noalias !20 ; CHECK-NEXT: [[ARRAYIDX1_I:%.*]] = getelementptr inbounds float, float* [[B]], i64 8 -; CHECK-NEXT: store float [[TMP2]], float* [[ARRAYIDX1_I]], align 4, !alias.scope !21, !noalias !18 +; CHECK-NEXT: store float [[TMP2]], float* [[ARRAYIDX1_I]], align 4, !alias.scope !20, !noalias !17 ; CHECK-NEXT: [[TMP3:%.*]] = load float, float* [[C]], align 4 ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, float* [[A]], i64 7 ; CHECK-NEXT: store float [[TMP3]], float* [[ARRAYIDX]], align 4 @@ -113,17 +113,16 @@ entry: ; CHECK: !10 = !{!11} ; CHECK: !11 = distinct !{!11, !12, !"hello: %a"} ; CHECK: !12 = distinct !{!12, !"hello"} -; CHECK: !13 = !{!6, !9} -; CHECK: !14 = !{!15} -; CHECK: !15 = distinct !{!15, !12, !"hello: %c"} -; CHECK: !16 = !{!15, !9} -; CHECK: !17 = !{!11, !6} -; CHECK: !18 = !{!19} -; CHECK: !19 = distinct !{!19, !20, !"hello2: %a"} -; CHECK: !20 = distinct !{!20, !"hello2"} -; CHECK: !21 = !{!22} -; CHECK: !22 = distinct !{!22, !20, !"hello2: %b"} -; CHECK: !23 = !{!19, !22} +; CHECK: !13 = !{!14} +; CHECK: !14 = distinct !{!14, !12, !"hello: %c"} +; CHECK: !15 = !{!14, !9} +; CHECK: !16 = !{!11, !6} +; CHECK: !17 = !{!18} +; CHECK: !18 = distinct !{!18, !19, !"hello2: %a"} +; CHECK: !19 = distinct !{!19, !"hello2"} +; CHECK: !20 = !{!21} +; CHECK: !21 = distinct !{!21, !19, !"hello2: %b"} +; CHECK: !22 = !{!18, !21} attributes #0 = { nounwind uwtable }