summaryrefslogtreecommitdiff
path: root/cparser/SimplExpr.ml
diff options
context:
space:
mode:
authorGravatar xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2010-04-02 07:55:14 +0000
committerGravatar xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2010-04-02 07:55:14 +0000
commite7b822497b940e181dab799a8c17dc49e2062f0a (patch)
tree435131d5b79a3305fd97fa8441cb9115fafdb19d /cparser/SimplExpr.ml
parentc5b0c22b818f5a7a07da999c562abad9ed757715 (diff)
In cparser/SimplExpr.ml:
- wrong simplification of && and || in the Set case - generated nicer code for && and || in the Eval case git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@1308 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
Diffstat (limited to 'cparser/SimplExpr.ml')
-rw-r--r--cparser/SimplExpr.ml26
1 files changed, 15 insertions, 11 deletions
diff --git a/cparser/SimplExpr.ml b/cparser/SimplExpr.ml
index 484e2d8..330b184 100644
--- a/cparser/SimplExpr.ml
+++ b/cparser/SimplExpr.ml
@@ -90,6 +90,10 @@ let simpl_expr loc env e act =
let new_temp ty =
Transform.new_temp (erase_attributes_type env ty) in
+ let eboolvalof e =
+ { edesc = EBinop(One, e, intconst 0L IInt, TInt(IInt, []));
+ etyp = TInt(IInt, []) } in
+
let sseq s1 s2 = Cutil.sseq loc s1 s2 in
let sassign e1 e2 =
@@ -265,14 +269,14 @@ let simpl_expr loc env e act =
let (s2, e2') = simpl e2 RHS in
let tmp = new_temp e.etyp in
(sseq s1 (sif e1'
- (sseq s2 (sif e2'
- (sassign tmp (intconst 1L IInt))
- (sassign tmp (intconst 0L IInt))))
- (sassign tmp (intconst 0L IInt))),
+ (sseq s2 (sassign tmp (eboolvalof e2')))
+ (sassign tmp (intconst 0L IInt))),
tmp)
| Set lv ->
- let (s2, _) = simpl e2 (Set lv) in
- (sseq s1 (sif e1' s2 (sassign lv (intconst 0L IInt))),
+ let (s2, e2') = simpl e2 RHS in
+ (sseq s1 (sif e1'
+ (sseq s2 (sassign lv (eboolvalof e2')))
+ (sassign lv (intconst 0L IInt))),
voidconst)
end
@@ -291,13 +295,13 @@ let simpl_expr loc env e act =
let tmp = new_temp e.etyp in
(sseq s1 (sif e1'
(sassign tmp (intconst 1L IInt))
- (sseq s2 (sif e2'
- (sassign tmp (intconst 1L IInt))
- (sassign tmp (intconst 0L IInt))))),
+ (sseq s2 (sassign tmp (eboolvalof e2')))),
tmp)
| Set lv ->
- let (s2, _) = simpl e2 (Set lv) in
- (sseq s1 (sif e1' (sassign lv (intconst 1L IInt)) s2),
+ let (s2, e2') = simpl e2 RHS in
+ (sseq s1 (sif e1'
+ (sassign lv (intconst 1L IInt))
+ (sseq s2 (sassign lv (eboolvalof e2')))),
voidconst)
end