Index: llvm/lib/Transforms/Utils/Local.cpp =================================================================== --- llvm/lib/Transforms/Utils/Local.cpp +++ llvm/lib/Transforms/Utils/Local.cpp @@ -500,6 +500,13 @@ if (isMathLibCallNoop(Call, TLI)) return true; + // 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; } Index: llvm/test/Transforms/InstCombine/atomic.ll =================================================================== --- llvm/test/Transforms/InstCombine/atomic.ll +++ llvm/test/Transforms/InstCombine/atomic.ll @@ -425,7 +425,6 @@ 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 @@ -434,7 +433,6 @@ 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