/// 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(...).
; 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) {
; 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
}