From a85afef27726b5870e02e50f8e210e0f16f89981 Mon Sep 17 00:00:00 2001 From: fanzha02 Date: Mon, 11 Mar 2019 03:51:06 +0000 Subject: [PATCH] cmd/compile: add handling for new floating-point comparisons flags The CL 164718 adds new condition flags for floating-point comparisons in arm64 backend, but dose not add the handling in rewrite.go for corresponding Ops, which causes issue 30679. And this CL fixes this issue. Fixes #30679 Change-Id: I8acc749f78227c3e9e74fa7938f05fb442fb62c6 Reviewed-on: https://go-review.googlesource.com/c/go/+/166579 Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/ssa/rewrite.go | 16 ++++++++++++++++ test/fixedbugs/issue30679.go | 18 ++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 test/fixedbugs/issue30679.go diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index dbbb33c171..8165852263 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -730,6 +730,14 @@ func arm64Negate(op Op) Op { return OpARM64NotEqual case OpARM64NotEqual: return OpARM64Equal + case OpARM64LessThanF: + return OpARM64GreaterEqualF + case OpARM64GreaterThanF: + return OpARM64LessEqualF + case OpARM64LessEqualF: + return OpARM64GreaterThanF + case OpARM64GreaterEqualF: + return OpARM64LessThanF default: panic("unreachable") } @@ -762,6 +770,14 @@ func arm64Invert(op Op) Op { return OpARM64LessEqualU case OpARM64Equal, OpARM64NotEqual: return op + case OpARM64LessThanF: + return OpARM64GreaterThanF + case OpARM64GreaterThanF: + return OpARM64LessThanF + case OpARM64LessEqualF: + return OpARM64GreaterEqualF + case OpARM64GreaterEqualF: + return OpARM64LessEqualF default: panic("unreachable") } diff --git a/test/fixedbugs/issue30679.go b/test/fixedbugs/issue30679.go new file mode 100644 index 0000000000..4d0df18f45 --- /dev/null +++ b/test/fixedbugs/issue30679.go @@ -0,0 +1,18 @@ +// compile + +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +func main() { + var f float64 + var p, q *float64 + + p = &f + if *q > 0 { + p = q + } + _ = *p +}