[llvm-bugs] [Bug 47502] New: Cannot add mutually recursive functions into RefSCC

via llvm-bugs llvm-bugs at lists.llvm.org
Fri Sep 11 12:16:10 PDT 2020


https://bugs.llvm.org/show_bug.cgi?id=47502

            Bug ID: 47502
           Summary: Cannot add mutually recursive functions into RefSCC
           Product: new-bugs
           Version: unspecified
          Hardware: PC
                OS: Windows NT
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: new bugs
          Assignee: unassignedbugs at nondot.org
          Reporter: aeubanks at google.com
                CC: alina.sbirlea at gmail.com, htmldeveloper at gmail.com,
                    johannes at jdoerfert.de, llvm-bugs at lists.llvm.org,
                    modocache at gmail.com

When adding mutually recursive (ref-wise) functions to a CGSCC via
LazyCallGraph::addNewFunctionIntoRefSCC(), the following assert triggers:
Assertion failed: !lookup(F) && "node already exists", file
../../llvm/lib/Analysis/LazyCallGraph.cpp, line 1598

This is because addNewFunctionIntoRefSCC() calls createNode(), which populates
the edges for that node and creates nodes for any functions it references by
calling get(). Let's say we want to call addNewFunctionIntoRefSCC() on two
newly created and mutually recursive functions. After the first
addNewFunctionIntoRefSCC(), it has created two nodes, one for each of the newly
added functions. Then in the second call to addNewFunctionIntoRefSCC(), it
calls createNode() on the second function, but the node was already created via
a call to get() previously, so the assert triggers.

https://reviews.llvm.org/D72025 and https://reviews.llvm.org/D70927 introduced
addNewFunctionIntoSCC() and addNewFunctionIntoRefSCC().

Reproducible via unittests with the diff in CGSCCCPassManagerTest.cpp below:
```
@@ -1753,11 +1753,29 @@ TEST_F(CGSCCPassManagerTest, TestInsertionOfNewRefSCC)
{
                                            
Type::getInt8PtrTy(F.getContext()),
                                             "f.ref", &*F.begin()->begin());

+          // Create mutually recursive functions 'h1' and 'h2'.
+          auto *H1 = Function::Create(F.getFunctionType(), F.getLinkage(),
+                                      F.getAddressSpace(), "h1",
F.getParent());
+          auto *H2 = Function::Create(F.getFunctionType(), F.getLinkage(),
+                                      F.getAddressSpace(), "h2",
F.getParent());
+          BasicBlock *H1BB =
+              BasicBlock::Create(F.getParent()->getContext(), "entry", H1);
+          BasicBlock *H2BB =
+              BasicBlock::Create(F.getParent()->getContext(), "entry", H2);
+          (void)CallInst::Create(H2, {}, "", H1BB);
+          ReturnInst::Create(H1->getContext(), H1BB);
+          (void)CallInst::Create(H1, {}, "", H2BB);
+          ReturnInst::Create(H2->getContext(), H2BB);
+
+          CG.addNewFunctionIntoRefSCC(*H1, C.getOuterRefSCC());
+          CG.addNewFunctionIntoRefSCC(*H2, C.getOuterRefSCC());
+
+          F.getParent()->dump();
           ASSERT_NO_FATAL_FAILURE(
               updateCGAndAnalysisManagerForCGSCCPass(CG, C, N, AM, UR, FAM))
               << "Updating the call graph with a demoted, self-referential "
-                 "call edge 'f -> f', and a newly inserted ref edge 'f -> g',
"
-                 "caused a fatal failure";
+                 "call edge 'f -> f', a newly inserted ref edge 'f -> g', and
"
+                 "mutually recursive h1 <-> h2 caused a fatal failure";
         }
```

$ ./build/debug/obj/llvm/unittests/Analysis/AnalysisTests.exe
--gtest_filter='*TestInsertionOfNew*' --gtest_catch_exceptions=0
Note: Google Test filter = *TestInsertionOfNew*
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from CGSCCPassManagerTest
[ RUN      ] CGSCCPassManagerTest.TestInsertionOfNewRefSCC
Starting llvm::Module pass manager run.
Starting CGSCC pass manager run.
Assertion failed: !lookup(F) && "node already exists", file
../../llvm/lib/Analysis/LazyCallGraph.cpp, line 1598

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20200911/50439a6b/attachment.html>


More information about the llvm-bugs mailing list