Goose  Diff

Differences From Artifact [5d55fd20a8]:

  • File bs/codegen/stack.h — part of check-in [2a03dd67e5] at 2022-06-28 22:23:50 on branch cir-stack-language — codegen: improved the translation of address computations into llvm GEP instructions (user: zlodo size: 1792) [more...]

To Artifact [0990ce7032]:

  • File bs/codegen/stack.h — part of check-in [9b8306c3af] at 2023-01-05 19:44:44 on branch trunk — Fixed passing tuple by value to functions, which involved properly handling type checking of constant tuples containing computed data and some codegen bugs (user: zlodo size: 2177)

24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
                    return get< codegen::Address >( result );
                }
                else if constexpr( is_same_v< T, llvm::Value* > )
                {
                    if( holds_alternative< codegen::Address >( result ) )
                        return AddressToGEP( builder, get< codegen::Address >( result ) );
                    else
                        return get< llvm::Value* >( result );
                }
                else if( holds_alternative< llvm::Value* >( result ) )
                    return llvm::dyn_cast_or_null< remove_pointer_t< T > >( get< llvm::Value* >( result ) );

                return nullopt;
            }

            optional< Slot > pop()
            {
                if( m_stack.empty() )







|


|







24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
                    return get< codegen::Address >( result );
                }
                else if constexpr( is_same_v< T, llvm::Value* > )
                {
                    if( holds_alternative< codegen::Address >( result ) )
                        return AddressToGEP( builder, get< codegen::Address >( result ) );
                    else
                        return InsertLoadIfNeeded( builder, get< llvm::Value* >( result ) );
                }
                else if( holds_alternative< llvm::Value* >( result ) )
                    return llvm::dyn_cast_or_null< remove_pointer_t< T > >( InsertLoadIfNeeded( builder, get< llvm::Value* >( result ) ) );

                return nullopt;
            }

            optional< Slot > pop()
            {
                if( m_stack.empty() )
49
50
51
52
53
54
55







56
57
58
59
60
            template< typename T >
            void push( T&& v )
            {
                m_stack.push( forward< T >( v ) );
            }

        private:







            stack< Slot > m_stack;
    };
}

#endif







>
>
>
>
>
>
>





49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
            template< typename T >
            void push( T&& v )
            {
                m_stack.push( forward< T >( v ) );
            }

        private:
            static llvm::Value* InsertLoadIfNeeded( llvm::IRBuilder<>& builder, llvm::Value* lv )
            {
                if( llvm::isa< llvm::AllocaInst >( lv ) )
                    return builder.CreateLoad( llvm::cast< llvm::AllocaInst >( lv )->getAllocatedType(), lv );
                return lv;
            }

            stack< Slot > m_stack;
    };
}

#endif