Skip to content

Commit 42f76e1

Browse files
committed
Reland [AlwaysInliner] Pass callee AAResults to InlineFunction()
Test copied from noalias-calls.ll with small changes. Reviewed By: asbirlea Differential Revision: https://reviews.llvm.org/D89609
1 parent e5766f2 commit 42f76e1

File tree

2 files changed

+82
-2
lines changed

2 files changed

+82
-2
lines changed

llvm/lib/Transforms/IPO/AlwaysInliner.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
#include "llvm/Transforms/IPO/AlwaysInliner.h"
1515
#include "llvm/ADT/SetVector.h"
16+
#include "llvm/Analysis/AliasAnalysis.h"
1617
#include "llvm/Analysis/AssumptionCache.h"
1718
#include "llvm/Analysis/InlineCost.h"
1819
#include "llvm/Analysis/ProfileSummaryInfo.h"
@@ -73,8 +74,8 @@ PreservedAnalyses AlwaysInlinerPass::run(Module &M,
7374
&FAM.getResult<BlockFrequencyAnalysis>(*(CB->getCaller())),
7475
&FAM.getResult<BlockFrequencyAnalysis>(F));
7576

76-
InlineResult Res =
77-
InlineFunction(*CB, IFI, /*CalleeAAR=*/nullptr, InsertLifetime);
77+
InlineResult Res = InlineFunction(
78+
*CB, IFI, &FAM.getResult<AAManager>(F), InsertLifetime);
7879
assert(Res.isSuccess() && "unexpected failure to inline");
7980
(void)Res;
8081
Changed = true;
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
; RUN: opt -aa-pipeline=basic-aa -passes=always-inline -enable-noalias-to-md-conversion -S < %s | FileCheck %s
2+
target 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"
3+
target triple = "x86_64-unknown-linux-gnu"
4+
5+
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i1) #0
6+
declare void @hey() #0
7+
8+
define void @hello(i8* noalias nocapture %a, i8* noalias nocapture readonly %c, i8* nocapture %b) #1 {
9+
entry:
10+
%l = alloca i8, i32 512, align 1
11+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %a, i8* align 16 %b, i64 16, i1 0)
12+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %b, i8* align 16 %c, i64 16, i1 0)
13+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %a, i8* align 16 %c, i64 16, i1 0)
14+
call void @hey()
15+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %l, i8* align 16 %c, i64 16, i1 0)
16+
ret void
17+
}
18+
19+
define void @foo(i8* nocapture %a, i8* nocapture readonly %c, i8* nocapture %b) #2 {
20+
entry:
21+
tail call void @hello(i8* %a, i8* %c, i8* %b)
22+
ret void
23+
}
24+
25+
define void @hello_cs(i8* nocapture %a, i8* nocapture readonly %c, i8* nocapture %b) #1 {
26+
entry:
27+
%l = alloca i8, i32 512, align 1
28+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %a, i8* align 16 %b, i64 16, i1 0)
29+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %b, i8* align 16 %c, i64 16, i1 0)
30+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %a, i8* align 16 %c, i64 16, i1 0)
31+
call void @hey()
32+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %l, i8* align 16 %c, i64 16, i1 0)
33+
ret void
34+
}
35+
36+
define void @foo_cs(i8* nocapture %a, i8* nocapture readonly %c, i8* nocapture %b) #2 {
37+
entry:
38+
tail call void @hello_cs(i8* noalias %a, i8* noalias %c, i8* %b)
39+
ret void
40+
}
41+
42+
; CHECK: define void @foo(i8* nocapture %a, i8* nocapture readonly %c, i8* nocapture %b)
43+
; CHECK: entry:
44+
; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %a, i8* align 16 %b, i64 16, i1 false) #4, !noalias !0
45+
; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %b, i8* align 16 %c, i64 16, i1 false) #4, !noalias !3
46+
; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %a, i8* align 16 %c, i64 16, i1 false) #4, !alias.scope !5
47+
; CHECK: call void @hey() #4, !noalias !5
48+
; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %{{.*}}, i8* align 16 %c, i64 16, i1 false) #4, !noalias !3
49+
; CHECK: ret void
50+
; CHECK: }
51+
52+
; CHECK: define void @foo_cs(i8* nocapture %a, i8* nocapture readonly %c, i8* nocapture %b)
53+
; CHECK: entry:
54+
; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %a, i8* align 16 %b, i64 16, i1 false) #4, !noalias !6
55+
; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %b, i8* align 16 %c, i64 16, i1 false) #4, !noalias !9
56+
; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %a, i8* align 16 %c, i64 16, i1 false) #4, !alias.scope !11
57+
; CHECK: call void @hey() #4, !noalias !11
58+
; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %{{.*}}, i8* align 16 %c, i64 16, i1 false) #4, !noalias !9
59+
; CHECK: ret void
60+
; CHECK: }
61+
62+
attributes #0 = { nounwind argmemonly willreturn }
63+
attributes #1 = { nounwind alwaysinline }
64+
attributes #2 = { nounwind uwtable }
65+
66+
; CHECK: !0 = !{!1}
67+
; CHECK: !1 = distinct !{!1, !2, !"hello: %c"}
68+
; CHECK: !2 = distinct !{!2, !"hello"}
69+
; CHECK: !3 = !{!4}
70+
; CHECK: !4 = distinct !{!4, !2, !"hello: %a"}
71+
; CHECK: !5 = !{!4, !1}
72+
73+
; CHECK: !6 = !{!7}
74+
; CHECK: !7 = distinct !{!7, !8, !"hello_cs: %c"}
75+
; CHECK: !8 = distinct !{!8, !"hello_cs"}
76+
; CHECK: !9 = !{!10}
77+
; CHECK: !10 = distinct !{!10, !8, !"hello_cs: %a"}
78+
; CHECK: !11 = !{!10, !7}
79+

0 commit comments

Comments
 (0)