diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp index a27cb4dd219c3..aa5e04d71657a 100644 --- a/llvm/lib/Transforms/Utils/InlineFunction.cpp +++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp @@ -1465,7 +1465,7 @@ static void AddParamAndFnBasicAttributes(const CallBase &CB, } } AL = AL.addParamAttributes(Context, I, NewAB); - } else { + } else if (NewInnerCB->getArgOperand(I)->getType()->isPointerTy()) { // Check if the underlying value for the parameter is an argument. const Value *UnderlyingV = getUnderlyingObject(InnerCB->getArgOperand(I)); @@ -1473,10 +1473,13 @@ static void AddParamAndFnBasicAttributes(const CallBase &CB, if (!Arg) continue; ArgNo = Arg->getArgNo(); + } else { + continue; } // If so, propagate its access attributes. AL = AL.addParamAttributes(Context, I, ValidObjParamAttrs[ArgNo]); + // We can have conflicting attributes from the inner callsite and // to-be-inlined callsite. In that case, choose the most // restrictive. diff --git a/llvm/test/Transforms/Inline/arg-attr-propagation.ll b/llvm/test/Transforms/Inline/arg-attr-propagation.ll index 7b096539e7e1b..fad6c7ced2edd 100644 --- a/llvm/test/Transforms/Inline/arg-attr-propagation.ll +++ b/llvm/test/Transforms/Inline/arg-attr-propagation.ll @@ -76,3 +76,29 @@ define i32 @caller3(ptr dereferenceable(33) %t1) { ret i32 %t2 } +; Make sure that we don't propagate a pointer-only attribute to a vector of pointers. + +declare void @helper4(<4 x ptr> %ptr) + +define void @callee4(ptr readonly %ptr, <4 x i64> %idx) { +; CHECK-LABEL: define {{[^@]+}}@callee4 +; CHECK-SAME: (ptr readonly [[PTR:%.*]], <4 x i64> [[IDX:%.*]]) { +; CHECK-NEXT: [[PTRS:%.*]] = getelementptr inbounds i8, ptr [[PTR]], <4 x i64> [[IDX]] +; CHECK-NEXT: call void @helper4(<4 x ptr> [[PTRS]]) +; CHECK-NEXT: ret void +; + %ptrs = getelementptr inbounds i8, ptr %ptr, <4 x i64> %idx + call void @helper4(<4 x ptr> %ptrs) + ret void +} + +define void @caller4(ptr readonly %ptr, <4 x i64> %idx) { +; CHECK-LABEL: define {{[^@]+}}@caller4 +; CHECK-SAME: (ptr readonly [[PTR:%.*]], <4 x i64> [[IDX:%.*]]) { +; CHECK-NEXT: [[PTRS_I:%.*]] = getelementptr inbounds i8, ptr [[PTR]], <4 x i64> [[IDX]] +; CHECK-NEXT: call void @helper4(<4 x ptr> [[PTRS_I]]) +; CHECK-NEXT: ret void +; + call void @callee4(ptr readonly %ptr, <4 x i64> %idx) + ret void +}