From 94645d241320fe0617a4f158a4e1b64a643bb10f Mon Sep 17 00:00:00 2001 From: Jorropo Date: Sat, 26 Jul 2025 03:36:15 +0200 Subject: [PATCH] cmd/compile: rewrite cmov(x, x, cond) into x I don't think branchelim will intentionally generate theses. But at the time where branchelim is generating them they might different, and through opt process they become the same value. Change-Id: I4a19f1db14c08057b7e782a098f4c18ca36ab7fe Reviewed-on: https://go-review.googlesource.com/c/go/+/690519 Auto-Submit: Keith Randall Reviewed-by: Mark Freeman LUCI-TryBot-Result: Go LUCI Reviewed-by: Keith Randall Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/_gen/generic.rules | 1 + src/cmd/compile/internal/ssa/rewritegeneric.go | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/src/cmd/compile/internal/ssa/_gen/generic.rules b/src/cmd/compile/internal/ssa/_gen/generic.rules index b98dfae2d5..72d9677c5f 100644 --- a/src/cmd/compile/internal/ssa/_gen/generic.rules +++ b/src/cmd/compile/internal/ssa/_gen/generic.rules @@ -297,6 +297,7 @@ (CondSelect x _ (ConstBool [true ])) => x (CondSelect _ y (ConstBool [false])) => y +(CondSelect x x _) => x // signed integer range: ( c <= x && x (<|<=) d ) -> ( unsigned(x-c) (<|<=) unsigned(d-c) ) (AndB (Leq64 (Const64 [c]) x) ((Less|Leq)64 x (Const64 [d]))) && d >= c => ((Less|Leq)64U (Sub64 x (Const64 [c])) (Const64 [d-c])) diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index 0b9f9c09f9..bdde103a1f 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -5722,6 +5722,16 @@ func rewriteValuegeneric_OpCondSelect(v *Value) bool { v.copyOf(y) return true } + // match: (CondSelect x x _) + // result: x + for { + x := v_0 + if x != v_1 { + break + } + v.copyOf(x) + return true + } // match: (CondSelect (Add8 x (Const8 [1])) x bool) // cond: config.arch != "arm64" // result: (Add8 x (CvtBoolToUint8 bool)) -- 2.51.0