aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2021-01-31 16:28:09 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2021-01-31 16:28:09 +0100
commit60c1f2706e30eacc29296e6cb5d9327c85a01340 (patch)
tree6f724e58a1433f09f80de327e7e016617e1e0999
parent455f7992c4c03030f0da9c260e067b36a556371a (diff)
parent47336d48e3226903f320bb02f386322cf9e711fd (diff)
downloadsparse-60c1f2706e30eacc29296e6cb5d9327c85a01340.tar.gz
Merge branch 'fix-join-cond'
* fix add_join_conditional() when one of the alternative is VOID
-rw-r--r--linearize.c4
-rw-r--r--validation/linear/join-cond-discard.c19
2 files changed, 21 insertions, 2 deletions
diff --git a/linearize.c b/linearize.c
index e80715ab..7a6f745f 100644
--- a/linearize.c
+++ b/linearize.c
@@ -1678,9 +1678,9 @@ static pseudo_t add_join_conditional(struct entrypoint *ep, struct expression *e
struct instruction *phi_node;
if (phi1 == VOID)
- return phi2;
+ return (phi2 == VOID) ? phi2 : phi2->def->src;
if (phi2 == VOID)
- return phi1;
+ return (phi1 == VOID) ? phi1 : phi1->def->src;
phi_node = alloc_typed_instruction(OP_PHI, expr->ctype);
use_pseudo(phi_node, phi1, add_pseudo(&phi_node->phi_list, phi1));
diff --git a/validation/linear/join-cond-discard.c b/validation/linear/join-cond-discard.c
new file mode 100644
index 00000000..9f07a7d4
--- /dev/null
+++ b/validation/linear/join-cond-discard.c
@@ -0,0 +1,19 @@
+void abort(void) __attribute__((noreturn));
+
+int bar(int a)
+{
+ return a ? (abort(), 0) : 0;
+}
+
+int qux(int a)
+{
+ return a ? (abort(), 0) : (abort(), 1);
+}
+
+/*
+ * check-name: join-cond-discard
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-output-ignore
+ * check-output-excludes: phisrc\\..*phi
+ */