[llvm] [LICM][NFCish] Consider all calls in a presplit coroutine unsinkable/unhoistable (PR #81951)
Arthur Eubanks via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 15 16:34:09 PST 2024
https://github.com/aeubanks created https://github.com/llvm/llvm-project/pull/81951
NFCish since previously we'd return false for all presplit coroutines anyway. This clarifies things a bit.
>From 66383407609d78875533906c4d34e7229a710c75 Mon Sep 17 00:00:00 2001
From: Arthur Eubanks <aeubanks at google.com>
Date: Fri, 16 Feb 2024 00:27:53 +0000
Subject: [PATCH] [LICM][NFCish] Consider all calls in a presplit coroutine
unsinkable/unhoistable
NFCish since previously we'd return false for all presplit coroutines anyway. This clarifies things a bit.
---
llvm/lib/Transforms/Scalar/LICM.cpp | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/llvm/lib/Transforms/Scalar/LICM.cpp b/llvm/lib/Transforms/Scalar/LICM.cpp
index 9ec9c31e48e0b6..546e718cb50851 100644
--- a/llvm/lib/Transforms/Scalar/LICM.cpp
+++ b/llvm/lib/Transforms/Scalar/LICM.cpp
@@ -1217,6 +1217,14 @@ bool llvm::canSinkOrHoistInst(Instruction &I, AAResults *AA, DominatorTree *DT,
if (CI->isConvergent())
return false;
+ // FIXME: Current LLVM IR semantics don't work well with coroutines and
+ // thread local globals. We currently treat getting the address of a thread
+ // local global as not accessing memory, even though it may not be a
+ // constant throughout a function with coroutines. Remove this check after
+ // we better model semantics of thread local globals.
+ if (CI->getFunction()->isPresplitCoroutine())
+ return false;
+
using namespace PatternMatch;
if (match(CI, m_Intrinsic<Intrinsic::assume>()))
// Assumes don't actually alias anything or throw
@@ -1225,14 +1233,6 @@ bool llvm::canSinkOrHoistInst(Instruction &I, AAResults *AA, DominatorTree *DT,
// Handle simple cases by querying alias analysis.
MemoryEffects Behavior = AA->getMemoryEffects(CI);
- // FIXME: we don't handle the semantics of thread local well. So that the
- // address of thread locals are fake constants in coroutines. So We forbid
- // to treat onlyReadsMemory call in coroutines as constants now. Note that
- // it is possible to hide a thread local access in a onlyReadsMemory call.
- // Remove this check after we handle the semantics of thread locals well.
- if (Behavior.onlyReadsMemory() && CI->getFunction()->isPresplitCoroutine())
- return false;
-
if (Behavior.doesNotAccessMemory())
return true;
if (Behavior.onlyReadsMemory()) {
More information about the llvm-commits
mailing list