Skip to content

Commit 844a1d5

Browse files
authored
[IR] Return correct memory effects for convergencectrl (#129874)
`convergencectrl` doesn't imply any memory access. Closes #129856.
1 parent 6262d67 commit 844a1d5

File tree

4 files changed

+21
-8
lines changed

4 files changed

+21
-8
lines changed

llvm/lib/IR/Instructions.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -609,15 +609,17 @@ bool CallBase::hasReadingOperandBundles() const {
609609
// Implementation note: this is a conservative implementation of operand
610610
// bundle semantics, where *any* non-assume operand bundle (other than
611611
// ptrauth) forces a callsite to be at least readonly.
612-
return hasOperandBundlesOtherThan(
613-
{LLVMContext::OB_ptrauth, LLVMContext::OB_kcfi}) &&
612+
return hasOperandBundlesOtherThan({LLVMContext::OB_ptrauth,
613+
LLVMContext::OB_kcfi,
614+
LLVMContext::OB_convergencectrl}) &&
614615
getIntrinsicID() != Intrinsic::assume;
615616
}
616617

617618
bool CallBase::hasClobberingOperandBundles() const {
618619
return hasOperandBundlesOtherThan(
619620
{LLVMContext::OB_deopt, LLVMContext::OB_funclet,
620-
LLVMContext::OB_ptrauth, LLVMContext::OB_kcfi}) &&
621+
LLVMContext::OB_ptrauth, LLVMContext::OB_kcfi,
622+
LLVMContext::OB_convergencectrl}) &&
621623
getIntrinsicID() != Intrinsic::assume;
622624
}
623625

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -S < %s -passes=dce | FileCheck %s
3+
4+
define void @dead_readfirstlane_convergencetoken(<2 x i32> %src) convergent {
5+
; CHECK-LABEL: define void @dead_readfirstlane_convergencetoken(
6+
; CHECK-SAME: <2 x i32> [[SRC:%.*]]) #[[ATTR0:[0-9]+]] {
7+
; CHECK-NEXT: ret void
8+
;
9+
%t = tail call token @llvm.experimental.convergence.entry()
10+
%vec = call <2 x i32> @llvm.amdgcn.readfirstlane.v2i32(<2 x i32> %src) [ "convergencectrl"(token %t) ]
11+
ret void
12+
}

llvm/test/Transforms/IRNormalizer/regression-convergence-tokens.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ define i32 @nested(i32 %src) #0 {
77
; CHECK-SAME: i32 [[A0:%.*]]) #[[ATTR0:[0-9]+]] {
88
; CHECK-NEXT: [[BB15160:.*:]]
99
; CHECK-NEXT: [[T1:%.*]] = call token @llvm.experimental.convergence.entry()
10-
; CHECK-NEXT: %"vl15001llvm.experimental.convergence.anchor()" = call token @llvm.experimental.convergence.anchor()
11-
; CHECK-NEXT: %"op68297llvm.amdgcn.readfirstlane.i32([[A0]], vl15001llvm.experimental.convergence.anchor())" = call i32 @llvm.amdgcn.readfirstlane.i32(i32 [[A0]]) [ "convergencectrl"(token %"vl15001llvm.experimental.convergence.anchor()") ]
12-
; CHECK-NEXT: ret i32 undef
10+
; CHECK-NEXT: %"vl77672llvm.experimental.convergence.anchor()" = call token @llvm.experimental.convergence.anchor()
11+
; CHECK-NEXT: %"op68297(vl77672)" = call i32 @llvm.amdgcn.readfirstlane.i32(i32 [[A0]]) [ "convergencectrl"(token %"vl77672llvm.experimental.convergence.anchor()") ]
12+
; CHECK-NEXT: ret i32 %"op68297(vl77672)"
1313
;
1414
%t1 = call token @llvm.experimental.convergence.entry()
1515
%t2 = call token @llvm.experimental.convergence.anchor()
1616
%r2 = call i32 @llvm.amdgcn.readfirstlane(i32 %src) [ "convergencectrl"(token %t2) ]
17-
ret i32 undef
17+
ret i32 %r2
1818
}
1919

2020
; Function Attrs: convergent nounwind readnone

llvm/test/Transforms/InstCombine/AMDGPU/simplify-demanded-vector-elts-lane-intrinsics.ll

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,6 @@ define i32 @extract_elt0_v2i32_readfirstlane_convergencetoken(<2 x i32> %src) co
349349
; CHECK-LABEL: define i32 @extract_elt0_v2i32_readfirstlane_convergencetoken(
350350
; CHECK-SAME: <2 x i32> [[SRC:%.*]]) #[[ATTR1:[0-9]+]] {
351351
; CHECK-NEXT: [[T:%.*]] = call token @llvm.experimental.convergence.entry()
352-
; CHECK-NEXT: [[VEC:%.*]] = call <2 x i32> @llvm.amdgcn.readfirstlane.v2i32(<2 x i32> [[SRC]]) [ "convergencectrl"(token [[T]]) ]
353352
; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x i32> [[SRC]], i64 0
354353
; CHECK-NEXT: [[ELT:%.*]] = call i32 @llvm.amdgcn.readfirstlane.i32(i32 [[TMP1]]) [ "convergencectrl"(token [[T]]) ]
355354
; CHECK-NEXT: ret i32 [[ELT]]

0 commit comments

Comments
 (0)