|
4 | 4 |
|
5 | 5 | open Prelude.Ana |
6 | 6 | open Analyses |
| 7 | +open Cilint |
7 | 8 |
|
8 | 9 | module Spec : Analyses.MCPSpec = |
9 | 10 | struct |
@@ -57,25 +58,26 @@ struct |
57 | 58 | Basetype.CilExp.equal (canonize e1) (canonize e2) |
58 | 59 | | Queries.MayBeLess (e1, e2) when not (isFloat e1) -> |
59 | 60 | begin |
| 61 | + (* Compare the cilint first in the hope that it is cheaper than the LVal comparison *) |
60 | 62 | match e1, e2 with |
61 | | - | BinOp(PlusA, Lval l1, Const(CInt64(i,_,_)), _), Lval l2 when (lvalsEq l1 l2 && Int64.compare i Int64.zero > 0) -> |
| 63 | + | BinOp(PlusA, Lval l1, Const(CInt(i,_,_)), _), Lval l2 when (compare_cilint i zero_cilint > 0 && lvalsEq l1 l2) -> |
62 | 64 | false (* c > 0 => (! x+c < x) *) |
63 | | - | Lval l1, BinOp(PlusA, Lval l2, Const(CInt64(i,_,_)), _) when (lvalsEq l1 l2 && Int64.compare i Int64.zero < 0) -> |
| 65 | + | Lval l1, BinOp(PlusA, Lval l2, Const(CInt(i,_,_)), _) when (compare_cilint i zero_cilint < 0 && lvalsEq l1 l2) -> |
64 | 66 | false (* c < 0 => (! x < x+c )*) |
65 | | - | BinOp(MinusA, Lval l1, Const(CInt64(i,_,_)), _), Lval l2 when (lvalsEq l1 l2 && Int64.compare i Int64.zero < 0) -> |
| 67 | + | BinOp(MinusA, Lval l1, Const(CInt(i,_,_)), _), Lval l2 when (compare_cilint i zero_cilint < 0 && lvalsEq l1 l2) -> |
66 | 68 | false (* c < 0 => (! x-c < x) *) |
67 | | - | Lval l1, BinOp(MinusA, Lval l2, Const(CInt64(i,_,_)), _) when (lvalsEq l1 l2 && Int64.compare i Int64.zero > 0) -> |
| 69 | + | Lval l1, BinOp(MinusA, Lval l2, Const(CInt(i,_,_)), _) when (compare_cilint i zero_cilint > 0 && lvalsEq l1 l2) -> |
68 | 70 | false (* c < 0 => (! x < x-c) *) |
69 | 71 | | _ -> |
70 | 72 | true |
71 | 73 | end |
72 | 74 | | Queries.MayBeEqual (e1,e2) when not (isFloat e1) -> |
73 | 75 | begin |
74 | 76 | match e1,e2 with |
75 | | - | BinOp(PlusA, Lval l1, Const(CInt64(i,_,_)), _), Lval l2 |
76 | | - | Lval l2, BinOp(PlusA, Lval l1, Const(CInt64(i,_,_)), _) |
77 | | - | BinOp(MinusA, Lval l1, Const(CInt64(i,_,_)), _), Lval l2 |
78 | | - | Lval l2, BinOp(MinusA, Lval l1, Const(CInt64(i,_,_)), _) when (lvalsEq l1 l2) && Int64.compare i Int64.zero <> 0 -> |
| 77 | + | BinOp(PlusA, Lval l1, Const(CInt(i,_,_)), _), Lval l2 |
| 78 | + | Lval l2, BinOp(PlusA, Lval l1, Const(CInt(i,_,_)), _) |
| 79 | + | BinOp(MinusA, Lval l1, Const(CInt(i,_,_)), _), Lval l2 |
| 80 | + | Lval l2, BinOp(MinusA, Lval l1, Const(CInt(i,_,_)), _) when compare_cilint i zero_cilint <> 0 && (lvalsEq l1 l2) -> |
79 | 81 | false |
80 | 82 | | _ -> true |
81 | 83 | end |
|
0 commit comments