mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-25 13:20:57 +00:00
[CFLAA] Add missing break; note things are broken.
Thanks to Galina Kistanova for finding the missing break! When trying to make a test for this, I realized our logic for handling extractvalue/insertvalue/... is somewhat broken. This makes constructing a test-case for this missing break nontrivial. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304275 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6fbb8ed97d
commit
4e7dec8978
@ -210,6 +210,11 @@ template <typename CFLAA> class CFLGraphBuilder {
|
||||
|
||||
void addDerefEdge(Value *From, Value *To, bool IsRead) {
|
||||
assert(From != nullptr && To != nullptr);
|
||||
// FIXME: This is subtly broken, due to how we model some instructions
|
||||
// (e.g. extractvalue, extractelement) as loads. Since those take
|
||||
// non-pointer operands, we'll entirely skip adding edges for those.
|
||||
//
|
||||
// addAssignEdge seems to have a similar issue with insertvalue, etc.
|
||||
if (!From->getType()->isPointerTy() || !To->getType()->isPointerTy())
|
||||
return;
|
||||
addNode(From);
|
||||
@ -540,6 +545,7 @@ template <typename CFLAA> class CFLGraphBuilder {
|
||||
case Instruction::ExtractValue: {
|
||||
auto *Ptr = CE->getOperand(0);
|
||||
addLoadEdge(Ptr, CE);
|
||||
break;
|
||||
}
|
||||
case Instruction::ShuffleVector: {
|
||||
auto *From1 = CE->getOperand(0);
|
||||
|
18
test/Analysis/CFLAliasAnalysis/Andersen/struct.ll
Normal file
18
test/Analysis/CFLAliasAnalysis/Andersen/struct.ll
Normal file
@ -0,0 +1,18 @@
|
||||
; Ensures that our struct ops are sane.
|
||||
|
||||
; RUN: opt < %s -disable-basicaa -cfl-anders-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
|
||||
; RUN: opt < %s -aa-pipeline=cfl-anders-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
|
||||
|
||||
; Since we ignore non-pointer values, we effectively ignore extractvalue
|
||||
; instructions. This means that %c "doesn't exist" in test_structure's graph,
|
||||
; so we currently get MayAlias.
|
||||
; XFAIL: *
|
||||
|
||||
; CHECK-LABEL: Function: test_structure
|
||||
; CHECK: NoAlias: i64** %c, { i64**, i64** }* %a
|
||||
define void @test_structure() {
|
||||
%a = alloca {i64**, i64**}, align 8
|
||||
%b = load {i64**, i64**}, {i64**, i64**}* %a
|
||||
%c = extractvalue {i64**, i64**} %b, 0
|
||||
ret void
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user