@@ -310,6 +310,21 @@ static int simplify_asr(struct instruction *insn, pseudo_t pseudo, long long val
return 0;
}
+static int simplify_mul_div(struct instruction *insn, long long value)
+{
+ if (value == 1)
+ return replace_with_pseudo(insn, insn->src1);
+
+ switch (insn->opcode) {
+ case OP_MULS:
+ case OP_MULU:
+ if (value == 0)
+ return replace_with_pseudo(insn, insn->src2);
+ }
+
+ return 0;
+}
+
static int simplify_constant_rightside(struct instruction *insn)
{
long long value = insn->src2->value;
@@ -334,6 +349,8 @@ static int simplify_constant_rightside(struct instruction *insn)
return simplify_asr(insn, insn->src1, value);
case OP_MULU: case OP_MULS:
+ return simplify_mul_div(insn, value);
+
case OP_AND_BOOL:
if (value == 1)
return replace_with_pseudo(insn, insn->src1);
new file mode 100644
@@ -0,0 +1,13 @@
+typedef unsigned int ui;
+typedef int si;
+
+si smul1(si a) { return a * 1; }
+ui umul1(ui a) { return a * 1; }
+
+/*
+ * check-name: muldiv-by-one
+ * check-command: test-linearize -Wno-decl $file
+ * check-output-ignore
+ *
+ * check-output-excludes: mul[us]\\.
+ */
new file mode 100644
@@ -0,0 +1,13 @@
+typedef unsigned int ui;
+typedef int si;
+
+si smul0(si a) { return a * 0; }
+ui umul0(ui a) { return a * 0; }
+
+/*
+ * check-name: muldiv-by-zero
+ * check-command: test-linearize -Wno-decl $file
+ * check-output-ignore
+ *
+ * check-output-excludes: mul[us]\\.
+ */
This patch contains no functional changes. It just moves the code for simplification of OP_MUL{U,S} with constant operands in its own function in preparation for some additional simplifications coming in the same serie. Also add some test cases for the concerned simplifications. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com> --- simplify.c | 17 +++++++++++++++++ validation/optim/muldiv-by-one.c | 13 +++++++++++++ validation/optim/muldiv-by-zero.c | 13 +++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 validation/optim/muldiv-by-one.c create mode 100644 validation/optim/muldiv-by-zero.c