Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions llvm/include/llvm/Analysis/AliasAnalysis.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,15 @@ class AliasResult {

operator Kind() const { return static_cast<Kind>(Alias); }

bool operator==(const AliasResult &Other) const {
return Alias == Other.Alias && HasOffset == Other.HasOffset &&
Offset == Other.Offset;
}
bool operator!=(const AliasResult &Other) const { return !(*this == Other); }

bool operator==(Kind K) const { return Alias == K; }
bool operator!=(Kind K) const { return !(*this == K); }

constexpr bool hasOffset() const { return HasOffset; }
constexpr int32_t getOffset() const {
assert(HasOffset && "No offset!");
Expand Down
41 changes: 41 additions & 0 deletions llvm/test/Transforms/GVN/pr63019.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
; RUN: opt -S -passes=gvn < %s | FileCheck %s

; Make sure the two offsets from the phi don't get merged incorrectly.
define i8 @test(i1 %c, i64 %offset, ptr %ptr) {
; CHECK-LABEL: define i8 @test
; CHECK-SAME: (i1 [[C:%.*]], i64 [[OFFSET:%.*]], ptr [[PTR:%.*]]) {
; CHECK-NEXT: start:
; CHECK-NEXT: [[ALLOCA:%.*]] = alloca [8 x i8], align 8
; CHECK-NEXT: store i64 1234605616436508552, ptr [[ALLOCA]], align 8
; CHECK-NEXT: [[GEP_2:%.*]] = getelementptr i8, ptr [[ALLOCA]], i64 2
; CHECK-NEXT: [[GEP_UNKNOWN:%.*]] = getelementptr i8, ptr [[ALLOCA]], i64 [[OFFSET]]
; CHECK-NEXT: br i1 [[C]], label [[JOIN:%.*]], label [[IF:%.*]]
; CHECK: if:
; CHECK-NEXT: br label [[JOIN]]
; CHECK: join:
; CHECK-NEXT: [[PHI:%.*]] = phi ptr [ [[GEP_UNKNOWN]], [[START:%.*]] ], [ [[GEP_2]], [[IF]] ]
; CHECK-NEXT: store i8 0, ptr [[ALLOCA]], align 8
; CHECK-NEXT: [[LOAD1:%.*]] = load i64, ptr [[ALLOCA]], align 8
; CHECK-NEXT: store i64 [[LOAD1]], ptr [[PTR]], align 8
; CHECK-NEXT: [[LOAD2:%.*]] = load i8, ptr [[PHI]], align 1
; CHECK-NEXT: ret i8 [[LOAD2]]
;
start:
%alloca = alloca [8 x i8], align 8
store i64 u0x1122334455667788, ptr %alloca, align 8
%gep.2 = getelementptr i8, ptr %alloca, i64 2
%gep.unknown = getelementptr i8, ptr %alloca, i64 %offset
br i1 %c, label %join, label %if

if:
br label %join

join:
%phi = phi ptr [ %gep.unknown, %start ], [ %gep.2, %if ]
store i8 0, ptr %alloca, align 8
%load1 = load i64, ptr %alloca, align 8
store i64 %load1, ptr %ptr, align 8
%load2 = load i8, ptr %phi, align 1
ret i8 %load2
}