diff options
author | John Hodge <tpg@mutabah.net> | 2016-12-31 18:30:42 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-12-31 18:30:42 +0800 |
commit | ad264bcc69545a2695115b72fdd286c09df062bd (patch) | |
tree | 3a322fe0398f3c791ea21061e8848ddd49dc7004 /src/mir/mir.cpp | |
parent | e35aa35f97133edc36e206ab38b1fa8ab9d88df5 (diff) | |
download | mrust-ad264bcc69545a2695115b72fdd286c09df062bd.tar.gz |
MIR Optimise - Allow assignment elimination with variables
Diffstat (limited to 'src/mir/mir.cpp')
-rw-r--r-- | src/mir/mir.cpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/mir/mir.cpp b/src/mir/mir.cpp index c878950f..d5aae815 100644 --- a/src/mir/mir.cpp +++ b/src/mir/mir.cpp @@ -84,6 +84,49 @@ namespace MIR { ) return os; } + bool operator<(const LValue& a, const LValue& b) + { + if( a.tag() != b.tag() ) + return a.tag() < b.tag(); + TU_MATCHA( (a, b), (ea, eb), + (Variable, + return ea < eb; + ), + (Temporary, + return ea.idx < eb.idx; + ), + (Argument, + return ea.idx < eb.idx; + ), + (Static, + return ea < eb; + ), + (Return, + return false; + ), + (Field, + if( *ea.val != *eb.val ) + return *ea.val < *eb.val; + if( ea.field_index != eb.field_index ) + return ea.field_index < eb.field_index; + return true; + ), + (Deref, + return *ea.val < *eb.val; + ), + (Index, + if( *ea.val != *eb.val ) + return *ea.val < *eb.val; + return *ea.idx < *eb.idx; + ), + (Downcast, + if( *ea.val != *eb.val ) + return *ea.val < *eb.val; + return ea.variant_index < eb.variant_index; + ) + ) + throw ""; + } bool operator==(const LValue& a, const LValue& b) { if( a.tag() != b.tag() ) |