diff --git a/llvm/lib/Analysis/AliasAnalysis.cpp b/llvm/lib/Analysis/AliasAnalysis.cpp --- a/llvm/lib/Analysis/AliasAnalysis.cpp +++ b/llvm/lib/Analysis/AliasAnalysis.cpp @@ -697,6 +697,8 @@ return getModRefInfo((const AtomicRMWInst *)I, Loc, AAQIP); case Instruction::Call: return getModRefInfo((const CallInst *)I, Loc, AAQIP); + case Instruction::CallBr: + return getModRefInfo((const CallBrInst *)I, Loc, AAQIP); case Instruction::Invoke: return getModRefInfo((const InvokeInst *)I, Loc, AAQIP); case Instruction::CatchPad: @@ -704,6 +706,8 @@ case Instruction::CatchRet: return getModRefInfo((const CatchReturnInst *)I, Loc, AAQIP); default: + assert(!I->mayReadOrWriteMemory() && + "Unhandled memory access instruction!"); return ModRefInfo::NoModRef; } } diff --git a/llvm/test/Analysis/BasicAA/pr52735.ll b/llvm/test/Analysis/BasicAA/pr52735.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Analysis/BasicAA/pr52735.ll @@ -0,0 +1,29 @@ +; RUN: opt %s -basic-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s +; +; Generated from: +; +; int foo() { +; int v; +; asm goto("movl $1, %0" : "=m"(v)::: out); +; out: +; return v; +; } + +target triple = "x86_64-unknown-linux-gnu" + +; CHECK-DAG: MayAlias: i32* %v, void (i32*, i8*)* asm "movl $$1, $0", "=*m,X,~{dirflag},~{fpsr},~{flags}" + +define dso_local i32 @foo() { +entry: + %v = alloca i32, align 4 + %0 = bitcast i32* %v to i8* + callbr void asm "movl $$1, $0", "=*m,X,~{dirflag},~{fpsr},~{flags}"(i32* nonnull %v, i8* blockaddress(@foo, %out)) + to label %asm.fallthrough [label %out] + +asm.fallthrough: + br label %out + +out: + %1 = load i32, i32* %v, align 4 + ret i32 %1 +}