aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2025-10-13 09:39:06 -0700
committerKeith Randall <khr@golang.org>2025-10-13 12:19:32 -0700
commit9b8742f2e79438b9442afa4c0a0139d3937ea33f (patch)
treebe146fe856cf0e978d90bfbcb4e62fa8f489f2d9 /src/cmd/compile
parent0e64ee1286c092eca95b3ffcc5917d34f43d4c0f (diff)
downloadgo-9b8742f2e79438b9442afa4c0a0139d3937ea33f.tar.xz
cmd/compile: don't depend on arch-dependent conversions in the compiler
Leave those constant foldings for runtime, similar to how we do it for NaN generation. These are the only instances I could find in cmd/compile/..., using objdump -d ../pkg/tool/darwin_arm64/compile| egrep "(fcvtz|>:)" | grep -B1 fcvt (There are instances in other places, like runtime and reflect, but I don't think those places would affect compiler output.) Change-Id: I4113fe4570115e4765825cf442cb1fde97cf2f27 Reviewed-on: https://go-review.googlesource.com/c/go/+/711281 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: David Chase <drchase@google.com> Reviewed-by: Keith Randall <khr@google.com>
Diffstat (limited to 'src/cmd/compile')
-rw-r--r--src/cmd/compile/internal/ssa/_gen/generic.rules8
-rw-r--r--src/cmd/compile/internal/ssa/rewritegeneric.go16
2 files changed, 20 insertions, 4 deletions
diff --git a/src/cmd/compile/internal/ssa/_gen/generic.rules b/src/cmd/compile/internal/ssa/_gen/generic.rules
index 23ce21a8b2..af9c24f53f 100644
--- a/src/cmd/compile/internal/ssa/_gen/generic.rules
+++ b/src/cmd/compile/internal/ssa/_gen/generic.rules
@@ -50,10 +50,10 @@
(Cvt32to64F (Const32 [c])) => (Const64F [float64(c)])
(Cvt64to32F (Const64 [c])) => (Const32F [float32(c)])
(Cvt64to64F (Const64 [c])) => (Const64F [float64(c)])
-(Cvt32Fto32 (Const32F [c])) => (Const32 [int32(c)])
-(Cvt32Fto64 (Const32F [c])) => (Const64 [int64(c)])
-(Cvt64Fto32 (Const64F [c])) => (Const32 [int32(c)])
-(Cvt64Fto64 (Const64F [c])) => (Const64 [int64(c)])
+(Cvt32Fto32 (Const32F [c])) && c >= -1<<31 && c < 1<<31 => (Const32 [int32(c)])
+(Cvt32Fto64 (Const32F [c])) && c >= -1<<63 && c < 1<<63 => (Const64 [int64(c)])
+(Cvt64Fto32 (Const64F [c])) && c >= -1<<31 && c < 1<<31 => (Const32 [int32(c)])
+(Cvt64Fto64 (Const64F [c])) && c >= -1<<63 && c < 1<<63 => (Const64 [int64(c)])
(Round32F x:(Const32F)) => x
(Round64F x:(Const64F)) => x
(CvtBoolToUint8 (ConstBool [false])) => (Const8 [0])
diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go
index c36ecc1cc6..79c444a86b 100644
--- a/src/cmd/compile/internal/ssa/rewritegeneric.go
+++ b/src/cmd/compile/internal/ssa/rewritegeneric.go
@@ -6607,12 +6607,16 @@ func rewriteValuegeneric_OpCtz8(v *Value) bool {
func rewriteValuegeneric_OpCvt32Fto32(v *Value) bool {
v_0 := v.Args[0]
// match: (Cvt32Fto32 (Const32F [c]))
+ // cond: c >= -1<<31 && c < 1<<31
// result: (Const32 [int32(c)])
for {
if v_0.Op != OpConst32F {
break
}
c := auxIntToFloat32(v_0.AuxInt)
+ if !(c >= -1<<31 && c < 1<<31) {
+ break
+ }
v.reset(OpConst32)
v.AuxInt = int32ToAuxInt(int32(c))
return true
@@ -6622,12 +6626,16 @@ func rewriteValuegeneric_OpCvt32Fto32(v *Value) bool {
func rewriteValuegeneric_OpCvt32Fto64(v *Value) bool {
v_0 := v.Args[0]
// match: (Cvt32Fto64 (Const32F [c]))
+ // cond: c >= -1<<63 && c < 1<<63
// result: (Const64 [int64(c)])
for {
if v_0.Op != OpConst32F {
break
}
c := auxIntToFloat32(v_0.AuxInt)
+ if !(c >= -1<<63 && c < 1<<63) {
+ break
+ }
v.reset(OpConst64)
v.AuxInt = int64ToAuxInt(int64(c))
return true
@@ -6682,12 +6690,16 @@ func rewriteValuegeneric_OpCvt32to64F(v *Value) bool {
func rewriteValuegeneric_OpCvt64Fto32(v *Value) bool {
v_0 := v.Args[0]
// match: (Cvt64Fto32 (Const64F [c]))
+ // cond: c >= -1<<31 && c < 1<<31
// result: (Const32 [int32(c)])
for {
if v_0.Op != OpConst64F {
break
}
c := auxIntToFloat64(v_0.AuxInt)
+ if !(c >= -1<<31 && c < 1<<31) {
+ break
+ }
v.reset(OpConst32)
v.AuxInt = int32ToAuxInt(int32(c))
return true
@@ -6732,12 +6744,16 @@ func rewriteValuegeneric_OpCvt64Fto32F(v *Value) bool {
func rewriteValuegeneric_OpCvt64Fto64(v *Value) bool {
v_0 := v.Args[0]
// match: (Cvt64Fto64 (Const64F [c]))
+ // cond: c >= -1<<63 && c < 1<<63
// result: (Const64 [int64(c)])
for {
if v_0.Op != OpConst64F {
break
}
c := auxIntToFloat64(v_0.AuxInt)
+ if !(c >= -1<<63 && c < 1<<63) {
+ break
+ }
v.reset(OpConst64)
v.AuxInt = int64ToAuxInt(int64(c))
return true