Skip to content

Commit 8d929e7

Browse files
joaomhmpereirafilipeom
authored andcommitted
Add simplification cases for Nan and Infinity floats
1 parent 4210c9d commit 8d929e7

File tree

1 file changed

+20
-14
lines changed

1 file changed

+20
-14
lines changed

lib/expr.ml

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -356,17 +356,21 @@ let relop' (ty : Ty.t) (op : relop) (hte1 : t) (hte2 : t) : t =
356356
[@@inline]
357357

358358
let rec relop ty (op : relop) (hte1 : t) (hte2 : t) : t =
359-
match (view hte1, view hte2) with
360-
| Val (App (`Op s1, _)), Val (App (`Op s2, _)) ->
361-
if String.equal s1 s2 then value (if op = Eq then True else False)
362-
else relop' ty op hte1 hte2
363-
| Val (App _), Val _ | Val _, Val (App _) -> (
364-
match op with
365-
| Eq -> value False
366-
| Ne -> value True
367-
| _ -> relop' ty op hte1 hte2 )
368-
| Val v1, Val v2 -> value (if Eval.relop ty op v1 v2 then True else False)
369-
| Ptr { base = b1; offset = os1 }, Ptr { base = b2; offset = os2 } -> (
359+
match (op, view hte1, view hte2) with
360+
| Eq, Val (App (`Op s1, _)), Val (App (`Op s2, _)) ->
361+
if String.equal s1 s2 then value True else value False
362+
| Ne, Val (App (`Op s1, _)), Val (App (`Op s2, _)) ->
363+
if String.equal s1 s2 then value False else value True
364+
| Eq, Val (App _), Val _ | Eq, Val _, Val (App _) -> value False
365+
| Ne, Val (App _), Val _ | Ne, Val _, Val (App _) -> value True
366+
| (Ne, Val (Real v), Symbol _ | Ne, Symbol _, Val (Real v))
367+
when Float.is_nan v || Float.is_infinite v ->
368+
value True
369+
| (_, Val (Real v), Symbol _ | _, Symbol _, Val (Real v))
370+
when Float.is_nan v || Float.is_infinite v ->
371+
value False
372+
| _, Val v1, Val v2 -> value (if Eval.relop ty op v1 v2 then True else False)
373+
| _, Ptr { base = b1; offset = os1 }, Ptr { base = b2; offset = os2 } -> (
370374
match op with
371375
| Eq -> if b1 = b2 then relop' ty Eq os1 os2 else value False
372376
| Ne -> if b1 = b2 then relop' ty Ne os1 os2 else value True
@@ -377,13 +381,15 @@ let rec relop ty (op : relop) (hte1 : t) (hte2 : t) : t =
377381
( if Eval.relop ty op (Num (I32 b1)) (Num (I32 b2)) then True
378382
else False )
379383
| _ -> relop' ty op hte1 hte2 )
380-
| Val (Num _ as n), Ptr { base; offset = { node = Val (Num _ as o); _ } } ->
384+
| _, Val (Num _ as n), Ptr { base; offset = { node = Val (Num _ as o); _ } }
385+
->
381386
let base = Eval.binop (Ty_bitv 32) Add (Num (I32 base)) o in
382387
value (if Eval.relop ty op n base then True else False)
383-
| Ptr { base; offset = { node = Val (Num _ as o); _ } }, Val (Num _ as n) ->
388+
| _, Ptr { base; offset = { node = Val (Num _ as o); _ } }, Val (Num _ as n)
389+
->
384390
let base = Eval.binop (Ty_bitv 32) Add (Num (I32 base)) o in
385391
value (if Eval.relop ty op base n then True else False)
386-
| _ -> relop' ty op hte1 hte2
392+
| _, _, _ -> relop' ty op hte1 hte2
387393

388394
let cvtop' (ty : Ty.t) (op : cvtop) (hte : t) : t = make (Cvtop (ty, op, hte))
389395
[@@inline]

0 commit comments

Comments
 (0)