Skip to content

Commit 18f21c6

Browse files
committed
[InstCombine] Fix pointer replacement in foldSelectValueEquivalence
1 parent 3349520 commit 18f21c6

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "llvm/Analysis/AssumptionCache.h"
1818
#include "llvm/Analysis/CmpInstAnalysis.h"
1919
#include "llvm/Analysis/InstructionSimplify.h"
20+
#include "llvm/Analysis/Loads.h"
2021
#include "llvm/Analysis/OverflowInstAnalysis.h"
2122
#include "llvm/Analysis/ValueTracking.h"
2223
#include "llvm/Analysis/VectorUtils.h"
@@ -1411,6 +1412,8 @@ Instruction *InstCombinerImpl::foldSelectValueEquivalence(SelectInst &Sel,
14111412
// in the cmp and in f(Y).
14121413
if (TrueVal == OldOp && (isa<Constant>(OldOp) || !isa<Constant>(NewOp)))
14131414
return nullptr;
1415+
if (!canReplacePointersIfEqual(OldOp, NewOp, DL))
1416+
return nullptr;
14141417

14151418
if (Value *V = simplifyWithOpReplaced(TrueVal, OldOp, NewOp, SQ,
14161419
/* AllowRefinement=*/true)) {
@@ -1466,12 +1469,14 @@ Instruction *InstCombinerImpl::foldSelectValueEquivalence(SelectInst &Sel,
14661469
// Example:
14671470
// (X == 42) ? 43 : (X + 1) --> (X == 42) ? (X + 1) : (X + 1) --> X + 1
14681471
SmallVector<Instruction *> DropFlags;
1469-
if (simplifyWithOpReplaced(FalseVal, CmpLHS, CmpRHS, SQ,
1470-
/* AllowRefinement */ false,
1471-
&DropFlags) == TrueVal ||
1472-
simplifyWithOpReplaced(FalseVal, CmpRHS, CmpLHS, SQ,
1473-
/* AllowRefinement */ false,
1474-
&DropFlags) == TrueVal) {
1472+
if ((canReplacePointersIfEqual(CmpLHS, CmpRHS, DL) &&
1473+
simplifyWithOpReplaced(FalseVal, CmpLHS, CmpRHS, SQ,
1474+
/* AllowRefinement */ false,
1475+
&DropFlags) == TrueVal) ||
1476+
(canReplacePointersIfEqual(CmpRHS, CmpLHS, DL) &&
1477+
simplifyWithOpReplaced(FalseVal, CmpRHS, CmpLHS, SQ,
1478+
/* AllowRefinement */ false,
1479+
&DropFlags) == TrueVal)) {
14751480
for (Instruction *I : DropFlags) {
14761481
I->dropPoisonGeneratingAnnotations();
14771482
Worklist.add(I);

llvm/test/Transforms/InstCombine/select-gep.ll

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,10 @@ define <2 x ptr> @test7(<2 x ptr> %p1, i64 %idx, <2 x i1> %cc) {
290290
define ptr @ptr_eq_replace_freeze1(ptr %p, ptr %q) {
291291
; CHECK-LABEL: @ptr_eq_replace_freeze1(
292292
; CHECK-NEXT: [[Q_FR:%.*]] = freeze ptr [[Q:%.*]]
293-
; CHECK-NEXT: ret ptr [[Q_FR]]
293+
; CHECK-NEXT: [[Q_FR1:%.*]] = freeze ptr [[Q1:%.*]]
294+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[Q_FR]], [[Q_FR1]]
295+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], ptr [[Q_FR]], ptr [[Q_FR1]]
296+
; CHECK-NEXT: ret ptr [[SELECT]]
294297
;
295298
%p.fr = freeze ptr %p
296299
%q.fr = freeze ptr %q
@@ -302,7 +305,10 @@ define ptr @ptr_eq_replace_freeze1(ptr %p, ptr %q) {
302305
define ptr @ptr_eq_replace_freeze2(ptr %p, ptr %q) {
303306
; CHECK-LABEL: @ptr_eq_replace_freeze2(
304307
; CHECK-NEXT: [[P_FR:%.*]] = freeze ptr [[P:%.*]]
305-
; CHECK-NEXT: [[SELECT:%.*]] = getelementptr i8, ptr [[P_FR]], i64 16
308+
; CHECK-NEXT: [[P_FR1:%.*]] = freeze ptr [[P1:%.*]]
309+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[P_FR1]], [[P_FR]]
310+
; CHECK-NEXT: [[SELECT_V:%.*]] = select i1 [[CMP]], ptr [[P_FR1]], ptr [[P_FR]]
311+
; CHECK-NEXT: [[SELECT:%.*]] = getelementptr i8, ptr [[SELECT_V]], i64 16
306312
; CHECK-NEXT: ret ptr [[SELECT]]
307313
;
308314
%gep1 = getelementptr i32, ptr %p, i64 4

0 commit comments

Comments
 (0)