From: Philip Herron <herron.phi...@googlemail.com>

This will be crucial for more complex gimple debugging to make it easier
to follow the code vs the original rust code.

gcc/rust/ChangeLog:

        * backend/rust-compile-expr.cc (CompileExpr::visit): disable overflow 
checks
        * lang.opt: new flag

Signed-off-by: Philip Herron <herron.phi...@googlemail.com>
---
 gcc/rust/backend/rust-compile-expr.cc | 33 ++++++++++++++-------------
 gcc/rust/lang.opt                     |  4 ++++
 2 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/gcc/rust/backend/rust-compile-expr.cc 
b/gcc/rust/backend/rust-compile-expr.cc
index 887e476f234..29cc8835c33 100644
--- a/gcc/rust/backend/rust-compile-expr.cc
+++ b/gcc/rust/backend/rust-compile-expr.cc
@@ -159,27 +159,28 @@ CompileExpr::visit (HIR::ArithmeticOrLogicalExpr &expr)
       return;
     }
 
-  if (ctx->in_fn () && !ctx->const_context_p ())
-    {
-      auto receiver_tmp = NULL_TREE;
-      auto receiver
-       = Backend::temporary_variable (ctx->peek_fn ().fndecl, NULL_TREE,
-                                      TREE_TYPE (lhs), lhs, true,
-                                      expr.get_locus (), &receiver_tmp);
-      auto check
-       = Backend::arithmetic_or_logical_expression_checked (op, lhs, rhs,
-                                                            expr.get_locus (),
-                                                            receiver);
-
-      ctx->add_statement (check);
-      translated = receiver->get_tree (expr.get_locus ());
-    }
-  else
+  bool can_generate_overflow_checks
+    = (ctx->in_fn () && !ctx->const_context_p ()) && flag_overflow_checks;
+  if (!can_generate_overflow_checks)
     {
       translated
        = Backend::arithmetic_or_logical_expression (op, lhs, rhs,
                                                     expr.get_locus ());
+      return;
     }
+
+  auto receiver_tmp = NULL_TREE;
+  auto receiver
+    = Backend::temporary_variable (ctx->peek_fn ().fndecl, NULL_TREE,
+                                  TREE_TYPE (lhs), lhs, true,
+                                  expr.get_locus (), &receiver_tmp);
+  auto check
+    = Backend::arithmetic_or_logical_expression_checked (op, lhs, rhs,
+                                                        expr.get_locus (),
+                                                        receiver);
+
+  ctx->add_statement (check);
+  translated = receiver->get_tree (expr.get_locus ());
 }
 
 void
diff --git a/gcc/rust/lang.opt b/gcc/rust/lang.opt
index 0e9aab48dfb..9cdbce2bc0a 100644
--- a/gcc/rust/lang.opt
+++ b/gcc/rust/lang.opt
@@ -225,4 +225,8 @@ Enum(frust_panic) String(unwind) Value(0)
 EnumValue
 Enum(frust_panic) String(abort) Value(1)
 
+frust-overflow-checks
+Rust Var(flag_overflow_checks) Init(1)
+Enable the overflow checks in code generation
+
 ; This comment is to ensure we retain the blank line above.
-- 
2.45.2

Reply via email to