From d09b521624f263b5f1296f8d4771836b97e600cb Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Sun, 2 Feb 2025 14:50:59 +0800 Subject: [PATCH 1/3] [InstSimplify] Add pre-commit tests. NFC. --- .../Transforms/InstSimplify/select-icmp.ll | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/llvm/test/Transforms/InstSimplify/select-icmp.ll b/llvm/test/Transforms/InstSimplify/select-icmp.ll index a6ef937760a58..9e738b3b21117 100755 --- a/llvm/test/Transforms/InstSimplify/select-icmp.ll +++ b/llvm/test/Transforms/InstSimplify/select-icmp.ll @@ -244,3 +244,21 @@ cond.true: ; preds = %entry cond.end: ; preds = %entry, %cond.true ret i8 0 } + +define ptr @icmp_ptr_eq_replace(ptr %a, ptr %b) { +; CHECK-LABEL: @icmp_ptr_eq_replace( +; CHECK-NEXT: ret ptr [[B:%.*]] +; + %cmp = icmp eq ptr %a, %b + %sel = select i1 %cmp, ptr %a, ptr %b + ret ptr %sel +} + +define ptr @icmp_ptr_eq_replace_null(ptr %a) { +; CHECK-LABEL: @icmp_ptr_eq_replace_null( +; CHECK-NEXT: ret ptr [[A:%.*]] +; + %cmp = icmp eq ptr %a, null + %sel = select i1 %cmp, ptr null, ptr %a + ret ptr %sel +} From e437ba2cb83bb965e13ef00727671896f03ff84f Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Sun, 2 Feb 2025 14:52:44 +0800 Subject: [PATCH 2/3] [InstSimplify] Add additional checks when substituting pointers --- llvm/lib/Analysis/InstructionSimplify.cpp | 17 +++++++++++------ .../test/Transforms/InstSimplify/select-icmp.ll | 4 +++- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 21c937530cd86..3cbc4107433ef 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -27,6 +27,7 @@ #include "llvm/Analysis/CmpInstAnalysis.h" #include "llvm/Analysis/ConstantFolding.h" #include "llvm/Analysis/InstSimplifyFolder.h" +#include "llvm/Analysis/Loads.h" #include "llvm/Analysis/LoopAnalysisManager.h" #include "llvm/Analysis/MemoryBuiltins.h" #include "llvm/Analysis/OverflowInstAnalysis.h" @@ -4731,12 +4732,16 @@ static Value *simplifySelectWithICmpCond(Value *CondVal, Value *TrueVal, // the arms of the select. See if substituting this value into the arm and // simplifying the result yields the same value as the other arm. if (Pred == ICmpInst::ICMP_EQ) { - if (Value *V = simplifySelectWithEquivalence({{CmpLHS, CmpRHS}}, TrueVal, - FalseVal, Q, MaxRecurse)) - return V; - if (Value *V = simplifySelectWithEquivalence({{CmpRHS, CmpLHS}}, TrueVal, - FalseVal, Q, MaxRecurse)) - return V; + if (CmpLHS->getType()->isIntOrIntVectorTy() || + canReplacePointersIfEqual(CmpLHS, CmpRHS, Q.DL)) + if (Value *V = simplifySelectWithEquivalence({{CmpLHS, CmpRHS}}, TrueVal, + FalseVal, Q, MaxRecurse)) + return V; + if (CmpLHS->getType()->isIntOrIntVectorTy() || + canReplacePointersIfEqual(CmpRHS, CmpLHS, Q.DL)) + if (Value *V = simplifySelectWithEquivalence({{CmpRHS, CmpLHS}}, TrueVal, + FalseVal, Q, MaxRecurse)) + return V; Value *X; Value *Y; diff --git a/llvm/test/Transforms/InstSimplify/select-icmp.ll b/llvm/test/Transforms/InstSimplify/select-icmp.ll index 9e738b3b21117..9895271b35ac7 100755 --- a/llvm/test/Transforms/InstSimplify/select-icmp.ll +++ b/llvm/test/Transforms/InstSimplify/select-icmp.ll @@ -247,7 +247,9 @@ cond.end: ; preds = %entry, %cond.true define ptr @icmp_ptr_eq_replace(ptr %a, ptr %b) { ; CHECK-LABEL: @icmp_ptr_eq_replace( -; CHECK-NEXT: ret ptr [[B:%.*]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[A:%.*]], [[B1:%.*]] +; CHECK-NEXT: [[B:%.*]] = select i1 [[CMP]], ptr [[A]], ptr [[B1]] +; CHECK-NEXT: ret ptr [[B]] ; %cmp = icmp eq ptr %a, %b %sel = select i1 %cmp, ptr %a, ptr %b From 0e3837ba62293e31170eee24691f543a7fa4217d Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Sun, 2 Feb 2025 17:20:57 +0800 Subject: [PATCH 3/3] [InstSimplify] Add more tests. NFC. --- llvm/test/Transforms/InstSimplify/select-icmp.ll | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/llvm/test/Transforms/InstSimplify/select-icmp.ll b/llvm/test/Transforms/InstSimplify/select-icmp.ll index 9895271b35ac7..64c0d1d7553fe 100755 --- a/llvm/test/Transforms/InstSimplify/select-icmp.ll +++ b/llvm/test/Transforms/InstSimplify/select-icmp.ll @@ -264,3 +264,15 @@ define ptr @icmp_ptr_eq_replace_null(ptr %a) { %sel = select i1 %cmp, ptr null, ptr %a ret ptr %sel } + +define ptr @ptr_eq_replace_same_underlying_object(ptr %st, i64 %i, i64 %j) { +; CHECK-LABEL: @ptr_eq_replace_same_underlying_object( +; CHECK-NEXT: [[B:%.*]] = getelementptr inbounds i8, ptr [[ST:%.*]], i64 [[J:%.*]] +; CHECK-NEXT: ret ptr [[B]] +; + %a = getelementptr inbounds i8, ptr %st, i64 %i + %b = getelementptr inbounds i8, ptr %st, i64 %j + %cmp = icmp eq ptr %a, %b + %sel = select i1 %cmp, ptr %a, ptr %b + ret ptr %sel +}