summaryrefslogtreecommitdiff
path: root/src/mir/mir.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-12-31 18:30:42 +0800
committerJohn Hodge <tpg@mutabah.net>2016-12-31 18:30:42 +0800
commitad264bcc69545a2695115b72fdd286c09df062bd (patch)
tree3a322fe0398f3c791ea21061e8848ddd49dc7004 /src/mir/mir.cpp
parente35aa35f97133edc36e206ab38b1fa8ab9d88df5 (diff)
downloadmrust-ad264bcc69545a2695115b72fdd286c09df062bd.tar.gz
MIR Optimise - Allow assignment elimination with variables
Diffstat (limited to 'src/mir/mir.cpp')
-rw-r--r--src/mir/mir.cpp43
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() )