diff --git a/llvm/lib/Analysis/GlobalsModRef.cpp b/llvm/lib/Analysis/GlobalsModRef.cpp index 8338dcc9c1d2..549b37451eb3 100644 --- a/llvm/lib/Analysis/GlobalsModRef.cpp +++ b/llvm/lib/Analysis/GlobalsModRef.cpp @@ -243,13 +243,14 @@ FunctionModRefBehavior GlobalsAAResult::getModRefBehavior(ImmutableCallSite CS) { FunctionModRefBehavior Min = FMRB_UnknownModRefBehavior; - if (const Function *F = CS.getCalledFunction()) - if (FunctionInfo *FI = getFunctionInfo(F)) { - if (FI->getModRefInfo() == MRI_NoModRef) - Min = FMRB_DoesNotAccessMemory; - else if ((FI->getModRefInfo() & MRI_Mod) == 0) - Min = FMRB_OnlyReadsMemory; - } + if (!CS.hasOperandBundles()) + if (const Function *F = CS.getCalledFunction()) + if (FunctionInfo *FI = getFunctionInfo(F)) { + if (FI->getModRefInfo() == MRI_NoModRef) + Min = FMRB_DoesNotAccessMemory; + else if ((FI->getModRefInfo() & MRI_Mod) == 0) + Min = FMRB_OnlyReadsMemory; + } return FunctionModRefBehavior(AAResultBase::getModRefBehavior(CS) & Min); } diff --git a/llvm/test/Feature/OperandBundles/pr26510.ll b/llvm/test/Feature/OperandBundles/pr26510.ll new file mode 100644 index 000000000000..d1d60b473136 --- /dev/null +++ b/llvm/test/Feature/OperandBundles/pr26510.ll @@ -0,0 +1,27 @@ +; RUN: opt -S -globals-aa -functionattrs < %s | FileCheck %s +; RUN: opt -S -O3 < %s | FileCheck %s + +; Apart from checking for the direct cause of the bug, we also check +; if any problematic aliasing rules have accidentally snuck into -O3. +; +; Since the "abc" operand bundle is not a special operand bundle that +; LLVM knows about, all of the stores and loads in @test below have to +; stay. + +declare void @foo() readnone + +; CHECK-LABEL: define i8* @test(i8* %p) { +; CHECK: %a = alloca i8*, align 8 +; CHECK: store i8* %p, i8** %a, align 8 +; CHECK: call void @foo() [ "abc"(i8** %a) ] +; CHECK: %reload = load i8*, i8** %a, align 8 +; CHECK: ret i8* %reload +; CHECK: } + +define i8* @test(i8* %p) { + %a = alloca i8*, align 8 + store i8* %p, i8** %a, align 8 + call void @foo() ["abc" (i8** %a)] + %reload = load i8*, i8** %a, align 8 + ret i8* %reload +}