[llvm] e68b12c - [Inline] Don't add noalias metadata to inaccessiblememonly calls

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Sat Apr 17 05:56:21 PDT 2021


Author: Nikita Popov
Date: 2021-04-17T14:56:13+02:00
New Revision: e68b12c99eaf9cdfdf3e3e7c4533bb03b60afd36

URL: https://github.com/llvm/llvm-project/commit/e68b12c99eaf9cdfdf3e3e7c4533bb03b60afd36
DIFF: https://github.com/llvm/llvm-project/commit/e68b12c99eaf9cdfdf3e3e7c4533bb03b60afd36.diff

LOG: [Inline] Don't add noalias metadata to inaccessiblememonly calls

It will not do anything useful for them, as we already know that
they don't modref with any accessible memory.

In particular, this prevents noalias metadata from being placed
on noalias.scope.decl intrinsics. This reduces the amount of
metadata needed, and makes it more likely that unnecessary decls
can be eliminated.

Added: 
    

Modified: 
    llvm/lib/Transforms/Utils/InlineFunction.cpp
    llvm/test/Transforms/Inline/noalias-calls2.ll
    llvm/test/Transforms/Inline/noalias2.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp
index 60fc5b2e0a0d0..201e4e1c58daf 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 400bb1d6147cc..28450021afee0 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 c2c743605699f..58ef1cb88ce2c 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 }
 


        


More information about the llvm-commits mailing list