* [PATCH 1/3] simplify 'x | ~0' and 'x & ~0'
2017-04-12 14:17 [PATCH 0/3] Simplify booleans Luc Van Oostenryck
@ 2017-04-12 14:18 ` Luc Van Oostenryck
2017-04-12 14:18 ` [PATCH 2/3] simplify 'x ^ ~0' to '~x' Luc Van Oostenryck
2017-04-12 14:18 ` [PATCH 3/3] simplify casts bool -> int -> bool Luc Van Oostenryck
2 siblings, 0 replies; 4+ messages in thread
From: Luc Van Oostenryck @ 2017-04-12 14:18 UTC (permalink / raw)
To: linux-sparse; +Cc: Christopher Li, Luc Van Oostenryck
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
simplify.c | 11 ++++++++++-
validation/optim/bool-not-zero.c | 22 ++++++++++++++++++++++
2 files changed, 32 insertions(+), 1 deletion(-)
create mode 100644 validation/optim/bool-not-zero.c
diff --git a/simplify.c b/simplify.c
index 2286440e0..e4ccb6c5f 100644
--- a/simplify.c
+++ b/simplify.c
@@ -453,6 +453,8 @@ static int simplify_seteq_setne(struct instruction *insn, long long value)
static int simplify_constant_rightside(struct instruction *insn)
{
long long value = insn->src2->value;
+ long long sbit = 1ULL << (insn->size - 1);
+ long long bits = sbit | (sbit - 1);
switch (insn->opcode) {
case OP_OR_BOOL:
@@ -460,6 +462,11 @@ static int simplify_constant_rightside(struct instruction *insn)
return replace_with_pseudo(insn, insn->src2);
goto case_neutral_zero;
+ case OP_OR:
+ if ((value & bits) == bits)
+ return replace_with_pseudo(insn, insn->src2);
+ goto case_neutral_zero;
+
case OP_SUB:
if (value) {
insn->opcode = OP_ADD;
@@ -468,7 +475,7 @@ static int simplify_constant_rightside(struct instruction *insn)
}
/* Fall through */
case OP_ADD:
- case OP_OR: case OP_XOR:
+ case OP_XOR:
case OP_SHL:
case OP_LSR:
case_neutral_zero:
@@ -492,6 +499,8 @@ static int simplify_constant_rightside(struct instruction *insn)
return replace_with_pseudo(insn, insn->src1);
/* Fall through */
case OP_AND:
+ if ((value & bits) == bits)
+ return replace_with_pseudo(insn, insn->src1);
if (!value)
return replace_with_pseudo(insn, insn->src2);
return 0;
diff --git a/validation/optim/bool-not-zero.c b/validation/optim/bool-not-zero.c
new file mode 100644
index 000000000..ce74705e8
--- /dev/null
+++ b/validation/optim/bool-not-zero.c
@@ -0,0 +1,22 @@
+int or_not0(int a) { return a | ~0; }
+int and_not0(int a) { return a & ~0; }
+
+/*
+ * check-name: bool-not-zero
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-output-start
+or_not0:
+.L0:
+ <entry-point>
+ ret.32 $0xffffffff
+
+
+and_not0:
+.L2:
+ <entry-point>
+ ret.32 %arg1
+
+
+ * check-output-end
+ */
--
2.12.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/3] simplify 'x ^ ~0' to '~x'
2017-04-12 14:17 [PATCH 0/3] Simplify booleans Luc Van Oostenryck
2017-04-12 14:18 ` [PATCH 1/3] simplify 'x | ~0' and 'x & ~0' Luc Van Oostenryck
@ 2017-04-12 14:18 ` Luc Van Oostenryck
2017-04-12 14:18 ` [PATCH 3/3] simplify casts bool -> int -> bool Luc Van Oostenryck
2 siblings, 0 replies; 4+ messages in thread
From: Luc Van Oostenryck @ 2017-04-12 14:18 UTC (permalink / raw)
To: linux-sparse; +Cc: Christopher Li, Luc Van Oostenryck
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
simplify.c | 8 +++++++-
validation/optim/bool-not-zero.c | 8 ++++++++
2 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/simplify.c b/simplify.c
index e4ccb6c5f..775c1e2dd 100644
--- a/simplify.c
+++ b/simplify.c
@@ -467,6 +467,13 @@ static int simplify_constant_rightside(struct instruction *insn)
return replace_with_pseudo(insn, insn->src2);
goto case_neutral_zero;
+ case OP_XOR:
+ if ((value & bits) == bits) {
+ insn->opcode = OP_NOT;
+ return REPEAT_CSE;
+ }
+ goto case_neutral_zero;
+
case OP_SUB:
if (value) {
insn->opcode = OP_ADD;
@@ -475,7 +482,6 @@ static int simplify_constant_rightside(struct instruction *insn)
}
/* Fall through */
case OP_ADD:
- case OP_XOR:
case OP_SHL:
case OP_LSR:
case_neutral_zero:
diff --git a/validation/optim/bool-not-zero.c b/validation/optim/bool-not-zero.c
index ce74705e8..189fe3311 100644
--- a/validation/optim/bool-not-zero.c
+++ b/validation/optim/bool-not-zero.c
@@ -1,5 +1,6 @@
int or_not0(int a) { return a | ~0; }
int and_not0(int a) { return a & ~0; }
+int xor_not0(int a) { return a ^ ~0; }
/*
* check-name: bool-not-zero
@@ -18,5 +19,12 @@ and_not0:
ret.32 %arg1
+xor_not0:
+.L4:
+ <entry-point>
+ not.32 %r8 <- %arg1
+ ret.32 %r8
+
+
* check-output-end
*/
--
2.12.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 3/3] simplify casts bool -> int -> bool
2017-04-12 14:17 [PATCH 0/3] Simplify booleans Luc Van Oostenryck
2017-04-12 14:18 ` [PATCH 1/3] simplify 'x | ~0' and 'x & ~0' Luc Van Oostenryck
2017-04-12 14:18 ` [PATCH 2/3] simplify 'x ^ ~0' to '~x' Luc Van Oostenryck
@ 2017-04-12 14:18 ` Luc Van Oostenryck
2 siblings, 0 replies; 4+ messages in thread
From: Luc Van Oostenryck @ 2017-04-12 14:18 UTC (permalink / raw)
To: linux-sparse; +Cc: Christopher Li, Luc Van Oostenryck
Because of C's integer promotion, in code like 'a == 0',
the operand 'a' must be promoted to int, which result in
following linearization if the type of 'a' was _Bool:
cast.32 %t <- (1) %a
setne.32 %r <- %t, $0
While required by the standard, this promotion is unneeded
in the given situation.
Change this by simplifying away such casts.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
simplify.c | 18 +++++++++++++++++-
validation/optim/bool-int-bool.c | 12 ++++++++++++
2 files changed, 29 insertions(+), 1 deletion(-)
create mode 100644 validation/optim/bool-int-bool.c
diff --git a/simplify.c b/simplify.c
index 775c1e2dd..96448a666 100644
--- a/simplify.c
+++ b/simplify.c
@@ -445,9 +445,25 @@ static int simplify_seteq_setne(struct instruction *insn, long long value)
remove_usage(old, &insn->src1);
return REPEAT_CSE;
+ case OP_CAST:
+ if (def->orig_type->bit_size != 1)
+ break;
+
+ // Convert:
+ // cast.n %t <- (1) %a
+ // setne.m %r <- %t, $0
+ // into:
+ // ...
+ // setne.m %r <- %a, $0
+ // and similar for setne/eq ... 0/1
+ use_pseudo(insn, def->src1, &insn->src1);
+ remove_usage(old, &insn->src1);
+ return REPEAT_CSE;
+
default:
- return 0;
+ break;
}
+ return 0;
}
static int simplify_constant_rightside(struct instruction *insn)
diff --git a/validation/optim/bool-int-bool.c b/validation/optim/bool-int-bool.c
new file mode 100644
index 000000000..de34a68bb
--- /dev/null
+++ b/validation/optim/bool-int-bool.c
@@ -0,0 +1,12 @@
+_Bool beq0(_Bool a) { return (a == 0); }
+_Bool beq1(_Bool a) { return (a == 1); }
+_Bool bne0(_Bool a) { return (a != 0); }
+_Bool bne1(_Bool a) { return (a != 1); }
+
+/*
+ * check-name: bool - int - bool constants
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-output-ignore
+ * check-output-excludes: cast\\.
+ */
--
2.12.0
^ permalink raw reply related [flat|nested] 4+ messages in thread