================
@@ -2428,15 +2428,50 @@ Instruction
*SPIRVEmitIntrinsics::visitUnreachableInst(UnreachableInst &I) {
return &I;
}
+// llvm.compiler.used and llvm.used hold use-list entries that protect their
+// referenced globals from DCE without participating in code generation.
+static bool isUseListGlobal(StringRef Name) {
+ return Name == "llvm.compiler.used" || Name == "llvm.used";
+}
+
+// Returns true for module-level globals that should not have SPIR-V intrinsics
+// emitted (use-list globals plus llvm.global.annotations).
+static bool isArtificialGlobal(StringRef Name) {
+ return isUseListGlobal(Name) || Name == "llvm.global.annotations";
+}
+
+// Returns true if every use of GV traces back to llvm.compiler.used or
+// llvm.used. Such uses are not real function uses. They protect the variable
+// from GlobalDCE without participating in code generation.
+static bool hasOnlyArtificialUses(const GlobalVariable &GV) {
+ SmallPtrSet<const Value *, 8> Visited;
+ SmallVector<const Value *> Stack(GV.users());
+ while (!Stack.empty()) {
+ const Value *V = Stack.pop_back_val();
+ if (!Visited.insert(V).second)
+ continue;
+ if (const auto *GVUser = dyn_cast<GlobalVariable>(V)) {
+ if (!isUseListGlobal(GVUser->getName()))
+ return false;
+ continue;
+ }
+ if (isa<Instruction>(V))
+ return false;
----------------
jmmartinez wrote:
You can just let it fallthrough the `return false` at the end of all the ifs.
```suggestion
```
https://github.com/llvm/llvm-project/pull/196404
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits