diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index 7a9a272691b3dd..e72e3cee1d4b91 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -500,6 +500,13 @@ bool llvm::wouldInstructionBeTriviallyDead(Instruction *I, if (isMathLibCallNoop(Call, TLI)) return true; + // Non-volatile atomic loads from constants can be removed. + if (auto *LI = dyn_cast(I)) + if (auto *GV = dyn_cast( + LI->getPointerOperand()->stripPointerCasts())) + if (!LI->isVolatile() && GV->isConstant()) + return true; + return false; } diff --git a/llvm/test/CodeGen/PowerPC/atomics-constant.ll b/llvm/test/CodeGen/PowerPC/atomics-constant.ll index 80f84d89f5fa4a..3a7da6f9c748f5 100644 --- a/llvm/test/CodeGen/PowerPC/atomics-constant.ll +++ b/llvm/test/CodeGen/PowerPC/atomics-constant.ll @@ -3,16 +3,14 @@ target triple = "powerpc64le-unknown-linux-gnu" -@a = dso_local constant i64 zeroinitializer +@a = dso_local global i64 zeroinitializer define i64 @foo() { ; CHECK-LABEL: foo: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: li 4, 0 ; CHECK-NEXT: addis 3, 2, a@toc@ha ; CHECK-NEXT: ld 3, a@toc@l(3) -; CHECK-NEXT: cmpd 7, 4, 4 -; CHECK-NEXT: li 3, 0 +; CHECK-NEXT: cmpd 7, 3, 3 ; CHECK-NEXT: bne- 7, .+4 ; CHECK-NEXT: isync ; CHECK-NEXT: blr diff --git a/llvm/test/Transforms/InstCombine/atomic.ll b/llvm/test/Transforms/InstCombine/atomic.ll index ec79891af11e50..e3afffeb9b4a89 100644 --- a/llvm/test/Transforms/InstCombine/atomic.ll +++ b/llvm/test/Transforms/InstCombine/atomic.ll @@ -426,7 +426,6 @@ define void @no_atomic_vector_store(<2 x float> %p, i8* %p2) { define i32 @atomic_load_from_constant_global() { ; CHECK-LABEL: @atomic_load_from_constant_global( -; CHECK-NEXT: [[V:%.*]] = load atomic i32, i32* @c seq_cst, align 4 ; CHECK-NEXT: ret i32 42 ; %v = load atomic i32, i32* @c seq_cst, align 4 @@ -435,7 +434,6 @@ define i32 @atomic_load_from_constant_global() { define i8 @atomic_load_from_constant_global_bitcast() { ; CHECK-LABEL: @atomic_load_from_constant_global_bitcast( -; CHECK-NEXT: [[V:%.*]] = load atomic i8, i8* bitcast (i32* @c to i8*) seq_cst, align 1 ; CHECK-NEXT: ret i8 42 ; %v = load atomic i8, i8* bitcast (i32* @c to i8*) seq_cst, align 1