<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><span style="text-align:start;text-indent:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><div>is in the business of deciding, but it does score it as a difference because it now, at no point, sees the expression "first" evaluate to a value of 5, or "total" to a value of 8 which it did previously.  From the source-level debugging experience, the variables now just get updated between iterations.</div></span></div></div></div></div></blockquote><div><br></div><div>Obviously should've been 7 for that value of "total".</div><div><br></div><div>To try and be a bit more helpful there's definitely something dodgy happening to variable visibility on the fibonacci example in LICM.</div><div><br></div><div>With "BISECT: NOT running pass (32) Loop Invariant Code Motion on loop":</div><div><br></div><div><div><font face="monospace, monospace">## BEGIN ##</font></div><div><font face="monospace, monospace">[1, "main", "tests/fibonacci/test.cpp", 24, 6, "BREAKPOINT", "FUNC", {}]</font></div><div><font face="monospace, monospace">[2, "main", "tests/fibonacci/test.cpp", 25, 2, "BREAKPOINT", "FORWARD", {}]</font></div><div><font face="monospace, monospace">.   [3, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 13, 20, "BREAKPOINT", "FUNC", {}]</font></div><div><font face="monospace, monospace">.   [4, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 15, 20, "BREAKPOINT", "FORWARD", {"i": "0", "second": "1", "total": "0", "first": "0"}]</font></div><div><font face="monospace, monospace">.   [5, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 16, 9, "BREAKPOINT", "FORWARD", {"i": "0", "second": "1", "total": "0", "first": "0", "next": "1"}]</font></div><div><font face="monospace, monospace">.   [6, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 13, 29, "STEP", "BACKWARD", {}]</font></div><div><font face="monospace, monospace">.   [7, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 15, 20, "BREAKPOINT", "FORWARD", {"i": "1", "second": "1", "total": "0", "first": "1"}]</font></div><div><font face="monospace, monospace">.   [8, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 16, 9, "BREAKPOINT", "FORWARD", {"i": "1", "second": "1", "total": "0", "first": "1", "next": "2"}]</font></div><div><font face="monospace, monospace">.   [9, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 13, 29, "STEP", "BACKWARD", {}]</font></div><div><font face="monospace, monospace">.   [10, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 15, 20, "BREAKPOINT", "FORWARD", {"i": "2", "second": "2", "total": "1", "first": "1"}]</font></div><div><font face="monospace, monospace">.   [11, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 16, 9, "BREAKPOINT", "FORWARD", {"i": "2", "second": "2", "total": "1", "first": "1", "next": "3"}]</font></div><div><font face="monospace, monospace">.   [12, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 13, 29, "STEP", "BACKWARD", {}]</font></div><div><font face="monospace, monospace">.   [13, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 15, 20, "BREAKPOINT", "FORWARD", {"i": "3", "second": "3", "total": "2", "first": "2"}]</font></div><div><font face="monospace, monospace">.   [14, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 16, 9, "BREAKPOINT", "FORWARD", {"i": "3", "second": "3", "total": "2", "first": "2", "next": "5"}]</font></div><div><font face="monospace, monospace">.   [15, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 13, 29, "STEP", "BACKWARD", {}]</font></div><div><font face="monospace, monospace">.   [16, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 15, 20, "BREAKPOINT", "FORWARD", {"i": "4", "second": "5", "total": "4", "first": "3"}]</font></div><div><font face="monospace, monospace">.   [17, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 16, 9, "BREAKPOINT", "FORWARD", {"i": "4", "second": "5", "total": "4", "first": "3", "next": "8"}]</font></div><div><font face="monospace, monospace">.   [18, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 13, 29, "STEP", "BACKWARD", {}]</font></div><div><font face="monospace, monospace">.   [19, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 20, 1, "BREAKPOINT", "FORWARD", {}]</font></div><div><font face="monospace, monospace">[20, "main", "tests/fibonacci/test.cpp", 26, 9, "BREAKPOINT", "FUNC", {}]</font></div><div><font face="monospace, monospace">## END (20 steps) ##</font></div><div><br></div></div><div><div>But with: "BISECT: running pass (32) Loop Invariant Code Motion on loop":<br></div></div><div><br></div><div><div><font face="monospace, monospace">## BEGIN ##</font></div><div><font face="monospace, monospace">[1, "main", "tests/fibonacci/test.cpp", 24, 6, "BREAKPOINT", "FUNC", {}]</font></div><div><font face="monospace, monospace">[2, "main", "tests/fibonacci/test.cpp", 25, 2, "BREAKPOINT", "FORWARD", {}]</font></div><div><font face="monospace, monospace">.   [3, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 13, 20, "BREAKPOINT", "FUNC", {}]</font></div><div><font face="monospace, monospace">.   [4, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 16, 9, "BREAKPOINT", "FORWARD", {"i": "0", "second": "1", "total": "0", "first": "0", "next": null}]</font></div><div><font face="monospace, monospace">.   [5, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 13, 2, "STEP", "BACKWARD", {}]</font></div><div><font face="monospace, monospace">.   [6, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 15, 20, "BREAKPOINT", "FORWARD", {"i": "0", "second": "1", "total": "0", "first": "0"}]</font></div><div><font face="monospace, monospace">.   [7, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 16, 9, "STEP", "FORWARD", {"i": "0", "second": "1", "total": "0", "first": "0", "next": "1"}]</font></div><div><font face="monospace, monospace">.   [8, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 13, 29, "STEP", "BACKWARD", {}]</font></div><div><font face="monospace, monospace">.   [9, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 15, 20, "BREAKPOINT", "FORWARD", {"i": "1", "second": "1", "total": "0", "first": "1"}]</font></div><div><font face="monospace, monospace">.   [10, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 16, 9, "STEP", "FORWARD", {"i": "1", "second": "1", "total": "0", "first": "1", "next": "2"}]</font></div><div><font face="monospace, monospace">.   [11, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 13, 29, "STEP", "BACKWARD", {}]</font></div><div><font face="monospace, monospace">.   [12, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 15, 20, "BREAKPOINT", "FORWARD", {"i": "2", "second": "2", "total": "0", "first": "1"}]</font></div><div><font face="monospace, monospace">.   [13, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 16, 9, "STEP", "FORWARD", {"i": "2", "second": "2", "total": "0", "first": "1", "next": "3"}]</font></div><div><font face="monospace, monospace">.   [14, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 13, 29, "STEP", "BACKWARD", {}]</font></div><div><font face="monospace, monospace">.   [15, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 15, 20, "BREAKPOINT", "FORWARD", {"i": "3", "second": "3", "total": "0", "first": "2"}]</font></div><div><font face="monospace, monospace">.   [16, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 16, 9, "STEP", "FORWARD", {"i": "3", "second": "3", "total": "0", "first": "2", "next": "5"}]</font></div><div><font face="monospace, monospace">.   [17, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 13, 29, "STEP", "BACKWARD", {}]</font></div><div><font face="monospace, monospace">.   [18, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 15, 20, "BREAKPOINT", "FORWARD", {"i": "4", "second": "5", "total": "0", "first": "3"}]</font></div><div><font face="monospace, monospace">.   [19, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 16, 9, "STEP", "FORWARD", {"i": "4", "second": "5", "total": "0", "first": "3", "next": "8"}]</font></div><div><font face="monospace, monospace">.   [20, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 13, 29, "STEP", "BACKWARD", {}]</font></div><div><font face="monospace, monospace">.   [21, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 16, 9, "STEP", "FORWARD", {"i": "5", "second": "8", "total": "0", "first": "5", "next": "8"}]</font></div><div><font face="monospace, monospace">.   [22, "Fibonacci(int, int&)", "tests/fibonacci/test.cpp", 20, 1, "BREAKPOINT", "FORWARD", {}]</font></div><div><font face="monospace, monospace">[23, "main", "tests/fibonacci/test.cpp", 26, 9, "BREAKPOINT", "FUNC", {}]</font></div><div><font face="monospace, monospace">## END (23 steps) ##</font></div></div><div><br></div><div>The difference here that really sticks out as a problem to me is reported by the heuristic like this:</div><div><br></div><div><div><font face="monospace, monospace">  test.cpp:15-18 [total] [21/21]</font></div><div><font face="monospace, monospace">    expected encountered values:</font></div><div><font face="monospace, monospace">      0</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    missing values:</font></div><div><font face="monospace, monospace">      1 [+6]</font></div><div><font face="monospace, monospace">      2 [+6]</font></div><div><font face="monospace, monospace">      4 [+6]</font></div><div><font face="monospace, monospace">      7 [+3]</font></div></div><div><br></div><div>So, "total" evaluates to 0 for the duration of <span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Fibonacci(int, int&) which definitely smells wrong to me.  Prior to that it was evaluating to 0, 1, 2 and 4 in order (we stopped seeing 7 after SROA).</span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br></span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">-Greg</span></div><div><br></div><div><br></div></div></div></div>