compiler: permit inlining constant expressions and expression statements

This relatively minor change increases the number of inlinable
functions/methods in the standard library from 983 to 2179.

In particular it permits inlining math/bits/RotateLeftNN.  This
restores the speed of crypto/sha256 back to what it was before the
update to 1.13beta1.

Change-Id: I5a1c68ab602a090b02a9e78e45ba813d4f7f8c5b
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/194340
Reviewed-by: Than McIntosh <thanm@google.com>
diff --git a/go/expressions.cc b/go/expressions.cc
index cb09ec0..7d8963e 100644
--- a/go/expressions.cc
+++ b/go/expressions.cc
@@ -3283,6 +3283,10 @@
   Bexpression*
   do_get_backend(Translate_context* context);
 
+  int
+  do_inlining_cost() const
+  { return 1; }
+
   // When exporting a reference to a const as part of a const
   // expression, we export the value.  We ignore the fact that it has
   // a name.
diff --git a/go/statements.cc b/go/statements.cc
index 27c309e..3dc394a 100644
--- a/go/statements.cc
+++ b/go/statements.cc
@@ -158,6 +158,10 @@
     return Goto_statement::do_import(ifb, loc);
 
   Expression* lhs = Expression::import_expression(ifb, loc);
+
+  if (ifb->match_c_string(" //"))
+    return Statement::make_statement(lhs, true);
+
   ifb->require_c_string(" = ");
   Expression* rhs = Expression::import_expression(ifb, loc);
   return Statement::make_assignment(lhs, rhs, loc);
@@ -2089,6 +2093,14 @@
   return true;
 }
 
+// Export an expression statement.
+
+void
+Expression_statement::do_export_statement(Export_function_body* efb)
+{
+  this->expr_->export_expression(efb);
+}
+
 // Convert to backend representation.
 
 Bstatement*
diff --git a/go/statements.h b/go/statements.h
index 311bbaa..f1c6be9 100644
--- a/go/statements.h
+++ b/go/statements.h
@@ -924,6 +924,13 @@
   bool
   do_may_fall_through() const;
 
+  int
+  do_inlining_cost()
+  { return 0; }
+
+  void
+  do_export_statement(Export_function_body*);
+
   Bstatement*
   do_get_backend(Translate_context* context);