aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2016-12-14 09:55:20 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2018-06-28 18:55:41 +0200
commite124eabaa61618abd9af2b60ecb1646a9db7091b (patch)
tree09b3095a28448b09ae41adade4fc1d5e68939f66
parent6c116f46f480a44c5464e5364bd8ead95f243a09 (diff)
downloadsparse-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.c9
-rw-r--r--validation/optim/bool-context-fp.c48
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
*/