#include "llvm/Transforms/Scalar/EarlyCSE.h"
#include "llvm/ADT/Hashing.h"
#include "llvm/ADT/ScopedHashTable.h"
+#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/GlobalsModRef.h"
if (MemoryAccess *MA = MSSA->getMemoryAccess(Inst)) {
// Optimize MemoryPhi nodes that may become redundant by having all the
// same input values once MA is removed.
- SmallVector<MemoryPhi *, 4> PhisToCheck;
+ SmallSetVector<MemoryPhi *, 4> PhisToCheck;
SmallVector<MemoryAccess *, 8> WorkQueue;
WorkQueue.push_back(MA);
// Process MemoryPhi nodes in FIFO order using a ever-growing vector since
for (auto *U : WI->users())
if (MemoryPhi *MP = dyn_cast<MemoryPhi>(U))
- PhisToCheck.push_back(MP);
+ PhisToCheck.insert(MP);
MSSAUpdater->removeMemoryAccess(WI);
--- /dev/null
+; RUN: opt -early-cse-memssa -S %s | FileCheck %s
+
+; CHECK: define void @patatino() {
+; CHECK: for.cond:
+; CHECK-NEXT: br i1 true, label %if.end, label %for.inc
+; CHECK: if.end:
+; CHECK-NEXT: %tinkywinky = load i32, i32* @b
+; CHECK-NEXT: br i1 true, label %for.inc, label %for.inc
+; CHECK: for.inc:
+; CHECK-NEXT: ret void
+
+
+@b = external global i32
+
+define void @patatino() {
+for.cond:
+ br i1 true, label %if.end, label %for.inc
+
+if.end:
+ %tinkywinky = load i32, i32* @b
+ store i32 %tinkywinky, i32* @b
+ br i1 true, label %for.inc, label %for.inc
+
+for.inc:
+ ret void
+}