[llvm] [InstCombine] Support multi-use values in cast elimination transforms (PR #165877)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 31 10:41:51 PDT 2025
================
@@ -12,27 +12,41 @@
#include "InstCombineInternal.h"
#include "llvm/ADT/APInt.h"
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/STLFunctionalExtras.h"
#include "llvm/ADT/SetVector.h"
+#include "llvm/ADT/SmallVector.h"
#include "llvm/Analysis/ConstantFolding.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfo.h"
+#include "llvm/IR/Instruction.h"
#include "llvm/IR/PatternMatch.h"
+#include "llvm/IR/Type.h"
#include "llvm/IR/Value.h"
#include "llvm/Support/KnownBits.h"
#include "llvm/Transforms/InstCombine/InstCombiner.h"
+#include <iterator>
#include <optional>
using namespace llvm;
using namespace PatternMatch;
#define DEBUG_TYPE "instcombine"
-/// Given an expression that CanEvaluateTruncated or CanEvaluateSExtd returns
-/// true for, actually insert the code to evaluate the expression.
-Value *InstCombinerImpl::EvaluateInDifferentType(Value *V, Type *Ty,
- bool isSigned) {
+using EvaluatedMap = SmallDenseMap<Value *, Value *, 8>;
+
+static Value *EvaluateInDifferentTypeImpl(Value *V, Type *Ty, bool isSigned,
+ InstCombinerImpl &IC,
+ EvaluatedMap &Processed) {
+ // Since we cover transformation of isntructions with multiple users, we might
+ // come to the same node via multiple paths. We should not create a
+ // replacement for every single one of them though.
+ if (const auto It = Processed.find(V); It != Processed.end())
+ return It->getSecond();
----------------
dtcxzyw wrote:
```suggestion
if (auto *Res = Processed.lookup())
return Res;
```
https://github.com/llvm/llvm-project/pull/165877
More information about the llvm-commits
mailing list