summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Transforms/IPO/Attributor.cpp6
-rw-r--r--llvm/test/Transforms/FunctionAttrs/noalias_returned.ll15
2 files changed, 14 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp
index dff7011061a..05686921a65 100644
--- a/llvm/lib/Transforms/IPO/Attributor.cpp
+++ b/llvm/lib/Transforms/IPO/Attributor.cpp
@@ -1592,8 +1592,10 @@ struct AANoAliasCallSiteArgument final : AANoAliasImpl {
/// See AbstractAttribute::initialize(...).
void initialize(Attributor &A) override {
- // TODO: It isn't sound to initialize as the same with `AANoAliasImpl`
- // because `noalias` may not be valid in the current position.
+ // See callsite argument attribute and callee argument attribute.
+ ImmutableCallSite ICS(&getAnchorValue());
+ if (ICS.paramHasAttr(getArgNo(), Attribute::NoAlias))
+ indicateOptimisticFixpoint();
}
/// See AbstractAttribute::updateImpl(...).
diff --git a/llvm/test/Transforms/FunctionAttrs/noalias_returned.ll b/llvm/test/Transforms/FunctionAttrs/noalias_returned.ll
index d7c4eadb983..ce28ed3f29a 100644
--- a/llvm/test/Transforms/FunctionAttrs/noalias_returned.ll
+++ b/llvm/test/Transforms/FunctionAttrs/noalias_returned.ll
@@ -142,8 +142,7 @@ define i8* @test8(i32* %0) nounwind uwtable {
; TEST 9
; Simple Argument Test
define internal void @test9(i8* %a, i8* %b) {
-; FIXME: missing noalias
-; CHECK: define internal void @test9(i8* %a, i8* %b)
+; CHECK: define internal void @test9(i8* noalias %a, i8* %b)
ret void
}
define void @test9_helper(i8* %a, i8* %b) {
@@ -156,12 +155,18 @@ define void @test9_helper(i8* %a, i8* %b) {
; TEST 10
; Simple CallSite Test
-declare void @test10_helper(i8* %a)
+declare void @test10_helper_1(i8* %a)
+define void @test10_helper_2(i8* noalias %a) {
+ ret void
+}
define void @test10(i8* noalias %a) {
; CHECK: define void @test10(i8* noalias %a)
; FIXME: missing noalias
-; CHECK-NEXT: tail call void @test10_helper(i8* %a)
- tail call void @test10_helper(i8* %a)
+; CHECK-NEXT: tail call void @test10_helper_1(i8* %a)
+ tail call void @test10_helper_1(i8* %a)
+
+; CHECK-NEXT: tail call void @test10_helper_2(i8* noalias %a)
+ tail call void @test10_helper_2(i8* %a)
ret void
}
OpenPOWER on IntegriCloud