* [PATCH 0/3] testcases for memory-to-register conversion
@ 2017-09-16 9:01 Luc Van Oostenryck
2017-09-16 9:01 ` [PATCH 1/3] add testcase for __builtin_unreachable() Luc Van Oostenryck
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Luc Van Oostenryck @ 2017-09-16 9:01 UTC (permalink / raw)
To: linux-sparse; +Cc: Christopher Li, Luc Van Oostenryck
The series contains tescases related to memory-to-register and
SSA conversion.
This series is also available for review in the git repository at:
git://github.com/lucvoo/sparse.git testcases-mem2reg
----------------------------------------------------------------
Luc Van Oostenryck (3):
add testcase for __builtin_unreachable()
add testcase for return & inline
add testcase for mem2reg/SSA conversion
validation/linear/builtin_unreachable.c | 31 +++++++++++++++++++++++++++++++
validation/linear/inline-return.c | 24 ++++++++++++++++++++++++
validation/mem2reg/address-used00.c | 19 +++++++++++++++++++
validation/mem2reg/broken-phi02.c | 28 ++++++++++++++++++++++++++++
validation/mem2reg/broken-phi03.c | 29 +++++++++++++++++++++++++++++
validation/mem2reg/cond-expr.c | 13 +++++++++++++
validation/mem2reg/cond-expr5.c | 18 ++++++++++++++++++
validation/mem2reg/global-direct-undef.c | 23 +++++++++++++++++++++++
validation/mem2reg/global-direct.c | 23 +++++++++++++++++++++++
validation/mem2reg/global-loop.c | 20 ++++++++++++++++++++
validation/mem2reg/global-noalias.c | 21 +++++++++++++++++++++
validation/mem2reg/global-pointer.c | 26 ++++++++++++++++++++++++++
validation/mem2reg/if-direct.c | 19 +++++++++++++++++++
validation/mem2reg/if-pointer.c | 21 +++++++++++++++++++++
validation/mem2reg/init-global-array.c | 17 +++++++++++++++++
validation/mem2reg/init-local-array.c | 25 +++++++++++++++++++++++++
validation/mem2reg/init-local-union0.c | 18 ++++++++++++++++++
validation/mem2reg/init-local-union1.c | 32 ++++++++++++++++++++++++++++++++
validation/mem2reg/init-local.c | 27 +++++++++++++++++++++++++++
validation/mem2reg/loop00.c | 16 ++++++++++++++++
validation/mem2reg/loop01-global.c | 18 ++++++++++++++++++
validation/mem2reg/loop02-array.c | 23 +++++++++++++++++++++++
validation/mem2reg/loop02-global.c | 22 ++++++++++++++++++++++
validation/mem2reg/loop02-local.c | 23 +++++++++++++++++++++++
validation/mem2reg/loop02-pointer.c | 23 +++++++++++++++++++++++
validation/mem2reg/quadra00.c | 28 ++++++++++++++++++++++++++++
validation/mem2reg/short-load.c | 29 +++++++++++++++++++++++++++++
validation/mem2reg/undef00.c | 14 ++++++++++++++
validation/mem2reg/volatile-store00.c | 27 +++++++++++++++++++++++++++
validation/optim/volatile-store00.c | 28 ++++++++++++++++++++++++++++
30 files changed, 685 insertions(+)
create mode 100644 validation/linear/builtin_unreachable.c
create mode 100644 validation/linear/inline-return.c
create mode 100644 validation/mem2reg/address-used00.c
create mode 100644 validation/mem2reg/broken-phi02.c
create mode 100644 validation/mem2reg/broken-phi03.c
create mode 100644 validation/mem2reg/cond-expr.c
create mode 100644 validation/mem2reg/cond-expr5.c
create mode 100644 validation/mem2reg/global-direct-undef.c
create mode 100644 validation/mem2reg/global-direct.c
create mode 100644 validation/mem2reg/global-loop.c
create mode 100644 validation/mem2reg/global-noalias.c
create mode 100644 validation/mem2reg/global-pointer.c
create mode 100644 validation/mem2reg/if-direct.c
create mode 100644 validation/mem2reg/if-pointer.c
create mode 100644 validation/mem2reg/init-global-array.c
create mode 100644 validation/mem2reg/init-local-array.c
create mode 100644 validation/mem2reg/init-local-union0.c
create mode 100644 validation/mem2reg/init-local-union1.c
create mode 100644 validation/mem2reg/init-local.c
create mode 100644 validation/mem2reg/loop00.c
create mode 100644 validation/mem2reg/loop01-global.c
create mode 100644 validation/mem2reg/loop02-array.c
create mode 100644 validation/mem2reg/loop02-global.c
create mode 100644 validation/mem2reg/loop02-local.c
create mode 100644 validation/mem2reg/loop02-pointer.c
create mode 100644 validation/mem2reg/quadra00.c
create mode 100644 validation/mem2reg/short-load.c
create mode 100644 validation/mem2reg/undef00.c
create mode 100644 validation/mem2reg/volatile-store00.c
create mode 100644 validation/optim/volatile-store00.c
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/3] add testcase for __builtin_unreachable()
2017-09-16 9:01 [PATCH 0/3] testcases for memory-to-register conversion Luc Van Oostenryck
@ 2017-09-16 9:01 ` Luc Van Oostenryck
2017-09-16 9:01 ` [PATCH 2/3] add testcase for return & inline Luc Van Oostenryck
2017-09-16 9:01 ` [PATCH 3/3] add testcase for mem2reg/SSA conversion Luc Van Oostenryck
2 siblings, 0 replies; 4+ messages in thread
From: Luc Van Oostenryck @ 2017-09-16 9:01 UTC (permalink / raw)
To: linux-sparse; +Cc: Christopher Li, Luc Van Oostenryck
__builtin_unreachable()'s semantic has consequences on the CFG
and this should be taken in account for:
* checking for undefined variables
* checking when control reaches end of non-void function
* context checking
* ...
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
validation/linear/builtin_unreachable.c | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
create mode 100644 validation/linear/builtin_unreachable.c
diff --git a/validation/linear/builtin_unreachable.c b/validation/linear/builtin_unreachable.c
new file mode 100644
index 000000000..4f13b892a
--- /dev/null
+++ b/validation/linear/builtin_unreachable.c
@@ -0,0 +1,31 @@
+void function_that_never_returns(void);
+
+int foo(int c)
+{
+ if (c)
+ return 1;
+ function_that_never_returns();
+ __builtin_unreachable();
+}
+
+/*
+ * check-name: __builtin_unreachable()
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-known-to-fail
+ * check-output-start
+foo:
+.L0:
+ <entry-point>
+ cbr %arg1, .L3, .L2
+
+.L2:
+ call function_that_never_returns
+ unreach
+
+.L3:
+ ret.32 $1
+
+
+ * check-output-end
+ */
--
2.14.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/3] add testcase for return & inline
2017-09-16 9:01 [PATCH 0/3] testcases for memory-to-register conversion Luc Van Oostenryck
2017-09-16 9:01 ` [PATCH 1/3] add testcase for __builtin_unreachable() Luc Van Oostenryck
@ 2017-09-16 9:01 ` Luc Van Oostenryck
2017-09-16 9:01 ` [PATCH 3/3] add testcase for mem2reg/SSA conversion Luc Van Oostenryck
2 siblings, 0 replies; 4+ messages in thread
From: Luc Van Oostenryck @ 2017-09-16 9:01 UTC (permalink / raw)
To: linux-sparse; +Cc: Christopher Li, Luc Van Oostenryck
The linearization of 'return' statements must correctly take
in account some implementation details of the inlining.
As such, it deserves its own testcase.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
validation/linear/inline-return.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
create mode 100644 validation/linear/inline-return.c
diff --git a/validation/linear/inline-return.c b/validation/linear/inline-return.c
new file mode 100644
index 000000000..b1e4d8446
--- /dev/null
+++ b/validation/linear/inline-return.c
@@ -0,0 +1,24 @@
+static inline int def(void)
+{
+ return 1;
+}
+
+int foo(void)
+{
+ return def();
+}
+
+int bar(void)
+{
+ return def();
+ return 0;
+}
+
+/*
+ * check-name: inline-return.c
+ * check-command: test-linearize -fdump-ir=linearize -Wno-decl $file
+ *
+ * check-output-ignore
+ * check-output-contains: ret\\..*\\$1
+ * check-output-excludes: ret\\..*\\$0
+ */
--
2.14.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 3/3] add testcase for mem2reg/SSA conversion
2017-09-16 9:01 [PATCH 0/3] testcases for memory-to-register conversion Luc Van Oostenryck
2017-09-16 9:01 ` [PATCH 1/3] add testcase for __builtin_unreachable() Luc Van Oostenryck
2017-09-16 9:01 ` [PATCH 2/3] add testcase for return & inline Luc Van Oostenryck
@ 2017-09-16 9:01 ` Luc Van Oostenryck
2 siblings, 0 replies; 4+ messages in thread
From: Luc Van Oostenryck @ 2017-09-16 9:01 UTC (permalink / raw)
To: linux-sparse; +Cc: Christopher Li, Luc Van Oostenryck
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
validation/mem2reg/address-used00.c | 19 +++++++++++++++++++
validation/mem2reg/broken-phi02.c | 28 ++++++++++++++++++++++++++++
validation/mem2reg/broken-phi03.c | 29 +++++++++++++++++++++++++++++
validation/mem2reg/cond-expr.c | 13 +++++++++++++
validation/mem2reg/cond-expr5.c | 18 ++++++++++++++++++
validation/mem2reg/global-direct-undef.c | 23 +++++++++++++++++++++++
validation/mem2reg/global-direct.c | 23 +++++++++++++++++++++++
validation/mem2reg/global-loop.c | 20 ++++++++++++++++++++
validation/mem2reg/global-noalias.c | 21 +++++++++++++++++++++
validation/mem2reg/global-pointer.c | 26 ++++++++++++++++++++++++++
validation/mem2reg/if-direct.c | 19 +++++++++++++++++++
validation/mem2reg/if-pointer.c | 21 +++++++++++++++++++++
validation/mem2reg/init-global-array.c | 17 +++++++++++++++++
validation/mem2reg/init-local-array.c | 25 +++++++++++++++++++++++++
validation/mem2reg/init-local-union0.c | 18 ++++++++++++++++++
validation/mem2reg/init-local-union1.c | 32 ++++++++++++++++++++++++++++++++
validation/mem2reg/init-local.c | 27 +++++++++++++++++++++++++++
validation/mem2reg/loop00.c | 16 ++++++++++++++++
validation/mem2reg/loop01-global.c | 18 ++++++++++++++++++
validation/mem2reg/loop02-array.c | 23 +++++++++++++++++++++++
validation/mem2reg/loop02-global.c | 22 ++++++++++++++++++++++
validation/mem2reg/loop02-local.c | 23 +++++++++++++++++++++++
validation/mem2reg/loop02-pointer.c | 23 +++++++++++++++++++++++
validation/mem2reg/quadra00.c | 28 ++++++++++++++++++++++++++++
validation/mem2reg/short-load.c | 29 +++++++++++++++++++++++++++++
validation/mem2reg/undef00.c | 14 ++++++++++++++
validation/mem2reg/volatile-store00.c | 27 +++++++++++++++++++++++++++
validation/optim/volatile-store00.c | 28 ++++++++++++++++++++++++++++
28 files changed, 630 insertions(+)
create mode 100644 validation/mem2reg/address-used00.c
create mode 100644 validation/mem2reg/broken-phi02.c
create mode 100644 validation/mem2reg/broken-phi03.c
create mode 100644 validation/mem2reg/cond-expr.c
create mode 100644 validation/mem2reg/cond-expr5.c
create mode 100644 validation/mem2reg/global-direct-undef.c
create mode 100644 validation/mem2reg/global-direct.c
create mode 100644 validation/mem2reg/global-loop.c
create mode 100644 validation/mem2reg/global-noalias.c
create mode 100644 validation/mem2reg/global-pointer.c
create mode 100644 validation/mem2reg/if-direct.c
create mode 100644 validation/mem2reg/if-pointer.c
create mode 100644 validation/mem2reg/init-global-array.c
create mode 100644 validation/mem2reg/init-local-array.c
create mode 100644 validation/mem2reg/init-local-union0.c
create mode 100644 validation/mem2reg/init-local-union1.c
create mode 100644 validation/mem2reg/init-local.c
create mode 100644 validation/mem2reg/loop00.c
create mode 100644 validation/mem2reg/loop01-global.c
create mode 100644 validation/mem2reg/loop02-array.c
create mode 100644 validation/mem2reg/loop02-global.c
create mode 100644 validation/mem2reg/loop02-local.c
create mode 100644 validation/mem2reg/loop02-pointer.c
create mode 100644 validation/mem2reg/quadra00.c
create mode 100644 validation/mem2reg/short-load.c
create mode 100644 validation/mem2reg/undef00.c
create mode 100644 validation/mem2reg/volatile-store00.c
create mode 100644 validation/optim/volatile-store00.c
diff --git a/validation/mem2reg/address-used00.c b/validation/mem2reg/address-used00.c
new file mode 100644
index 000000000..f2d6c87bd
--- /dev/null
+++ b/validation/mem2reg/address-used00.c
@@ -0,0 +1,19 @@
+int foo(int **g, int j)
+{
+ int i = 1;
+ int *a;
+ int **p;
+
+ a = &i;
+ p = &a;
+ *p[0] = 0;
+ return i;
+}
+
+/*
+ * check-name: address-used00
+ * check-command: test-linearize -Wno-decl -fdump-ir=final $file
+ * check-known-to-fail
+ * check-output-ignore
+ * check-output-excludes: ret\\..* \\$1
+ */
diff --git a/validation/mem2reg/broken-phi02.c b/validation/mem2reg/broken-phi02.c
new file mode 100644
index 000000000..69776e0f1
--- /dev/null
+++ b/validation/mem2reg/broken-phi02.c
@@ -0,0 +1,28 @@
+int foo(int a, int b)
+{
+ int x;
+ int i;
+
+ if (a)
+ i = 0;
+ else
+ i = 1;
+
+ x = 0;
+ if (b)
+ x = i;
+ return x;
+}
+
+/*
+ * check-name: broken-phi02
+ * check-description:
+ * This is an indirect test to check correctness of phi-node placement.
+ * The misplaced phi-node for 'i' (not at the meet point but where 'i'
+ * is used) causes a missed select-conversion at later stage.
+ *
+ * check-command: test-linearize -Wno-decl $file
+ * check-known-to-fail
+ * check-output-ignore
+ * check-output-contains: select\\.
+ */
diff --git a/validation/mem2reg/broken-phi03.c b/validation/mem2reg/broken-phi03.c
new file mode 100644
index 000000000..58b479791
--- /dev/null
+++ b/validation/mem2reg/broken-phi03.c
@@ -0,0 +1,29 @@
+int foo(int a, int b)
+{
+ int x;
+ int i;
+
+ switch (a) {
+ case 0: i = 0; break;
+ case 1: i = 1; break;
+ default: i = -1; break;
+ }
+
+ x = 0;
+ if (b)
+ x = i;
+ return x;
+}
+
+/*
+ * check-name: broken-phi03
+ * check-description:
+ * This is an indirect test to check correctness of phi-node placement.
+ * The misplaced phi-node for 'i' (not at the meet point but where 'i'
+ * is used) causes a missed select-conversion at later stage.
+ *
+ * check-command: test-linearize -Wno-decl $file
+ * check-known-to-fail
+ * check-output-ignore
+ * check-output-contains: select\\.
+ */
diff --git a/validation/mem2reg/cond-expr.c b/validation/mem2reg/cond-expr.c
new file mode 100644
index 000000000..f38564ef8
--- /dev/null
+++ b/validation/mem2reg/cond-expr.c
@@ -0,0 +1,13 @@
+int fun(int);
+
+int foo(int a, int b, int c)
+{
+ return a ? fun(b) : fun(c);
+}
+
+/*
+ * check-name: cond-expr
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-output-ignore
+ * check-output-pattern(2): phi\\.
+ */
diff --git a/validation/mem2reg/cond-expr5.c b/validation/mem2reg/cond-expr5.c
new file mode 100644
index 000000000..6c1e1c34d
--- /dev/null
+++ b/validation/mem2reg/cond-expr5.c
@@ -0,0 +1,18 @@
+int foo(int p, int q, int a)
+{
+ if (p)
+ a = 0;
+ if (q)
+ a = 1;
+
+ return a;
+}
+
+/*
+ * check-name: cond-expr5
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-output-ignore
+ * check-output-excludes: load\\.
+ * check-output-excludes: store\\.
+ * check-output-pattern(2): phi\\.
+ */
diff --git a/validation/mem2reg/global-direct-undef.c b/validation/mem2reg/global-direct-undef.c
new file mode 100644
index 000000000..34960e74d
--- /dev/null
+++ b/validation/mem2reg/global-direct-undef.c
@@ -0,0 +1,23 @@
+int a, c, d;
+
+int foo(void)
+{
+ int b, e;
+ if (a)
+ b = c;
+ else
+ b = d;
+ if (c)
+ a = b;
+ if (b)
+ e = a;
+ return e;
+}
+
+/*
+ * check-name: global direct undef
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-output-ignore
+ * check-output-pattern(4,5): load\\.
+ * check-output-pattern(1): store\\.
+ */
diff --git a/validation/mem2reg/global-direct.c b/validation/mem2reg/global-direct.c
new file mode 100644
index 000000000..ea5d42dcf
--- /dev/null
+++ b/validation/mem2reg/global-direct.c
@@ -0,0 +1,23 @@
+int a, c, d;
+
+int foo(void)
+{
+ int b, e = 0;
+ if (a)
+ b = c;
+ else
+ b = d;
+ if (c)
+ a = b;
+ if (b)
+ e = a;
+ return e;
+}
+
+/*
+ * check-name: global direct
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-output-ignore
+ * check-output-pattern(4,5): load\\.
+ * check-output-pattern(1): store\\.
+ */
diff --git a/validation/mem2reg/global-loop.c b/validation/mem2reg/global-loop.c
new file mode 100644
index 000000000..a232f7edf
--- /dev/null
+++ b/validation/mem2reg/global-loop.c
@@ -0,0 +1,20 @@
+struct s {
+ int c;
+ int a[];
+} s;
+int f;
+
+void fun(void);
+void foo(void)
+{
+ for (f = 1;;)
+ if (s.a[f])
+ fun();
+}
+
+/*
+ * check-name: global var as loop index
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-output-ignore
+ * check-output-contains: load\\..*\\[f\\]
+ */
diff --git a/validation/mem2reg/global-noalias.c b/validation/mem2reg/global-noalias.c
new file mode 100644
index 000000000..b78b51174
--- /dev/null
+++ b/validation/mem2reg/global-noalias.c
@@ -0,0 +1,21 @@
+int a, b, c, d, e;
+
+void foo(void)
+{
+ if (a)
+ b = c;
+ else
+ b = d;
+ if (c)
+ a = b;
+ if (b)
+ e = a;
+}
+
+/*
+ * check-name: global no-alias
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-output-ignore
+ * check-output-pattern(4,7): load\\.
+ * check-output-pattern(4): store\\.
+ */
diff --git a/validation/mem2reg/global-pointer.c b/validation/mem2reg/global-pointer.c
new file mode 100644
index 000000000..d312577a3
--- /dev/null
+++ b/validation/mem2reg/global-pointer.c
@@ -0,0 +1,26 @@
+int a, c, d;
+
+int foo_ptr(void)
+{
+ int b, *bp = &b;
+ int e, *ep = &e;
+
+ if (a)
+ *bp = c;
+ else
+ *bp = d;
+ if (c)
+ a = *bp;
+ if (b)
+ e = a;
+ return e;
+}
+
+/*
+ * check-name: global pointer
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-known-to-fail
+ * check-output-ignore
+ * check-output-pattern(4,5): load\\.
+ * check-output-pattern(3): store\\.
+ */
diff --git a/validation/mem2reg/if-direct.c b/validation/mem2reg/if-direct.c
new file mode 100644
index 000000000..1b5a07ccd
--- /dev/null
+++ b/validation/mem2reg/if-direct.c
@@ -0,0 +1,19 @@
+int foo(int c, int a, int b)
+{
+ int l;
+
+ if (c)
+ l = a;
+ else
+ l = b;
+
+ return l;
+}
+
+/*
+ * check-name: if-then-else direct
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-output-ignore
+ * check-output-excludes: load\\.
+ * check-output-contains: phi\\.
+ */
diff --git a/validation/mem2reg/if-pointer.c b/validation/mem2reg/if-pointer.c
new file mode 100644
index 000000000..acfceb718
--- /dev/null
+++ b/validation/mem2reg/if-pointer.c
@@ -0,0 +1,21 @@
+int foo(int c, int a, int b)
+{
+ int l, *p = &l;
+
+ if (c)
+ *p = a;
+ else
+ *p = b;
+
+ return l + *p;
+}
+
+/*
+ * check-name: if-then-else pointer
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-known-to-fail
+ * check-output-ignore
+ * check-output-excludes: load\\.
+ * check-output-excludes: store\\.
+ * check-output-contains: phi\\.
+ */
diff --git a/validation/mem2reg/init-global-array.c b/validation/mem2reg/init-global-array.c
new file mode 100644
index 000000000..aea4135ae
--- /dev/null
+++ b/validation/mem2reg/init-global-array.c
@@ -0,0 +1,17 @@
+struct {
+ int a[2];
+} s;
+
+int sarray(void)
+{
+ s.a[1] = 1;
+ return s.a[1];
+}
+
+/*
+ * check-name: init global array
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-output-ignore
+ * check-output-excludes: load\\.
+ * check-output-pattern(1): store\\.
+ */
diff --git a/validation/mem2reg/init-local-array.c b/validation/mem2reg/init-local-array.c
new file mode 100644
index 000000000..2ac53bc77
--- /dev/null
+++ b/validation/mem2reg/init-local-array.c
@@ -0,0 +1,25 @@
+int array(void)
+{
+ int a[2];
+
+ a[1] = 1;
+ return a[1];
+}
+
+int sarray(void)
+{
+ struct {
+ int a[2];
+ } s;
+
+ s.a[1] = 1;
+ return s.a[1];
+}
+
+/*
+ * check-name: init local array
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-output-ignore
+ * check-output-excludes: load\\.
+ * check-output-excludes: store\\.
+ */
diff --git a/validation/mem2reg/init-local-union0.c b/validation/mem2reg/init-local-union0.c
new file mode 100644
index 000000000..3a57e781f
--- /dev/null
+++ b/validation/mem2reg/init-local-union0.c
@@ -0,0 +1,18 @@
+double uintfloat(void)
+{
+ union {
+ int a;
+ double f;
+ } s;
+
+ s.a = 1;
+ return s.f;
+}
+
+/*
+ * check-name: init-local union 0
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-output-ignore
+ * check-output-pattern(1): store\\.32
+ * check-output-pattern(1): load\\.64
+ */
diff --git a/validation/mem2reg/init-local-union1.c b/validation/mem2reg/init-local-union1.c
new file mode 100644
index 000000000..925b0a737
--- /dev/null
+++ b/validation/mem2reg/init-local-union1.c
@@ -0,0 +1,32 @@
+double uintfloat(void)
+{
+ union {
+ int a;
+ double f;
+ } s;
+
+ s.a = 1;
+ return s.f;
+}
+
+
+int uarray(void)
+{
+ union {
+ double d;
+ int a[2];
+ } s;
+
+ s.d = 1;
+ return s.a[0];
+}
+
+/*
+ * check-name: init-local union 1
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-output-ignore
+ * check-output-pattern(1): store\\.32
+ * check-output-pattern(1): load\\.64
+ * check-output-pattern(1): store\\.64
+ * check-output-pattern(1): load\\.32
+ */
diff --git a/validation/mem2reg/init-local.c b/validation/mem2reg/init-local.c
new file mode 100644
index 000000000..d51c9247a
--- /dev/null
+++ b/validation/mem2reg/init-local.c
@@ -0,0 +1,27 @@
+int ssimple(void)
+{
+ struct {
+ int a;
+ } s;
+
+ s.a = 1;
+ return s.a;
+}
+
+double sdouble(void)
+{
+ struct {
+ double a;
+ } s;
+
+ s.a = 1.23;
+ return s.a;
+}
+
+/*
+ * check-name: init-local
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-output-ignore
+ * check-output-excludes: load\\.
+ * check-output-excludes: store\\.
+ */
diff --git a/validation/mem2reg/loop00.c b/validation/mem2reg/loop00.c
new file mode 100644
index 000000000..de33d9f64
--- /dev/null
+++ b/validation/mem2reg/loop00.c
@@ -0,0 +1,16 @@
+int loop00(int n)
+{
+ int i, r = 0;
+
+ for (i = 1; i <= n; ++i)
+ r += i;
+ return r;
+}
+
+/*
+ * check-name: loop00
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-output-ignore
+ * check-output-excludes: store\\.
+ * check-output-excludes: load\\.
+ */
diff --git a/validation/mem2reg/loop01-global.c b/validation/mem2reg/loop01-global.c
new file mode 100644
index 000000000..b67981378
--- /dev/null
+++ b/validation/mem2reg/loop01-global.c
@@ -0,0 +1,18 @@
+extern int g;
+
+void fun(void);
+void loop01(void)
+{
+ int i;
+ for (i = 0; i <= 2;)
+ if (g)
+ fun();
+}
+
+/*
+ * check-name: loop01 global
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-output-ignore
+ * check-output-excludes: load\\..*\\[i\\]
+ * check-output-contains: load\\..*\\[g\\]
+ */
diff --git a/validation/mem2reg/loop02-array.c b/validation/mem2reg/loop02-array.c
new file mode 100644
index 000000000..13b0aeaf9
--- /dev/null
+++ b/validation/mem2reg/loop02-array.c
@@ -0,0 +1,23 @@
+
+
+int foo(int i[])
+{
+ int j = 1;
+ i[0] = 6;
+
+ do {
+ if (i[0] != 6)
+ i[0]++;
+ i[0]++;
+ } while (i[0] != j);
+
+ return j;
+}
+
+/*
+ * check-name: loop02 array
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-output-ignore
+ * check-output-pattern(0,4): load\\.
+ * check-output-pattern(1,3): store\\.
+ */
diff --git a/validation/mem2reg/loop02-global.c b/validation/mem2reg/loop02-global.c
new file mode 100644
index 000000000..a0a8b42b0
--- /dev/null
+++ b/validation/mem2reg/loop02-global.c
@@ -0,0 +1,22 @@
+int i;
+
+int foo(void)
+{
+ int j = 1;
+ i = 6;
+
+ do {
+ if (i != 6)
+ i++;
+ i++;
+ } while (i != j);
+
+ return j;
+}
+
+/*
+ * check-name: loop02 global
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-output-ignore
+ * check-output-excludes: load\\.
+ */
diff --git a/validation/mem2reg/loop02-local.c b/validation/mem2reg/loop02-local.c
new file mode 100644
index 000000000..a1bd602b7
--- /dev/null
+++ b/validation/mem2reg/loop02-local.c
@@ -0,0 +1,23 @@
+
+
+int foo(void)
+{
+ int j = 1;
+ int i = 6;
+
+ do {
+ if (i != 6)
+ i++;
+ i++;
+ } while (i != j);
+
+ return j;
+}
+
+/*
+ * check-name: loop02 pointer
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ *
+ * check-output-ignore
+ * check-output-excludes: load\\.
+ */
diff --git a/validation/mem2reg/loop02-pointer.c b/validation/mem2reg/loop02-pointer.c
new file mode 100644
index 000000000..fdb0a8fb5
--- /dev/null
+++ b/validation/mem2reg/loop02-pointer.c
@@ -0,0 +1,23 @@
+
+
+int foo(int *i)
+{
+ int j = 1;
+ *i = 6;
+
+ do {
+ if (*i != 6)
+ (*i)++;
+ (*i)++;
+ } while (*i != j);
+
+ return j;
+}
+
+/*
+ * check-name: loop02 pointer
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-output-ignore
+ * check-output-pattern(0,4): load\\.
+ * check-output-pattern(1,3): store\\.
+ */
diff --git a/validation/mem2reg/quadra00.c b/validation/mem2reg/quadra00.c
new file mode 100644
index 000000000..63b489c98
--- /dev/null
+++ b/validation/mem2reg/quadra00.c
@@ -0,0 +1,28 @@
+#define TEST(N) \
+ do { \
+ d = b + a[N]; \
+ if (d < b) \
+ c++; \
+ b = d; \
+ } while (0)
+
+int foo(int *a, int b, int c)
+{
+ int d;
+
+ TEST(0);
+ TEST(1);
+ TEST(2);
+
+ return d + c;
+}
+
+/*
+ * check-name: quadratic phisrc
+ * check-command: test-linearize -Wno-decl $file
+ * check-known-to-fail
+ * check-output-ignore
+ * check-output-excludes: phi\\..*, .*, .*
+ * check-output-excludes: phi\\..*, .*, .*, .*
+ * check-output-pattern(6): phisrc\\.
+ */
diff --git a/validation/mem2reg/short-load.c b/validation/mem2reg/short-load.c
new file mode 100644
index 000000000..c4b4dc4be
--- /dev/null
+++ b/validation/mem2reg/short-load.c
@@ -0,0 +1,29 @@
+#ifdef __SIZEOF_INT__ == 4
+typedef unsigned int u32;
+#endif
+#ifdef __SIZEOF_SHORT__ == 2
+typedef unsigned short u16;
+#endif
+
+
+union u {
+ u32 a;
+ u16 b;
+};
+
+void bar(u16, union u);
+
+void foo(u16 val)
+{
+ union u u;
+
+ u.b = val;
+ bar(u.b, u);
+}
+
+/*
+ * check-name: short-load
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-output-ignore
+ * check-output-contains: load\\.32
+ */
diff --git a/validation/mem2reg/undef00.c b/validation/mem2reg/undef00.c
new file mode 100644
index 000000000..ba9ba915c
--- /dev/null
+++ b/validation/mem2reg/undef00.c
@@ -0,0 +1,14 @@
+void bad0(void)
+{
+ int *a;
+ *a++;
+}
+
+/*
+ * check-name: undef00
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-known-to-fail
+ * check-output-ignore
+ * check-output-pattern(1): load\\.
+ * check-output-pattern(1): load\\..*\\[UNDEF\\]
+ */
diff --git a/validation/mem2reg/volatile-store00.c b/validation/mem2reg/volatile-store00.c
new file mode 100644
index 000000000..d565037ac
--- /dev/null
+++ b/validation/mem2reg/volatile-store00.c
@@ -0,0 +1,27 @@
+void foo(volatile int *p)
+{
+ *p = 0;
+ *p = 0;
+}
+
+void bar(void)
+{
+ extern volatile int i;
+ i = 0;
+ i = 0;
+}
+
+
+void baz(void)
+{
+ volatile int i;
+ i = 0;
+ i = 0;
+}
+
+/*
+ * check-name: keep volatile stores
+ * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-output-ignore
+ * check-output-pattern(1,6): store\\.
+ */
diff --git a/validation/optim/volatile-store00.c b/validation/optim/volatile-store00.c
new file mode 100644
index 000000000..0b6db1d24
--- /dev/null
+++ b/validation/optim/volatile-store00.c
@@ -0,0 +1,28 @@
+void foo(volatile int *p)
+{
+ *p = 0;
+ *p = 0;
+}
+
+void bar(void)
+{
+ extern volatile int i;
+ i = 0;
+ i = 0;
+}
+
+
+void baz(void)
+{
+ volatile int i;
+ i = 0;
+ i = 0;
+}
+
+/*
+ * check-name: keep volatile stores
+ * check-command: test-linearize -Wno-decl -fdump-ir=final $file
+ * check-known-to-fail
+ * check-output-ignore
+ * check-output-pattern(6): store\\.
+ */
--
2.14.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2017-09-16 9:01 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-09-16 9:01 [PATCH 0/3] testcases for memory-to-register conversion Luc Van Oostenryck
2017-09-16 9:01 ` [PATCH 1/3] add testcase for __builtin_unreachable() Luc Van Oostenryck
2017-09-16 9:01 ` [PATCH 2/3] add testcase for return & inline Luc Van Oostenryck
2017-09-16 9:01 ` [PATCH 3/3] add testcase for mem2reg/SSA conversion Luc Van Oostenryck
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).