aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/validation/optim
diff options
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2018-08-25 09:40:52 +0200
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2018-08-25 14:25:48 +0200
commitfd43eab36ea0bb18942e3a7233db2efed4b84b30 (patch)
tree47162ba3fa25b6d13b1e18e76e3c4c56f6384162 /validation/optim
parentdc49365a8026fad63297ffde53ca72e4252f4959 (diff)
parent13cf4aaeef36031fcee071a1efcf9092b7d7cdf7 (diff)
downloadsparse-dev-fd43eab36ea0bb18942e3a7233db2efed4b84b30.tar.gz
Merge branch 'kill-dead-stores' into tip
* fix buggy recursion in kill_dead_stores() * kill dead stores again after memops simplification is done. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Diffstat (limited to 'validation/optim')
-rw-r--r--validation/optim/kill-stores0.c34
-rw-r--r--validation/optim/kill-stores1.c48
-rw-r--r--validation/optim/kill-stores2.c17
-rw-r--r--validation/optim/live-stores0.c29
4 files changed, 128 insertions, 0 deletions
diff --git a/validation/optim/kill-stores0.c b/validation/optim/kill-stores0.c
new file mode 100644
index 00000000..00c005ff
--- /dev/null
+++ b/validation/optim/kill-stores0.c
@@ -0,0 +1,34 @@
+struct p {
+ int x, y;
+};
+
+struct q {
+ int w;
+};
+
+static int foo(void)
+{
+ int x = 1;
+ int y = x;
+ return &x == &y;
+}
+
+static int bar(struct p p)
+{
+ if (p.x != 0)
+ ;
+}
+
+static int baz(struct p p, struct q q)
+{
+ if (p.x != 0 || p.y != 1 || q.w == 0)
+ ;
+}
+
+/*
+ * check-name: kill-stores0
+ * check-command: test-linearize $file
+ *
+ * check-output-ignore
+ * check-output-excludes: store\\.
+ */
diff --git a/validation/optim/kill-stores1.c b/validation/optim/kill-stores1.c
new file mode 100644
index 00000000..16a5dcf0
--- /dev/null
+++ b/validation/optim/kill-stores1.c
@@ -0,0 +1,48 @@
+struct s {
+ int c[1];
+};
+
+static struct s x, y;
+static int p;
+
+static void foo0(void)
+{
+ (x = y).c; // x = y;
+}
+
+static void foo1(void)
+{
+ int *t = (x = y).c; // x = y;
+}
+
+static void foo2(void)
+{
+ (x = y).c + 1; // x = y;
+}
+
+static void foo3(void)
+{
+ (x = y).c[0]; // x = y;
+}
+
+static void foo4(void)
+{
+ (p ? x : y).c[0]; // ;
+}
+
+static void foo5(void)
+{
+ (p, y).c[0]; // ;
+}
+
+/*
+ * check-name: kill-stores1
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-output-ignore
+ * check-output-pattern(4): load\\.
+ * check-output-pattern(4): load\\..*0\\[y\\]
+ * check-output-pattern(4): store\\.
+ * check-output-pattern(4): store\\..*0\\[x\\]
+ * check-output-excludes: select\\.
+ */
diff --git a/validation/optim/kill-stores2.c b/validation/optim/kill-stores2.c
new file mode 100644
index 00000000..861b5ece
--- /dev/null
+++ b/validation/optim/kill-stores2.c
@@ -0,0 +1,17 @@
+extern void def(int *);
+
+static void foo(void)
+{
+ int c;
+ def(&c);
+ if (c)
+ c = c;
+}
+
+/*
+ * check-name: kill-stores2
+ * check-command: test-linearize $file
+ *
+ * check-output-ignore
+ * check-output-excludes: store\\.
+ */
diff --git a/validation/optim/live-stores0.c b/validation/optim/live-stores0.c
new file mode 100644
index 00000000..2cbc5ab1
--- /dev/null
+++ b/validation/optim/live-stores0.c
@@ -0,0 +1,29 @@
+void init(int *x);
+
+static int foo(void)
+{
+ int a[2] = { 0, 123, };
+
+ if (a[1] != 123)
+ return 1;
+ init(a);
+ if (a[1] == 123)
+ return 2;
+ return 0;
+}
+
+#if 0
+void init(int *x)
+{
+ x[0] = x[1] = 0;
+}
+#endif
+
+/*
+ * check-name: live-stores
+ * check-command: test-linearize $file
+ *
+ * check-output-ignore
+ * check-output-contains: store.32 *\\$123
+ * check-output-pattern(2,3): store\\.
+ */