Skip to content

PHITransAddr: Avoid looking at constant use lists #134689

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
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
3 changes: 3 additions & 0 deletions llvm/lib/Analysis/PHITransAddr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,9 @@ Value *PHITransAddr::translateSubExpr(Value *V, BasicBlock *CurBB,

// Scan to see if we have this GEP available.
Value *APHIOp = GEPOps[0];
if (isa<ConstantData>(APHIOp))
return nullptr;

for (User *U : APHIOp->users()) {
if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(U))
if (GEPI->getType() == GEP->getType() &&
Expand Down
83 changes: 76 additions & 7 deletions llvm/test/Transforms/GVN/pr65447.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,98 @@
; RUN: opt -S -passes=gvn < %s | FileCheck %s

; Make sure deduplicated phi nodes are removed from the VN map.
define i64 @f() {
; CHECK-LABEL: define i64 @f() {
define i64 @f2(ptr %arg) {
; CHECK-LABEL: define i64 @f2(
; CHECK-SAME: ptr [[ARG:%.*]]) {
; CHECK-NEXT: BB:
; CHECK-NEXT: store i1 false, ptr [[ARG]], align 1
; CHECK-NEXT: br label [[BB2D:%.*]]
; CHECK: BB2a:
; CHECK-NEXT: br label [[BB2B:%.*]]
; CHECK: BB2b:
; CHECK-NEXT: br label [[BB2C:%.*]]
; CHECK: BB2c:
; CHECK-NEXT: [[AZ2:%.*]] = phi i1 [ true, [[BB2B]] ], [ [[AZ:%.*]], [[BB2D]] ]
; CHECK-NEXT: [[DOTPHI_TRANS_INSERT:%.*]] = sext i1 [[AZ2]] to i64
; CHECK-NEXT: [[GEP2_PHI_TRANS_INSERT:%.*]] = getelementptr i1, ptr [[ARG]], i64 [[DOTPHI_TRANS_INSERT]]
; CHECK-NEXT: [[L93_PRE:%.*]] = load i1, ptr [[GEP2_PHI_TRANS_INSERT]], align 1
; CHECK-NEXT: br label [[BB2D]]
; CHECK: BB2d:
; CHECK-NEXT: [[AZ]] = phi i1 [ [[AZ2]], [[BB2C]] ], [ false, [[BB:%.*]] ]
; CHECK-NEXT: [[L93:%.*]] = phi i1 [ [[L93_PRE]], [[BB2C]] ], [ false, [[BB]] ]
; CHECK-NEXT: [[TMP0:%.*]] = sext i1 [[AZ]] to i64
; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i1, ptr [[ARG]], i64 [[TMP0]]
; CHECK-NEXT: store i1 [[AZ]], ptr [[ARG]], align 2
; CHECK-NEXT: br i1 [[L93]], label [[BB2C]], label [[BB1E:%.*]]
; CHECK: BB1e:
; CHECK-NEXT: br i1 [[AZ]], label [[BB2F:%.*]], label [[BB4:%.*]]
; CHECK: BB2f:
; CHECK-NEXT: store i1 true, ptr [[ARG]], align 2
; CHECK-NEXT: br label [[BB2B]]
; CHECK: BB4:
; CHECK-NEXT: br label [[BB4]]
;
BB:
store i1 false, ptr %arg, align 1
br label %BB2d

BB2a: ; No predecessors!
br label %BB2b

BB2b: ; preds = %BB2f, %BB2a
br label %BB2c

BB2c: ; preds = %BB2d, %BB2b
%0 = phi i1 [ true, %BB2b ], [ %1, %BB2d ]
br label %BB2d

BB2d: ; preds = %BB2c, %BB
%1 = phi i1 [ %0, %BB2c ], [ false, %BB ]
%2 = sext i1 %1 to i64
%gep2 = getelementptr i1, ptr %arg, i64 %2
%L93 = load i1, ptr %gep2, align 1
%Az = load i1, ptr %arg, align 2
store i1 %1, ptr %arg, align 2
br i1 %L93, label %BB2c, label %BB1e

BB1e: ; preds = %BB2d
br i1 %Az, label %BB2f, label %BB4

BB2f: ; preds = %BB1e
store i1 true, ptr %arg, align 2
br label %BB2b

BB4: ; preds = %BB1e, %BB4
br label %BB4

; uselistorder directives
uselistorder label %BB4, { 1, 0 }
}

; Make sure deduplicated phi nodes are removed from the VN map. Make
; sure there is no assert on attempt to use ConstantData use lists.
define i64 @f_null() {
; CHECK-LABEL: define i64 @f_null() {
; CHECK-NEXT: BB:
; CHECK-NEXT: store i1 false, ptr null, align 1
; CHECK-NEXT: br label [[BB2D:%.*]]
; CHECK: BB2a:
; CHECK-NEXT: br label [[BB2B:%.*]]
; CHECK: BB2b:
; CHECK-NEXT: [[L93_PRE_PRE:%.*]] = load i1, ptr inttoptr (i64 -1 to ptr), align 1
; CHECK-NEXT: br label [[BB2C:%.*]]
; CHECK: BB2c:
; CHECK-NEXT: [[L93_PRE:%.*]] = phi i1 [ [[L93_PRE_PRE]], [[BB2B]] ], [ true, [[BB2D]] ]
; CHECK-NEXT: [[AZ2:%.*]] = phi i1 [ true, [[BB2B]] ], [ [[AZ:%.*]], [[BB2D]] ]
; CHECK-NEXT: [[DOTPHI_TRANS_INSERT:%.*]] = sext i1 [[AZ2]] to i64
; CHECK-NEXT: [[GEP2_PHI_TRANS_INSERT:%.*]] = getelementptr i1, ptr null, i64 [[DOTPHI_TRANS_INSERT]]
; CHECK-NEXT: [[L93_PRE:%.*]] = load i1, ptr [[GEP2_PHI_TRANS_INSERT]], align 1
; CHECK-NEXT: br label [[BB2D]]
; CHECK: BB2d:
; CHECK-NEXT: [[L93_PRE5:%.*]] = phi i1 [ [[L93_PRE]], [[BB2C]] ], [ false, [[BB:%.*]] ]
; CHECK-NEXT: [[AZ]] = phi i1 [ [[AZ2]], [[BB2C]] ], [ false, [[BB]] ]
; CHECK-NEXT: [[AZ]] = phi i1 [ [[AZ2]], [[BB2C]] ], [ false, [[BB:%.*]] ]
; CHECK-NEXT: [[L93:%.*]] = phi i1 [ [[L93_PRE]], [[BB2C]] ], [ false, [[BB]] ]
; CHECK-NEXT: [[TMP0:%.*]] = sext i1 [[AZ]] to i64
; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i1, ptr null, i64 [[TMP0]]
; CHECK-NEXT: store i1 [[AZ]], ptr null, align 2
; CHECK-NEXT: br i1 [[L93_PRE5]], label [[BB2C]], label [[BB1E:%.*]]
; CHECK-NEXT: br i1 [[L93]], label [[BB2C]], label [[BB1E:%.*]]
; CHECK: BB1e:
; CHECK-NEXT: br i1 [[AZ]], label [[BB2F:%.*]], label [[BB4:%.*]]
; CHECK: BB2f:
Expand Down
Loading