diff options
| author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2016-12-14 09:55:20 +0100 |
|---|---|---|
| committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2018-06-28 18:55:41 +0200 |
| commit | e124eabaa61618abd9af2b60ecb1646a9db7091b (patch) | |
| tree | 09b3095a28448b09ae41adade4fc1d5e68939f66 | |
| parent | 6c116f46f480a44c5464e5364bd8ead95f243a09 (diff) | |
| download | sparse-dev-e124eabaa61618abd9af2b60ecb1646a9db7091b.tar.gz | |
bool: fix missing boolean context for floats
The function add_convert_to_bool() was added to give a
boolean context to logical expressions but did this onl
for integers.
Fix this for floating-point expressions by adding the proper
comparison to 0.0.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
| -rw-r--r-- | linearize.c | 9 | ||||
| -rw-r--r-- | validation/optim/bool-context-fp.c | 48 |
2 files changed, 55 insertions, 2 deletions
diff --git a/linearize.c b/linearize.c index 83dfec11..726e911b 100644 --- a/linearize.c +++ b/linearize.c @@ -1356,8 +1356,13 @@ static inline pseudo_t add_convert_to_bool(struct entrypoint *ep, pseudo_t src, if (is_bool_type(type)) return src; - zero = value_pseudo(0); - op = OP_SET_NE; + if (is_float_type(type)) { + zero = add_setfval(ep, type, 0.0); + op = map_opcode(OP_SET_NE, type); + } else { + zero = value_pseudo(0); + op = OP_SET_NE; + } return add_binary_op(ep, &bool_ctype, op, src, zero); } diff --git a/validation/optim/bool-context-fp.c b/validation/optim/bool-context-fp.c index ad075c56..c3c2e546 100644 --- a/validation/optim/bool-context-fp.c +++ b/validation/optim/bool-context-fp.c @@ -5,6 +5,10 @@ bool bfexp(float a) { return (bool)a; } bool bfnot(float a) { return !a; } int ifnot(float a) { return !a; } +bool bfior(float a, float b) { return a || b; } +int ifior(float a, float b) { return a || b; } +bool bfand(float a, float b) { return a && b; } +int ifand(float a, float b) { return a && b; } /* * check-name: bool context fp @@ -43,5 +47,49 @@ ifnot: ret.32 %r16 +bfior: +.L8: + <entry-point> + setfval.32 %r19 <- 0.000000 + fcmpune.1 %r20 <- %arg1, %r19 + fcmpune.1 %r23 <- %arg2, %r19 + or-bool.1 %r24 <- %r20, %r23 + setne.1 %r26 <- %r24, $0 + ret.1 %r26 + + +ifior: +.L10: + <entry-point> + setfval.32 %r29 <- 0.000000 + fcmpune.1 %r30 <- %arg1, %r29 + fcmpune.1 %r33 <- %arg2, %r29 + or-bool.1 %r34 <- %r30, %r33 + zext.32 %r35 <- (1) %r34 + ret.32 %r35 + + +bfand: +.L12: + <entry-point> + setfval.32 %r38 <- 0.000000 + fcmpune.1 %r39 <- %arg1, %r38 + fcmpune.1 %r42 <- %arg2, %r38 + and-bool.1 %r43 <- %r39, %r42 + setne.1 %r45 <- %r43, $0 + ret.1 %r45 + + +ifand: +.L14: + <entry-point> + setfval.32 %r48 <- 0.000000 + fcmpune.1 %r49 <- %arg1, %r48 + fcmpune.1 %r52 <- %arg2, %r48 + and-bool.1 %r53 <- %r49, %r52 + zext.32 %r54 <- (1) %r53 + ret.32 %r54 + + * check-output-end */ |
