Skip to content

Wrong call-tree output when using -H:+PrintAnalysisCallTree #3166

Closed
@zakkak

Description

@zakkak

Describe the issue
Using -H:+PrintAnalysisCallTree on the following java example:

public class CallTree {
    private static void callA() {
        callB(true);
        callB(false);
    }

    private static void callB(boolean cond) {
        if (cond) {
            callD(true);
        }
    }

    private static void callD(boolean cond) {
        if (cond) {
            callC();
        } else {
            System.out.println("Hello D");
        }
    }

    private static void callC() {
        System.out.println("Hello C");
    }

    private static void callW() {
        callD(false);
    }

    private static void callX() {
        callD(false);
    }

    private static void callZ() {
        callD(false);
    }

    public static void main(String[] args) {
        callA();
        callW();
        callX();
        callZ();
    }
}

results in the following call tree:

├── entry com.oracle.svm.core.code.IsolateEnterStub.JavaMainWrapper_run_5087f5482cc9a6abc971913ece43acb471d2631b(int, org.graalvm.nativeimage.c.type.CCharPointerPointer):int id=85 
│   └── directly calls com.oracle.svm.core.JavaMainWrapper.run(int, org.graalvm.nativeimage.c.type.CCharPointerPointer):int id=693 @bci=2 
│       └── directly calls com.oracle.svm.core.JavaMainWrapper.runCore():int id=1029 @bci=0 
│           ├── directly calls CallTree.main(java.lang.String[]):void id=1402 @bci=66 
│           │   ├── directly calls CallTree.callA():void id=1973 @bci=0 
│           │   │   ├── directly calls CallTree.callB(boolean):void id=2939 @bci=1 
│           │   │   │   └── directly calls CallTree.callD(boolean):void id-ref=2940 @bci=5 
│           │   │   └── directly calls CallTree.callB(boolean):void id-ref=2939 @bci=5 
│           │   ├── directly calls CallTree.callW():void id=1974 @bci=3 
│           │   │   └── directly calls CallTree.callD(boolean):void id=2940 @bci=1 
│           │   │       ├── directly calls CallTree.callC():void id=3797 @bci=4 
│           │   │       │   └── virtually calls java.io.PrintStream.println(java.lang.String):void @bci=5
│           │   │       │       └── is overridden by java.io.PrintStream.println(java.lang.String):void id-ref=938 
│           │   │       └── virtually calls java.io.PrintStream.println(java.lang.String):void @bci=15
│           │   │           └── is overridden by java.io.PrintStream.println(java.lang.String):void id-ref=938 
│           │   ├── directly calls CallTree.callX():void id=1975 @bci=6 
│           │   │   └── directly calls CallTree.callD(boolean):void id-ref=2940 @bci=1 
│           │   └── directly calls CallTree.callZ():void id=1976 @bci=9 
│           │       └── directly calls CallTree.callD(boolean):void id-ref=2940 @bci=

while I would expect something like the following:

├── entry com.oracle.svm.core.code.IsolateEnterStub.JavaMainWrapper_run_5087f5482cc9a6abc971913ece43acb471d2631b(int, org.graalvm.nativeimage.c.type.CCharPointerPointer):int id=85 
│   └── directly calls com.oracle.svm.core.JavaMainWrapper.run(int, org.graalvm.nativeimage.c.type.CCharPointerPointer):int id=693 @bci=2 
│       └── directly calls com.oracle.svm.core.JavaMainWrapper.runCore():int id=1029 @bci=0 
│           ├── directly calls CallTree.main(java.lang.String[]):void id=1402 @bci=66 
│           │   ├── directly calls CallTree.callA():void id=1973 @bci=0 
│           │   │   ├── directly calls CallTree.callB(boolean):void id=2939 @bci=1 
│           │   │   │   └── directly calls CallTree.callD(boolean):void id-ref=2940 @bci=5 
│           │   │   │         └── directly calls CallTree.callC():void id=3797 @bci=4 
│           │   │   │             └── virtually calls java.io.PrintStream.println(java.lang.String):void @bci=5
│           │   │   │                 └── is overridden by java.io.PrintStream.println(java.lang.String):void id-ref=938 
│           │   │   └── directly calls CallTree.callB(boolean):void id-ref=2939 @bci=5 
│           │   ├── directly calls CallTree.callW():void id=1974 @bci=3 
│           │   │   └── directly calls CallTree.callD(boolean):void id=2940 @bci=1 
│           │   │       └── virtually calls java.io.PrintStream.println(java.lang.String):void @bci=15
│           │   │           └── is overridden by java.io.PrintStream.println(java.lang.String):void id-ref=938 
│           │   ├── directly calls CallTree.callX():void id=1975 @bci=6 
│           │   │   └── directly calls CallTree.callD(boolean):void id-ref=2940 @bci=1 
│           │   │       └── virtually calls java.io.PrintStream.println(java.lang.String):void @bci=15
│           │   │           └── is overridden by java.io.PrintStream.println(java.lang.String):void id-ref=938 
│           │   └── directly calls CallTree.callZ():void id=1976 @bci=9 
│           │       └── directly calls CallTree.callD(boolean):void id-ref=2940 @bci=
│           │           └── virtually calls java.io.PrintStream.println(java.lang.String):void @bci=15
│           │               └── is overridden by java.io.PrintStream.println(java.lang.String):void id-ref=938 

Steps to reproduce the issue
Please include both build steps as well as run steps

  1. Copy the above Java example to CallTree.java
  2. javac CallTree.java
  3. native-image -H:+PrintAnalysisCallTree CallTree
  4. grep -C10 CallTree reports/call_tree_calltree_*.txt

Describe GraalVM and your environment:

  • GraalVM version: CE 21.0.0
  • JDK major version: 11
  • OS: Fedora 33
  • Architecture: AMD64

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions