Goose  Diff

Differences From Artifact [a78618e0d4]:

  • File bs/llr/branch.h — part of check-in [d19a6bf065] at 2019-07-31 14:05:40 on branch trunk — Fixed some cyclic reference issues with cyclic CFGs:
    • Moved and renamed sema::CFGBuilder to llr::CFG.
    • llr::Func now owns a CFG pointer, rather than a pointer to its entry BB.
    • Branch and CondBranch now store weak pointers to their target BB.
    (user: achavasse size: 1463)

To Artifact [2275d5c04e]:

  • File bs/llr/branch.h — part of check-in [59b1c58c70] at 2019-08-01 20:25:33 on branch trunk —
    • CFGs keep track of the number of temporaries that they use
    • Temporaries indices are updated when appending a CFG to another, to avoid collisions
    • Phi now stores its result into a new temporary, instead of returning it directly (Phi has to be at the beginning of a basic block so we can't attach it directly to a value)
    (user: achavasse size: 1347)

12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
            Branch( B&& dest ) :
                m_dest( forward< B >( dest ) )
            {}

            const auto& dest() const { return m_dest; }

            bool canBeExecuted() const;

            bool canBeEagerlyEvaluated() const
            {
                return false;
            }

        private:
            wptr< BasicBlock > m_dest;
    };

    class CondBranch
    {







<
|
<
<
<







12
13
14
15
16
17
18

19



20
21
22
23
24
25
26
            Branch( B&& dest ) :
                m_dest( forward< B >( dest ) )
            {}

            const auto& dest() const { return m_dest; }

            bool canBeExecuted() const;

            bool canBeEagerlyEvaluated() const;




        private:
            wptr< BasicBlock > m_dest;
    };

    class CondBranch
    {
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
            }

            const auto& cond() const { return m_cond; }
            const auto& trueDest() const { return m_trueDest; }
            const auto& falseDest() const { return m_falseDest; }

            bool canBeExecuted() const;

            bool canBeEagerlyEvaluated() const
            {
                return false;
            }

        private:
            ir::Value m_cond;
            wptr< BasicBlock > m_trueDest;
            wptr< BasicBlock > m_falseDest;
    };
}

#endif







<
|
<
<
<









35
36
37
38
39
40
41

42



43
44
45
46
47
48
49
50
51
            }

            const auto& cond() const { return m_cond; }
            const auto& trueDest() const { return m_trueDest; }
            const auto& falseDest() const { return m_falseDest; }

            bool canBeExecuted() const;

            bool canBeEagerlyEvaluated() const;




        private:
            ir::Value m_cond;
            wptr< BasicBlock > m_trueDest;
            wptr< BasicBlock > m_falseDest;
    };
}

#endif