aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-09-08 00:08:07 +0000
committerGitHub <noreply@github.com>2022-09-08 00:08:07 +0000
commitf03760b98ba4160f08ade309daf22fedaf1cc2dd (patch)
tree9ddcf544de1b049b32b7511d6f18c01a12ceaa8d
parent8c6b017310ec3b4f77500d5fa8311e995d655c1a (diff)
parent6839ad40eebf982f149452cc294ab387350abcef (diff)
downloadgcc-f03760b98ba4160f08ade309daf22fedaf1cc2dd.zip
gcc-f03760b98ba4160f08ade309daf22fedaf1cc2dd.tar.gz
gcc-f03760b98ba4160f08ade309daf22fedaf1cc2dd.tar.bz2
Merge #1526
1526: backend: correctly formulate the exit condition r=philberty a=liushuyu - backend: correctly formulate the exit condition. Previously the exit condition was treated the same as the loop condition (which is the inverse condition of the exit condition). Now, this is corrected. Should fix #1523 Co-authored-by: liushuyu <liushuyu011@gmail.com>
-rw-r--r--gcc/rust/backend/rust-compile-expr.cc5
-rw-r--r--gcc/testsuite/rust/execute/torture/loop-condition-eval.rs21
2 files changed, 25 insertions, 1 deletions
diff --git a/gcc/rust/backend/rust-compile-expr.cc b/gcc/rust/backend/rust-compile-expr.cc
index e13c08c..660ad09 100644
--- a/gcc/rust/backend/rust-compile-expr.cc
+++ b/gcc/rust/backend/rust-compile-expr.cc
@@ -727,8 +727,11 @@ CompileExpr::visit (HIR::WhileLoopExpr &expr)
tree condition
= CompileExpr::Compile (expr.get_predicate_expr ().get (), ctx);
+ tree exit_condition
+ = fold_build1_loc (expr.get_locus ().gcc_location (), TRUTH_NOT_EXPR,
+ boolean_type_node, condition);
tree exit_expr
- = ctx->get_backend ()->exit_expression (condition, expr.get_locus ());
+ = ctx->get_backend ()->exit_expression (exit_condition, expr.get_locus ());
ctx->add_statement (exit_expr);
tree code_block_stmt
diff --git a/gcc/testsuite/rust/execute/torture/loop-condition-eval.rs b/gcc/testsuite/rust/execute/torture/loop-condition-eval.rs
new file mode 100644
index 0000000..0089659
--- /dev/null
+++ b/gcc/testsuite/rust/execute/torture/loop-condition-eval.rs
@@ -0,0 +1,21 @@
+// { dg-output "1\n" }
+pub fn test() -> u64 {
+ let mut n = 113383; // #20 in https://oeis.org/A006884
+ while n != 1 {
+ n = if n % 2 == 0 { n / 2 } else { 3 * n + 1 };
+ }
+ n
+}
+
+pub fn test_1() -> u64 {
+ test()
+}
+
+extern "C" {
+ fn printf(fmt: *const i8, ...);
+}
+
+fn main() -> i32 {
+ unsafe { printf("%lu\n" as *const str as *const i8, test_1()) }
+ 0
+}