[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 13:29:47 PDT 2023


This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGc86a1e6903e9: [GVN] Do not combine convergent calls in GVN/NewGVN (authored by foad).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150974/new/

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.523914.patch
Type: text/x-patch
Size: 2998 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230519/07b9ec82/attachment.bin>


More information about the llvm-commits mailing list