From 7fc250bfc464604ba811e9785a4719ac2c0e6564 Mon Sep 17 00:00:00 2001
From: Tristan Gingold <gingold@adacore.com>
Date: Sat, 19 Dec 2015 13:57:37 +0100
Subject: Add testcase for ghdl-llvm unreachable code.

---
 testsuite/gna/bug029/fft.vhdl     | 25 +++++++++++++++++++++++
 testsuite/gna/bug029/fft1.vhdl    | 15 ++++++++++++++
 testsuite/gna/bug029/fft2.vhdl    | 14 +++++++++++++
 testsuite/gna/bug029/repro1.vhdl  | 42 +++++++++++++++++++++++++++++++++++++++
 testsuite/gna/bug029/repro2.vhdl  | 11 ++++++++++
 testsuite/gna/bug029/testsuite.sh | 14 +++++++++++++
 6 files changed, 121 insertions(+)
 create mode 100644 testsuite/gna/bug029/fft.vhdl
 create mode 100644 testsuite/gna/bug029/fft1.vhdl
 create mode 100644 testsuite/gna/bug029/fft2.vhdl
 create mode 100644 testsuite/gna/bug029/repro1.vhdl
 create mode 100644 testsuite/gna/bug029/repro2.vhdl
 create mode 100755 testsuite/gna/bug029/testsuite.sh

diff --git a/testsuite/gna/bug029/fft.vhdl b/testsuite/gna/bug029/fft.vhdl
new file mode 100644
index 000000000..704de1c7e
--- /dev/null
+++ b/testsuite/gna/bug029/fft.vhdl
@@ -0,0 +1,25 @@
+package fft_package is
+  TYPE complex IS ARRAY(0 TO 1) OF INTEGER;
+  CONSTANT w0 : complex := (1, 0);  --Pre-computed constants
+  CONSTANT w1 : complex := (0, -1); --Pre-computed constants
+
+  function butterfly(X1, X2 , W : complex )return complex;
+END fft_package;
+
+package body fft_package is
+
+    function butterfly ( X1, X2 , W : complex )return complex is
+      VARIABLE Y1, Y2  : complex;
+
+    BEGIN
+        -- G1 = X1 + W*X2
+        G1:Y1(0) := X1(0) + ((W(0)*X2(0)) - W(1)*X2(1)); -- G1 real
+        Y1(1) := X1(1) + ((W(0)*X2(1)) + W(1)*X2(0)); -- G1 imaginary
+
+        -- G2 = X1 - W*X2
+        Y2(0) := X1(0) - ((W(0)*X2(0)) - W(1)*X2(1)); -- G2 real
+        Y2(1) := X1(1) - ((W(0)*X2(1)) + W(1)*X2(0)); -- G2 imaginary
+         return Y1;
+         return Y2;
+    END butterfly;
+end fft_package;
diff --git a/testsuite/gna/bug029/fft1.vhdl b/testsuite/gna/bug029/fft1.vhdl
new file mode 100644
index 000000000..5ea9cf327
--- /dev/null
+++ b/testsuite/gna/bug029/fft1.vhdl
@@ -0,0 +1,15 @@
+package fft_package is
+  TYPE complex IS ARRAY(0 TO 1) OF INTEGER;
+  function butterfly(X1: complex )return complex;
+END fft_package;
+
+package body fft_package is
+
+    function butterfly ( X1: complex )return complex is
+      VARIABLE Y1  : complex := X1;
+
+    BEGIN
+      return X1;
+      return Y1;
+    END butterfly;
+end fft_package;
diff --git a/testsuite/gna/bug029/fft2.vhdl b/testsuite/gna/bug029/fft2.vhdl
new file mode 100644
index 000000000..d6c64b462
--- /dev/null
+++ b/testsuite/gna/bug029/fft2.vhdl
@@ -0,0 +1,14 @@
+package fft_package is
+  TYPE complex IS ARRAY(0 TO 1) OF INTEGER;
+  function butterfly(X1, X2 , W : complex )return complex;
+END fft_package;
+
+package body fft_package is
+
+    function butterfly ( X1, X2 , W : complex )return complex is
+
+    BEGIN
+         return X1;
+         return X2;
+    END butterfly;
+end fft_package;
diff --git a/testsuite/gna/bug029/repro1.vhdl b/testsuite/gna/bug029/repro1.vhdl
new file mode 100644
index 000000000..594133da7
--- /dev/null
+++ b/testsuite/gna/bug029/repro1.vhdl
@@ -0,0 +1,42 @@
+package foo is
+    function some_foo return integer;
+    function some_fum return integer;
+    function some_foe (x, y, w: integer) return integer;
+    function some_fee (x, y, w: integer) return integer;
+end package;
+
+package body foo is
+    function some_foo return integer is
+        
+    begin
+        return -1;
+        return 0;
+    end function;
+    
+    function some_fum return integer is
+        variable a: integer := -1;
+        variable b: integer := 0;
+    begin
+        return a;
+        return b;
+    end function;
+    
+    function some_foe (x, y, w: integer) return integer is
+        variable a: integer := -1;
+        variable b: integer := 0;       
+    begin
+        return a;
+        return b;
+    end function;
+
+    function some_fee (x, y, w: integer) return integer is
+        variable a: integer := -1;
+        variable b: integer := 0;       
+    begin
+        a := x + w;
+        b := y + w;
+        return a;
+        return b;
+    end function;
+            
+end package body;
diff --git a/testsuite/gna/bug029/repro2.vhdl b/testsuite/gna/bug029/repro2.vhdl
new file mode 100644
index 000000000..6d5bd9ae7
--- /dev/null
+++ b/testsuite/gna/bug029/repro2.vhdl
@@ -0,0 +1,11 @@
+package foo is
+    function some_foo return integer;
+end package;
+
+package body foo is
+    function some_foo return integer is
+    begin
+        return -1;
+        return 0;
+    end function;
+end package body;
diff --git a/testsuite/gna/bug029/testsuite.sh b/testsuite/gna/bug029/testsuite.sh
new file mode 100755
index 000000000..95404c65b
--- /dev/null
+++ b/testsuite/gna/bug029/testsuite.sh
@@ -0,0 +1,14 @@
+#! /bin/sh
+
+. ../../testenv.sh
+
+analyze fft.vhdl
+analyze fft1.vhdl
+analyze fft2.vhdl
+analyze repro1.vhdl
+analyze repro2.vhdl
+#elab_simulate simple1
+
+clean
+
+echo "Test successful"
-- 
cgit v1.2.3