diff --git a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp index 13f3de07c3c44..05b4f176bfc31 100644 --- a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp +++ b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp @@ -2210,7 +2210,9 @@ struct DSEState { Instruction *UpperInst = UpperDef->getMemoryInst(); auto IsRedundantStore = [&]() { - if (DefInst->isIdenticalTo(UpperInst)) + // We don't care about differences in call attributes here. + if (DefInst->isIdenticalToWhenDefined(UpperInst, + /*IntersectAttrs=*/true)) return true; if (auto *MemSetI = dyn_cast(UpperInst)) { if (auto *SI = dyn_cast(DefInst)) { diff --git a/llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll b/llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll index 193b42ca9e09a..4f38027f17213 100644 --- a/llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll +++ b/llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll @@ -752,7 +752,6 @@ define void @memset_different_attributes_1(i1 %c, ptr %ptr) { ; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr [[PTR:%.*]], i8 0, i64 20, i1 false) ; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[END:%.*]] ; CHECK: if: -; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr dereferenceable(20) [[PTR]], i8 0, i64 20, i1 false) ; CHECK-NEXT: br label [[END]] ; CHECK: end: ; CHECK-NEXT: ret void @@ -773,7 +772,6 @@ define void @memset_different_attributes_2(i1 %c, ptr %ptr) { ; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr dereferenceable(20) [[PTR:%.*]], i8 0, i64 20, i1 false) ; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[END:%.*]] ; CHECK: if: -; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr [[PTR]], i8 0, i64 20, i1 false) ; CHECK-NEXT: br label [[END]] ; CHECK: end: ; CHECK-NEXT: ret void