Skip to content

Commit db8aba1

Browse files
authored
removed unary negation from flambda (#3572)
1 parent 35b8685 commit db8aba1

14 files changed

+403
-451
lines changed

middle_end/flambda2/from_lambda/lambda_to_flambda_primitives.ml

+10-7
Original file line numberDiff line numberDiff line change
@@ -539,11 +539,6 @@ let box_vec128 mode (arg : H.expr_primitive) ~current_region : H.expr_primitive
539539
let unbox_vec128 (arg : H.simple_or_prim) : H.simple_or_prim =
540540
Prim (Unary (Unbox_number Naked_vec128, arg))
541541

542-
let bint_unary_prim bi mode prim arg1 =
543-
box_bint bi mode
544-
(Unary
545-
(Int_arith (standard_int_of_boxed_integer bi, prim), unbox_bint bi arg1))
546-
547542
let bint_binary_prim bi mode prim arg1 arg2 =
548543
box_bint bi mode
549544
(Binary
@@ -1547,7 +1542,10 @@ let convert_lprim ~big_endian (prim : L.primitive) (args : Simple.t list list)
15471542
Printlambda.primitive prim
15481543
in
15491544
[Unary (Duplicate_block { kind }, arg)]
1550-
| Pnegint, [[arg]] -> [Unary (Int_arith (I.Tagged_immediate, Neg), arg)]
1545+
| Pnegint, [[arg]] ->
1546+
let kind = I.Tagged_immediate in
1547+
let zero = Simple.const_int_of_kind (I.to_kind kind) 0 in
1548+
[Binary (Int_arith (kind, Sub), Simple zero, arg)]
15511549
| Paddint, [[arg1]; [arg2]] ->
15521550
[Binary (Int_arith (I.Tagged_immediate, Add), arg1, arg2)]
15531551
| Psubint, [[arg1]; [arg2]] ->
@@ -1890,7 +1888,12 @@ let convert_lprim ~big_endian (prim : L.primitive) (args : Simple.t list list)
18901888
unbox_bint source arg ))
18911889
~current_region ]
18921890
| Pnegbint (bi, mode), [[arg]] ->
1893-
[bint_unary_prim bi mode Neg arg ~current_region]
1891+
let size = standard_int_of_boxed_integer bi in
1892+
[ box_bint bi mode ~current_region
1893+
(Binary
1894+
( Int_arith (size, Sub),
1895+
Simple (Simple.const_int_of_kind (I.to_kind size) 0),
1896+
unbox_bint bi arg )) ]
18941897
| Paddbint (bi, mode), [[arg1]; [arg2]] ->
18951898
[bint_binary_prim bi mode Add arg1 arg2 ~current_region]
18961899
| Psubbint (bi, mode), [[arg1]; [arg2]] ->

middle_end/flambda2/parser/fexpr.ml

-1
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,6 @@ type signed_or_unsigned = Flambda_primitive.signed_or_unsigned =
270270
| Unsigned
271271

272272
type unary_int_arith_op = Flambda_primitive.unary_int_arith_op =
273-
| Neg
274273
| Swap_byte_endianness
275274

276275
type array_kind_for_length = Flambda_primitive.Array_kind_for_length.t =

middle_end/flambda2/parser/flambda_parser.ml

+377-406
Large diffs are not rendered by default.

middle_end/flambda2/parser/flambda_parser.mly

-1
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,6 @@ recursive:
386386

387387
unary_int_arith_op:
388388
| KWD_BSWAP { Swap_byte_endianness }
389-
| TILDEMINUS { Neg }
390389

391390
unop:
392391
| PRIM_ARRAY_LENGTH; kind = array_kind_for_length { Array_length kind }

middle_end/flambda2/parser/print_fexpr.ml

+1-2
Original file line numberDiff line numberDiff line change
@@ -557,8 +557,7 @@ let binop ppf binop a b =
557557
a simple b
558558

559559
let unary_int_arith_op ppf (o : unary_int_arith_op) =
560-
Format.pp_print_string ppf
561-
@@ match o with Neg -> "~-" | Swap_byte_endianness -> "bswap"
560+
Format.pp_print_string ppf @@ match o with Swap_byte_endianness -> "bswap"
562561

563562
let unop ppf u =
564563
let str s = Format.pp_print_string ppf s in

middle_end/flambda2/simplify/simplify_binary_primitive.ml

+6-1
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,13 @@ end = struct
195195
"Cannot use [Negation_of_the_other_side] with floats; \
196196
use the float version instead"
197197
in
198+
let zero =
199+
Simple.const_int_of_kind
200+
(K.Standard_int.to_kind standard_int_kind)
201+
0
202+
in
198203
let prim : P.t =
199-
Unary (Int_arith (standard_int_kind, Neg), other_side)
204+
Binary (Int_arith (standard_int_kind, Sub), zero, other_side)
200205
in
201206
Some (PR.Set.add (Prim prim) possible_results)
202207
| Float_negation_of_the_other_side width ->

middle_end/flambda2/simplify/simplify_unary_primitive.ml

+1-3
Original file line numberDiff line numberDiff line change
@@ -275,9 +275,7 @@ module Unary_int_arith (I : A.Int_number_kind) = struct
275275
| Known_result ints ->
276276
assert (not (I.Num.Set.is_empty ints));
277277
let f =
278-
match op with
279-
| Neg -> I.Num.neg
280-
| Swap_byte_endianness -> I.Num.swap_byte_endianness
278+
match op with Swap_byte_endianness -> I.Num.swap_byte_endianness
281279
in
282280
let possible_results = I.Num.Set.map f ints in
283281
let ty = I.these_unboxed possible_results in

middle_end/flambda2/terms/code_size.ml

-4
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,12 @@ let unary_int_prim_size kind op =
6666
( (kind : Flambda_kind.Standard_int.t),
6767
(op : Flambda_primitive.unary_int_arith_op) )
6868
with
69-
| Tagged_immediate, Neg -> 1
7069
| Tagged_immediate, Swap_byte_endianness ->
7170
(* CR pchambart: size depends a lot of the architecture. If the backend
7271
handles it, this is a single arith op. *)
7372
2 + does_not_need_caml_c_call_extcall_size + 1
74-
| Naked_immediate, Neg -> 1
7573
| Naked_immediate, Swap_byte_endianness ->
7674
does_not_need_caml_c_call_extcall_size + 1
77-
| Naked_int64, Neg when arch32 -> does_not_need_caml_c_call_extcall_size + 1
78-
| (Naked_int32 | Naked_int64 | Naked_nativeint), Neg -> 1
7975
| (Naked_int32 | Naked_int64 | Naked_nativeint), Swap_byte_endianness ->
8076
does_not_need_caml_c_call_extcall_size + 1
8177

middle_end/flambda2/terms/flambda_primitive.ml

+3-7
Original file line numberDiff line numberDiff line change
@@ -878,15 +878,11 @@ type num_dimensions = int
878878

879879
let print_num_dimensions ppf d = Format.fprintf ppf "%d" d
880880

881-
type unary_int_arith_op =
882-
| Neg
883-
| Swap_byte_endianness
881+
type unary_int_arith_op = Swap_byte_endianness
884882

885883
let print_unary_int_arith_op ppf o =
886884
let fprintf = Format.fprintf in
887-
match o with
888-
| Neg -> fprintf ppf "~-"
889-
| Swap_byte_endianness -> fprintf ppf "bswap"
885+
match o with Swap_byte_endianness -> fprintf ppf "bswap"
890886

891887
type unary_float_arith_op =
892888
| Abs
@@ -1424,7 +1420,7 @@ let effects_and_coeffects_of_unary_primitive p : Effects_and_coeffects.t =
14241420
| Int_as_pointer alloc_mode ->
14251421
No_effects, coeffects_of_mode alloc_mode, Strict
14261422
| Opaque_identity _ -> Arbitrary_effects, Has_coeffects, Strict
1427-
| Int_arith (_, (Neg | Swap_byte_endianness))
1423+
| Int_arith (_, Swap_byte_endianness)
14281424
| Num_conv _ | Boolean_not | Reinterpret_64_bit_word _ ->
14291425
No_effects, No_coeffects, Strict
14301426
| Float_arith (_width, (Abs | Neg)) ->

middle_end/flambda2/terms/flambda_primitive.mli

+1-3
Original file line numberDiff line numberDiff line change
@@ -339,9 +339,7 @@ type nullary_primitive =
339339
encoding a 16-bit quantity (described in the least significant 16 bits of
340340
the immediate after untagging) and exchanges the two halves of the 16-bit
341341
quantity. The higher-order bits are zeroed. *)
342-
type unary_int_arith_op =
343-
| Neg
344-
| Swap_byte_endianness
342+
type unary_int_arith_op = Swap_byte_endianness
345343

346344
(** Naked float unary arithmetic operations. *)
347345
type unary_float_arith_op =

middle_end/flambda2/tests/mlexamples/tests15.flt

+2-2
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ let code size(2)
7575
my_closure my_region my_ghost_region my_depth
7676
-> k * k1
7777
: imm tagged =
78-
let Pnegint = %int_arith ~- x in
78+
let Pnegint = 0 - x in
7979
cont k (Pnegint)
8080
in
8181
let code size(2)
@@ -202,7 +202,7 @@ let code loopify(never) size(2) newer_version_of(negate_5)
202202
my_closure my_region my_ghost_region my_depth
203203
-> k * k1
204204
: imm tagged =
205-
let Pnegint = %int_arith ~- x in
205+
let Pnegint = 0 - x in
206206
cont k (Pnegint)
207207
in
208208
let $camlTests15__negate_12 = closure negate_5_1 @negate in

middle_end/flambda2/tests/mlexamples/tests15_in.fl

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ let code size(2)
7575
my_closure my_region my_ghost_region my_depth
7676
-> k * k1
7777
: imm tagged =
78-
let Pnegint = %int_arith ~- x in
78+
let Pnegint = 0 - x in
7979
cont k (Pnegint)
8080
in
8181
let code size(2)

middle_end/flambda2/tests/mlexamples/tests15_out.fl

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ let code loopify(never) size(2) newer_version_of(negate_5)
7474
my_closure my_region my_ghost_region my_depth
7575
-> k * k1
7676
: imm tagged =
77-
let Pnegint = %int_arith ~- x in
77+
let Pnegint = 0 - x in
7878
cont k (Pnegint)
7979
in
8080
let $camlTests15__negate_12 = closure negate_5_1 @negate in

middle_end/flambda2/to_cmm/to_cmm_primitive.ml

-12
Original file line numberDiff line numberDiff line change
@@ -555,18 +555,6 @@ let scalar_type_of_standard_int_or_float :
555555

556556
let unary_int_arith_primitive _env dbg kind op arg =
557557
match (op : P.unary_int_arith_op) with
558-
| Neg -> (
559-
match integral_of_standard_int kind with
560-
| Tagged src ->
561-
C.Scalar_type.Tagged_integer.conjugate ~dbg ~outer:src
562-
~inner:C.Scalar_type.Tagged_integer.immediate
563-
~f:(fun x -> C.negint x dbg)
564-
arg
565-
| Untagged src ->
566-
let bits = C.Scalar_type.Integer.bit_width src in
567-
C.Scalar_type.Integer.conjugate arg ~outer:src
568-
~inner:C.Scalar_type.Integer.nativeint ~dbg ~f:(fun arg ->
569-
C.neg_int (C.low_bits ~bits arg ~dbg) dbg))
570558
| Swap_byte_endianness -> (
571559
match (kind : K.Standard_int.t) with
572560
| Tagged_immediate ->

0 commit comments

Comments
 (0)