Ignore:
Timestamp:
Jan 11, 2019, 2:16:53 PM (3 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, no_list, persistent-indexer
Children:
52ffa30
Parents:
e99e43f
Message:

Fix new cost model by boosting precedence of safe costs

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/Cost.h

    re99e43f rd97c3a4  
    2121        class Cost {
    2222          private:
    23                 Cost( int unsafeCost, int polyCost, int varCost, int specCost, int safeCost,
    24                       int referenceCost );
     23                Cost( int unsafeCost, int polyCost, int safeCost, int varCost, int specCost,
     24                        int referenceCost );
    2525
    2626          public:
    2727                Cost & incUnsafe( int inc = 1 );
    2828                Cost & incPoly( int inc = 1 );
     29                Cost & incSafe( int inc = 1 );
    2930                Cost & incVar( int inc = 1 );
    3031                Cost & decSpec( int inc = 1 );
    31                 Cost & incSafe( int inc = 1 );
    3232                Cost & incReference( int inc = 1 );
    3333
    3434                int get_unsafeCost() const { return unsafeCost; }
    3535                int get_polyCost() const { return polyCost; }
     36                int get_safeCost() const { return safeCost; }
    3637                int get_varCost() const { return varCost; }
    3738                int get_specCost() const { return specCost; }
    38                 int get_safeCost() const { return safeCost; }
    3939                int get_referenceCost() const { return referenceCost; }
    4040
     
    5454                static const Cost unsafe;
    5555                static const Cost poly;
     56                static const Cost safe;
    5657                static const Cost var;
    5758                static const Cost spec;
    58                 static const Cost safe;
    5959                static const Cost reference;
    6060
     
    6262                int unsafeCost;     ///< Unsafe (narrowing) conversions
    6363                int polyCost;       ///< Count of parameters and return values bound to some poly type
     64                int safeCost;       ///< Safe (widening) conversions
    6465                int varCost;        ///< Count of polymorphic type variables
    6566                int specCost;       ///< Polymorphic type specializations (type assertions), negative cost
    66                 int safeCost;       ///< Safe (widening) conversions
    6767                int referenceCost;  ///< reference conversions
    6868        };
    6969
    70         inline Cost::Cost( int unsafeCost, int polyCost, int varCost, int specCost, int safeCost,
     70        inline Cost::Cost( int unsafeCost, int polyCost, int safeCost, int varCost, int specCost,
    7171                        int referenceCost )
    72                 : unsafeCost( unsafeCost ), polyCost( polyCost ), varCost( varCost ), specCost( specCost ),
    73                   safeCost( safeCost ), referenceCost( referenceCost ) {}
     72                : unsafeCost( unsafeCost ), polyCost( polyCost ), safeCost( safeCost ), varCost( varCost ),
     73                  specCost( specCost ), referenceCost( referenceCost ) {}
    7474
    7575        inline Cost & Cost::incUnsafe( int inc ) {
     
    8585        }
    8686
     87        inline Cost & Cost::incSafe( int inc ) {
     88                if ( *this == infinity ) return *this;
     89                safeCost += inc;
     90                return *this;
     91        }
     92
    8793        inline Cost & Cost::incVar( int inc ) {
    8894                if ( *this == infinity ) return *this;
     
    94100                if ( *this == infinity ) return *this;
    95101                specCost -= dec;
    96                 return *this;
    97         }
    98 
    99         inline Cost & Cost::incSafe( int inc ) {
    100                 if ( *this == infinity ) return *this;
    101                 safeCost += inc;
    102102                return *this;
    103103        }
     
    112112                if ( *this == infinity || other == infinity ) return infinity;
    113113                return Cost{
    114                         unsafeCost + other.unsafeCost, polyCost + other.polyCost,
     114                        unsafeCost + other.unsafeCost, polyCost + other.polyCost, safeCost + other.safeCost,
    115115                        varCost + other.varCost, specCost + other.specCost,
    116                         safeCost + other.safeCost, referenceCost + other.referenceCost };
     116                        referenceCost + other.referenceCost };
    117117        }
    118118
     
    120120                if ( *this == infinity || other == infinity ) return infinity;
    121121                return Cost{
    122                         unsafeCost - other.unsafeCost, polyCost - other.polyCost,
     122                        unsafeCost - other.unsafeCost, polyCost - other.polyCost, safeCost - other.safeCost,
    123123                        varCost - other.varCost, specCost - other.specCost,
    124                         safeCost - other.safeCost, referenceCost - other.referenceCost };
     124                        referenceCost - other.referenceCost };
    125125        }
    126126
     
    133133                unsafeCost += other.unsafeCost;
    134134                polyCost += other.polyCost;
     135                safeCost += other.safeCost;
    135136                varCost += other.varCost;
    136137                specCost += other.specCost;
    137                 safeCost += other.safeCost;
    138138                referenceCost += other.referenceCost;
    139139                return *this;
     
    152152                } else if ( polyCost < other.polyCost ) {
    153153                        return true;
     154                } else if ( safeCost > other.safeCost ) {
     155                        return false;
     156                } else if ( safeCost < other.safeCost ) {
     157                        return true;
    154158                } else if ( varCost > other.varCost ) {
    155159                        return false;
     
    159163                        return false;
    160164                } else if ( specCost > other.specCost ) {
    161                         return true;
    162                 } else if ( safeCost > other.safeCost ) {
    163                         return false;
    164                 } else if ( safeCost < other.safeCost ) {
    165165                        return true;
    166166                } else if ( referenceCost > other.referenceCost ) {
     
    179179                int c = unsafeCost - other.unsafeCost; if ( c ) return c;
    180180                c = polyCost - other.polyCost; if ( c ) return c;
     181                c = safeCost - other.safeCost; if ( c ) return c;
    181182                c = varCost - other.varCost; if ( c ) return c;
    182183                c = specCost - other.specCost; if ( c ) return c;
    183                 c = safeCost - other.safeCost; if ( c ) return c;
    184184                return referenceCost - other.referenceCost;
    185185        }
     
    188188                return unsafeCost == other.unsafeCost
    189189                        && polyCost == other.polyCost
     190                        && safeCost == other.safeCost
    190191                        && varCost == other.varCost
    191192                        && specCost == other.specCost
    192                         && safeCost == other.safeCost
    193193                        && referenceCost == other.referenceCost;
    194194        }
     
    200200        inline std::ostream &operator<<( std::ostream &os, const Cost &cost ) {
    201201                return os << "( " << cost.unsafeCost << ", " << cost.polyCost << ", "
    202                           << cost.varCost << ", " << cost.specCost << ", "
    203                           << cost.safeCost << ", " << cost.referenceCost << " )";
     202                          << cost.safeCost << ", " << cost.varCost << ", " << cost.specCost << ", "
     203                          << cost.referenceCost << " )";
    204204        }
    205205} // namespace ResolvExpr
Note: See TracChangeset for help on using the changeset viewer.