
#15058: scc001 unexpected passes in prof way on CircleCI -------------------------------------+------------------------------------- Reporter: bgamari | Owner: (none) Type: bug | Status: closed Priority: high | Milestone: 8.6.1 Component: Compiler | Version: 8.2.2 Resolution: fixed | Keywords: ci-breakage Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: #10037 | Differential Rev(s): Phab:D4712 Wiki Page: | -------------------------------------+------------------------------------- Changes (by osa1): * status: new => closed * differential: => Phab:D4712 * resolution: => fixed * related: #10037, #4012, #12935 => #10037 Old description:
This should supposedly fail due to #10037.
New description: This was already fixed with c4219d9f7d1, but I realized this too late and actually debugged this. See below for my summary. This is also not related with #4012 (different optimization parameters of course result in different compiled code) and #12935 (Core outputs are different, not related with object code) so removing those from "related tickets". ---- The diff is not helpful because it doesn't show the original output and expected files so we miss some context. Basically with `-O0` (default, prof way) `h` is top level and gets a cost centre accordingly, but with `-O` (profasm way) it's inlined with its SCC. With -O0 (default, prof way): {{{ h_rsH = scctick<h> case ds_r1I1 of { (h1_a1qY) -> h1_a1qY } main :: IO () main = scctick<main> >> GHC.Base.$fMonadIO ($ (print GHC.Show.$fShowBool) (tick<f> GHC.Types.True)) (>> GHC.Base.$fMonadIO ($ (print GHC.Show.$fShowInt) (tick<g> GHC.Types.I# 3#)) ($ (print GHC.Show.$fShowChar) (h_rsH (GHC.Types.C# 'a'#)))) }}} With -O (profasm WAY): {{{ Main.main2 = scc<main> tick<h> case Main.main5 of { (h_a1se) -> case scc<h> h_a1se Main.main4 of { GHC.Types.C# ds1_a1Zn -> case ds1_a1Zn of ds2_a1Zp { __DEFAULT -> GHC.Types.: GHC.Show.$fShowChar3 (GHC.Show.$wshowLitChar ds2_a1Zp Main.main3); '\''# -> GHC.Show.$fShowChar1 } } } }}} And profiling outputs are correct in both cases. prof way: (h is a CAF) {{{ COST CENTRE MODULE SRC no. entries %time %alloc %time %alloc MAIN MAIN <built-in> 115 0 0.0 1.2 0.0 100.0 CAF Main <entire-module> 229 0 0.0 0.1 0.0 1.5 (...) Main scc001.hs:16:1-16 235 1 0.0 0.0 0.0 0.0 h Main scc001.hs:16:1-16 234 1 0.0 0.0 0.0 0.0 main Main scc001.hs:(5,1)-(7,23) 230 1 0.0 1.4 0.0 1.4 f Main scc001.hs:10:1-7 232 1 0.0 0.0 0.0 0.0 g Main scc001.hs:13:1-7 233 1 0.0 0.0 0.0 0.0 }}} profasm way: (h is inlined, no CAFs for it) {{{ COST CENTRE MODULE SRC no. entries %time %alloc %time %alloc MAIN MAIN <built-in> 115 0 0.0 1.2 0.0 100.0 CAF Main <entire-module> 229 0 0.0 0.1 0.0 0.3 (...) Main scc001.hs:16:1-16 235 1 0.0 0.0 0.0 0.0 main Main scc001.hs:(5,1)-(7,23) 230 1 0.0 0.3 0.0 0.3 g Main scc001.hs:13:1-7 233 1 0.0 0.0 0.0 0.0 h Main scc001.hs:16:1-16 234 1 0.0 0.0 0.0 0.0 }}} Some ways to fix: - If we really want to test this with multiple ways, use two different tests depending on whether the ways add -O or not. Use two different prof.sample files. - Only test with ways that add or don't add -O, use single prof.sample. I don't understand why scc001 is considered as "unexpected pass" in the summary in CircleCI link above. In the logs I see that it actually failed, and I don't see any unexpected passes. -- Comment: This was already fixed with c4219d9f7d1, but I realized this too late (why is this ticket submitted after that patch?) and actually debugged this. See below for my summary. This is also not related with #4012 (different optimization parameters will of course give different compiled code) and #12935 (Core outputs are different, not related with object code) so removing those from "related tickets". ---- The diff is not helpful because it doesn't show the original output and expected files so we miss some context. Basically with `-O0` (default, prof way) `h` is top level and gets a cost centre accordingly, but with `-O` (profasm way) it's inlined with its SCC. With -O0 (default, prof way): {{{ h_rsH = scctick<h> case ds_r1I1 of { (h1_a1qY) -> h1_a1qY } main :: IO () main = scctick<main> >> GHC.Base.$fMonadIO ($ (print GHC.Show.$fShowBool) (tick<f> GHC.Types.True)) (>> GHC.Base.$fMonadIO ($ (print GHC.Show.$fShowInt) (tick<g> GHC.Types.I# 3#)) ($ (print GHC.Show.$fShowChar) (h_rsH (GHC.Types.C# 'a'#)))) }}} With -O (profasm WAY): {{{ Main.main2 = scc<main> tick<h> case Main.main5 of { (h_a1se) -> case scc<h> h_a1se Main.main4 of { GHC.Types.C# ds1_a1Zn -> case ds1_a1Zn of ds2_a1Zp { __DEFAULT -> GHC.Types.: GHC.Show.$fShowChar3 (GHC.Show.$wshowLitChar ds2_a1Zp Main.main3); '\''# -> GHC.Show.$fShowChar1 } } } }}} And profiling outputs are correct in both cases. prof way: (h is a CAF) {{{ COST CENTRE MODULE SRC no. entries %time %alloc %time %alloc MAIN MAIN <built-in> 115 0 0.0 1.2 0.0 100.0 CAF Main <entire-module> 229 0 0.0 0.1 0.0 1.5 (...) Main scc001.hs:16:1-16 235 1 0.0 0.0 0.0 0.0 h Main scc001.hs:16:1-16 234 1 0.0 0.0 0.0 0.0 main Main scc001.hs:(5,1)-(7,23) 230 1 0.0 1.4 0.0 1.4 f Main scc001.hs:10:1-7 232 1 0.0 0.0 0.0 0.0 g Main scc001.hs:13:1-7 233 1 0.0 0.0 0.0 0.0 }}} profasm way: (h is inlined, no CAFs for it) {{{ COST CENTRE MODULE SRC no. entries %time %alloc %time %alloc MAIN MAIN <built-in> 115 0 0.0 1.2 0.0 100.0 CAF Main <entire-module> 229 0 0.0 0.1 0.0 0.3 (...) Main scc001.hs:16:1-16 235 1 0.0 0.0 0.0 0.0 main Main scc001.hs:(5,1)-(7,23) 230 1 0.0 0.3 0.0 0.3 g Main scc001.hs:13:1-7 233 1 0.0 0.0 0.0 0.0 h Main scc001.hs:16:1-16 234 1 0.0 0.0 0.0 0.0 }}} Some ways to fix: - If we really want to test this with multiple ways, use two different tests depending on whether the ways add -O or not. Use two different prof.sample files. - Only test with ways that add or don't add -O, use single prof.sample. I don't understand why scc001 is considered as "unexpected pass" in the summary in CircleCI link above. In the logs I see that it actually failed, and I don't see any unexpected passes. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15058#comment:6 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler