[PATCH] D150974: [GVN] Do not combine convergent calls in GVN/NewGVN

Jay Foad via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri May 19 08:43:09 PDT 2023


foad created this revision.
foad added reviewers: AMDGPU, nhaehnle, sameerds, yaxunl, arsenm, hliao, ruiling.
Herald added subscribers: kmitropoulou, StephenFan, hiraditya.
Herald added a project: All.
foad requested review of this revision.
Herald added subscribers: llvm-commits, wdng.
Herald added a project: LLVM.

Note that this is very conservative since it will not even combine
convergent calls that appear in the same basic block, but EarlyCSE will
handle that case.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D150974

Files:
  llvm/lib/Transforms/Scalar/GVN.cpp
  llvm/lib/Transforms/Scalar/NewGVN.cpp
  llvm/test/Transforms/GVN/convergent.ll
  llvm/test/Transforms/NewGVN/convergent.ll


Index: llvm/test/Transforms/NewGVN/convergent.ll
===================================================================
--- llvm/test/Transforms/NewGVN/convergent.ll
+++ llvm/test/Transforms/NewGVN/convergent.ll
@@ -7,9 +7,11 @@
 ; CHECK-NEXT:    [[V0:%.*]] = call i32 @llvm.convergent()
 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BODY:%.*]], label [[END:%.*]]
 ; CHECK:       body:
+; CHECK-NEXT:    [[V1:%.*]] = call i32 @llvm.convergent()
 ; CHECK-NEXT:    br label [[END]]
 ; CHECK:       end:
-; CHECK-NEXT:    ret i32 [[V0]]
+; CHECK-NEXT:    [[RET:%.*]] = phi i32 [ [[V0]], [[ENTRY:%.*]] ], [ [[V1]], [[BODY]] ]
+; CHECK-NEXT:    ret i32 [[RET]]
 ;
 entry:
   %v0 = call i32 @llvm.convergent()
Index: llvm/test/Transforms/GVN/convergent.ll
===================================================================
--- llvm/test/Transforms/GVN/convergent.ll
+++ llvm/test/Transforms/GVN/convergent.ll
@@ -7,9 +7,11 @@
 ; CHECK-NEXT:    [[V0:%.*]] = call i32 @llvm.convergent()
 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BODY:%.*]], label [[END:%.*]]
 ; CHECK:       body:
+; CHECK-NEXT:    [[V1:%.*]] = call i32 @llvm.convergent()
 ; CHECK-NEXT:    br label [[END]]
 ; CHECK:       end:
-; CHECK-NEXT:    ret i32 [[V0]]
+; CHECK-NEXT:    [[RET:%.*]] = phi i32 [ [[V0]], [[ENTRY:%.*]] ], [ [[V1]], [[BODY]] ]
+; CHECK-NEXT:    ret i32 [[RET]]
 ;
 entry:
   %v0 = call i32 @llvm.convergent()
Index: llvm/lib/Transforms/Scalar/NewGVN.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/NewGVN.cpp
+++ llvm/lib/Transforms/Scalar/NewGVN.cpp
@@ -1613,6 +1613,12 @@
   if (CI->getFunction()->isPresplitCoroutine())
     return ExprResult::none();
 
+  // Do not combine convergent calls since they implicitly depend on the set of
+  // threads that is currently executing, and they might be in different basic
+  // blocks.
+  if (CI->isConvergent())
+    return ExprResult::none();
+
   if (AA->doesNotAccessMemory(CI)) {
     return ExprResult::some(
         createCallExpression(CI, TOPClass->getMemoryLeader()));
Index: llvm/lib/Transforms/Scalar/GVN.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/GVN.cpp
+++ llvm/lib/Transforms/Scalar/GVN.cpp
@@ -473,6 +473,14 @@
     return nextValueNumber++;
   }
 
+  // Do not combine convergent calls since they implicitly depend on the set of
+  // threads that is currently executing, and they might be in different basic
+  // blocks.
+  if (C->isConvergent()) {
+    valueNumbering[C] = nextValueNumber;
+    return nextValueNumber++;
+  }
+
   if (AA->doesNotAccessMemory(C)) {
     Expression exp = createExpr(C);
     uint32_t e = assignExpNewValueNum(exp).first;
@@ -2781,9 +2789,6 @@
     // We don't currently value number ANY inline asm calls.
     if (CallB->isInlineAsm())
       return false;
-    // Don't do PRE on convergent calls.
-    if (CallB->isConvergent())
-      return false;
   }
 
   uint32_t ValNo = VN.lookup(CurInst);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D150974.523799.patch
Type: text/x-patch
Size: 2998 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230519/ccc73f60/attachment.bin>


More information about the llvm-commits mailing list