From ad264bcc69545a2695115b72fdd286c09df062bd Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sat, 31 Dec 2016 18:30:42 +0800 Subject: MIR Optimise - Allow assignment elimination with variables --- src/mir/mir.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'src/mir/mir.cpp') 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() ) -- cgit v1.2.3