diff --git a/validation/crash-select.c b/validation/crash-select.c
new file mode 100644
index 000000000..cec00baf8
--- /dev/null
+++ b/validation/crash-select.c
@@ -0,0 +1,18 @@
+struct s {
+	void *b;
+	long c;
+};
+
+long d(void);
+static long f(void)
+{
+	struct s s;
+	s.c = d();
+	if (s.c)
+		s.c = 2;
+	return s.c;
+}
+
+/*
+ * check-name: crash-select
+ */
diff --git a/validation/alias-distinct.c b/validation/mem2reg/alias-distinct.c
similarity index 100%
rename from validation/alias-distinct.c
rename to validation/mem2reg/alias-distinct.c
diff --git a/validation/alias-mixed.c b/validation/mem2reg/alias-mixed.c
similarity index 100%
rename from validation/alias-mixed.c
rename to validation/mem2reg/alias-mixed.c
diff --git a/validation/alias-same.c b/validation/mem2reg/alias-same.c
similarity index 100%
rename from validation/alias-same.c
rename to validation/mem2reg/alias-same.c
diff --git a/validation/mem2reg/cond-expr.c b/validation/mem2reg/cond-expr.c
index f38564ef8..8acb00ac9 100644
--- a/validation/mem2reg/cond-expr.c
+++ b/validation/mem2reg/cond-expr.c
@@ -10,4 +10,5 @@ int foo(int a, int b, int c)
  * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
  * check-output-ignore
  * check-output-pattern(2): phi\\.
+ * check-output-pattern(3): phisrc\\.
  */
diff --git a/validation/mem2reg/cond-expr5.c b/validation/mem2reg/cond-expr5.c
index 6c1e1c34d..62ac6c15d 100644
--- a/validation/mem2reg/cond-expr5.c
+++ b/validation/mem2reg/cond-expr5.c
@@ -11,8 +11,12 @@ int foo(int p, int q, int a)
 /*
  * check-name: cond-expr5
  * 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-pattern(2): phi\\.
+ * check-output-excludes: phi\\..*, .*, .*
+ * check-output-pattern(3): phi\\.
+ * check-output-pattern(5): phisrc\\.
  */
diff --git a/validation/mem2reg/init-global-array.c b/validation/mem2reg/init-global-array.c
index aea4135ae..51ca50e35 100644
--- a/validation/mem2reg/init-global-array.c
+++ b/validation/mem2reg/init-global-array.c
@@ -1,8 +1,11 @@
-struct {
+struct s {
 	int a[2];
-} s;
+};
 
-int sarray(void)
+
+static struct s s;
+
+static int sarray(void)
 {
 	s.a[1] = 1;
 	return s.a[1];
@@ -10,8 +13,9 @@ int sarray(void)
 
 /*
  * check-name: init global array
- * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-command: test-linearize $file
  * check-output-ignore
  * check-output-excludes: load\\.
  * check-output-pattern(1): store\\.
+ * check-output-pattern(1): ret.32 *\\$1
  */
diff --git a/validation/mem2reg/init-local-array.c b/validation/mem2reg/init-local-array.c
index 2ac53bc77..639a74f10 100644
--- a/validation/mem2reg/init-local-array.c
+++ b/validation/mem2reg/init-local-array.c
@@ -1,25 +1,28 @@
-int array(void)
+static int array(void)
 {
 	int a[2];
 
 	a[1] = 1;
+	a[0] = 0;
 	return a[1];
 }
 
-int sarray(void)
+static int sarray(void)
 {
 	struct {
 		int a[2];
 	} s;
 
 	s.a[1] = 1;
+	s.a[0] = 0;
 	return s.a[1];
 }
 
 /*
  * check-name: init local array
- * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-command: test-linearize $file
  * check-output-ignore
- * check-output-excludes: load\\.
- * check-output-excludes: store\\.
+ * check-output-excludes: load
+ * check-output-excludes: store
+ * check-output-pattern(2): ret.32 *\\$1
  */
diff --git a/validation/kill-casts.c b/validation/mem2reg/kill-casts.c
similarity index 100%
rename from validation/kill-casts.c
rename to validation/mem2reg/kill-casts.c
diff --git a/validation/mem2reg/loop02-global.c b/validation/mem2reg/loop02-global.c
index a0a8b42b0..b627b33d1 100644
--- a/validation/mem2reg/loop02-global.c
+++ b/validation/mem2reg/loop02-global.c
@@ -16,7 +16,7 @@ int foo(void)
 
 /*
  * check-name: loop02 global
- * check-command: test-linearize -Wno-decl -fdump-ir=mem2reg $file
+ * check-command: test-linearize -Wno-decl $file
  * check-output-ignore
  * check-output-excludes: load\\.
  */
diff --git a/validation/mem2reg/missing-return.c b/validation/mem2reg/missing-return.c
new file mode 100644
index 000000000..06f6e4d52
--- /dev/null
+++ b/validation/mem2reg/missing-return.c
@@ -0,0 +1,34 @@
+int f1(void)
+{
+	if (1)
+		return 1;
+}
+
+int f0(void)
+{
+	if (0)
+		return 0;
+}
+
+int fx(int p)
+{
+	if (p)
+		return 0;
+}
+
+int bar(int p)
+{
+	if (p)
+		return 0;
+	p++;
+}
+
+/*
+ * check-name: missing-return
+ * check-command: test-linearize -m32 -fdump-ir=mem2reg -Wno-decl $file
+ * check-known-to-fail
+ *
+ * check-output-ignore
+ * check-output-pattern(1): ret.32 *\\$1
+ * check-output-pattern(3): ret.32 *UNDEF
+ */
diff --git a/validation/reload-aliasing.c b/validation/mem2reg/reload-aliasing.c
similarity index 100%
rename from validation/reload-aliasing.c
rename to validation/mem2reg/reload-aliasing.c
diff --git a/validation/mem2reg/store-deadborn.c b/validation/mem2reg/store-deadborn.c
new file mode 100644
index 000000000..cca34d592
--- /dev/null
+++ b/validation/mem2reg/store-deadborn.c
@@ -0,0 +1,9 @@
+static void foo(int a)
+{
+	return;
+	a = 0;
+}
+
+/*
+ * check-name: store-deadborn
+ */
diff --git a/validation/linear/stray-phisrc.c b/validation/mem2reg/stray-phisrc.c
similarity index 100%
rename from validation/linear/stray-phisrc.c
rename to validation/mem2reg/stray-phisrc.c
diff --git a/validation/mem2reg/struct.c b/validation/mem2reg/struct.c
new file mode 100644
index 000000000..13962a8e6
--- /dev/null
+++ b/validation/mem2reg/struct.c
@@ -0,0 +1,32 @@
+struct s {
+	int a;
+	int b;
+};
+
+int f0(void)
+{
+	struct s s;
+
+	s.a = 0;
+	s.b = 1;
+
+	return s.a;
+}
+
+int f1(void)
+{
+	struct s s;
+
+	s.a = 1;
+	s.b = 0;
+
+	return s.b;
+}
+
+/*
+ * check-name: struct
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-output-ignore
+ * check-output-pattern(2): ret.32 *\\$0
+ */
diff --git a/validation/mem2reg/unused-var.c b/validation/mem2reg/unused-var.c
new file mode 100644
index 000000000..ac3945820
--- /dev/null
+++ b/validation/mem2reg/unused-var.c
@@ -0,0 +1,23 @@
+int foo(int a)
+{
+	switch (a) {
+		int u = 1;
+
+	default:
+		return a;
+	}
+}
+
+/*
+ * check-name: unused-var
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-output-start
+foo:
+.L0:
+	<entry-point>
+	ret.32      %arg1
+
+
+ * check-output-end
+ */
diff --git a/validation/mem2reg/killed-insn.c b/validation/optim/killed-insn.c
similarity index 53%
rename from validation/mem2reg/killed-insn.c
rename to validation/optim/killed-insn.c
index adbef9805..d1cdd02ee 100644
--- a/validation/mem2reg/killed-insn.c
+++ b/validation/optim/killed-insn.c
@@ -1,14 +1,13 @@
-static int g;
-static void foo(void)
+static void foo(int v)
 {
 	int a[2] = { };
 	a;
-	a[1] = g;
+	a[1] = v;
 }
 
 /*
  * check-name: killed-insn
- * check-command: test-linearize -fdump-ir=mem2reg $file
+ * check-command: test-linearize $file
  *
  * check-output-ignore
  * check-output-excludes: store\\.
diff --git a/validation/optim/null-phi.c b/validation/optim/null-phi.c
new file mode 100644
index 000000000..1f9de4d5b
--- /dev/null
+++ b/validation/optim/null-phi.c
@@ -0,0 +1,9 @@
+static int foo(void)
+{
+	if (0)
+		return 0;
+}
+
+/*
+ * check-name: null-phi
+ */
