llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-llvm-analysis Author: None (llvmbot) <details> <summary>Changes</summary> Backport 1af627b592dd15bbe58136f902ced46251fc344d Requested by: @<!-- -->dtcxzyw --- Full diff: https://github.com/llvm/llvm-project/pull/125398.diff 2 Files Affected: - (modified) llvm/lib/Analysis/InstructionSimplify.cpp (+11-6) - (modified) llvm/test/Transforms/InstSimplify/select-icmp.ll (+32) ``````````diff diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index d69747e30f884d..4e550f8fa6a9fd 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" @@ -4737,12 +4738,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 a6ef937760a589..64c0d1d7553feb 100755 --- a/llvm/test/Transforms/InstSimplify/select-icmp.ll +++ b/llvm/test/Transforms/InstSimplify/select-icmp.ll @@ -244,3 +244,35 @@ 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: [[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 + 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 +} + +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 +} `````````` </details> https://github.com/llvm/llvm-project/pull/125398 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits