diff --git a/llvm/lib/Transforms/Scalar/EarlyCSE.cpp b/llvm/lib/Transforms/Scalar/EarlyCSE.cpp --- a/llvm/lib/Transforms/Scalar/EarlyCSE.cpp +++ b/llvm/lib/Transforms/Scalar/EarlyCSE.cpp @@ -140,7 +140,8 @@ // correctness. However, it may block many other correct // optimizations. Revert this one when we detect the memory // accessing kind more precisely. - !CI->getFunction()->isPresplitCoroutine(); + !CI->getFunction()->isPresplitCoroutine() && + !CI->isConvergent(); } return isa(Inst) || isa(Inst) || isa(Inst) || isa(Inst) || @@ -495,7 +496,8 @@ // correctness. However, it may block many other correct // optimizations. Revert this one when we detect the memory // accessing kind more precisely. - CI->getFunction()->isPresplitCoroutine()) + CI->getFunction()->isPresplitCoroutine() || + CI->isConvergent()) return false; return true; } diff --git a/llvm/test/Transforms/EarlyCSE/AMDGPU/convergent-call.ll b/llvm/test/Transforms/EarlyCSE/AMDGPU/convergent-call.ll --- a/llvm/test/Transforms/EarlyCSE/AMDGPU/convergent-call.ll +++ b/llvm/test/Transforms/EarlyCSE/AMDGPU/convergent-call.ll @@ -10,9 +10,10 @@ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[COND]], 0 ; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]] ; CHECK: if: +; CHECK-NEXT: [[Y1:%.*]] = call i32 @llvm.read_register.i32(metadata [[META0]]) #[[ATTR1]] ; CHECK-NEXT: br label [[END]] ; CHECK: end: -; CHECK-NEXT: [[Y2:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X1]], [[IF]] ] +; CHECK-NEXT: [[Y2:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[Y1]], [[IF]] ] ; CHECK-NEXT: [[RET:%.*]] = add i32 [[X1]], [[Y2]] ; CHECK-NEXT: ret i32 [[RET]] ;