In addition to the answer of @Johan at point 5), note I use a different cost function, with which you are probably more familiar with
Define the cost function $\mathbf{V}(\mathbf{x},\mathbf{U})$ as
$$
\mathbf{V}(\mathbf{x},\mathbf{U}) :=
\mathbf{x}_N^\mathrm{T} \mathbf{P} \mathbf{x}_N +
\sum_{i=0}^{N-1}\left( \mathbf{x}_i^\mathrm{T} \mathbf{Q}
\mathbf{x}_i + \mathbf{u}_i^\mathrm{T} \mathbf{R}
\mathbf{u}_i\right)
$$
Herein $N$ is the control horizon, $\mathbf{P}$ is the terminal state weight, $\mathbf{Q}$ is the state weight and $\mathbf{R}$ is the input weight. Remark: $\mathbf{P}$, $\mathbf{Q}$ and $\mathbf{R}$ are positive semidefinite. Furthermore, $\mathbf{U}$ is the stacked input vector, that is,
$$
\mathbf{U} :=
\begin{bmatrix}
\mathbf{u}_0^T & \mathbf{u}_1^T & \ldots & \mathbf{u}_{N-1}^T
\end{bmatrix}^T
$$
The optimal control $\mathbf{U}^*$ input is given by
$$
\mathbf{U}^* = \arg \mathbf{V}^*(\mathbf{x},\mathbf{U}) = \arg \min_{\mathbf{U}} \mathbf{V}(\mathbf{x},\mathbf{U})
$$
The sum in the cost function can be rewritten in a matrix equation
$$
\begin{gathered}
\mathbf{V}(\mathbf{x},\mathbf{U}) = \mathbf{x}_0^\mathrm{T} \mathbf{Q}
\mathbf{x}_0 +
\begin{bmatrix}
\mathbf{x}_1 \\
\mathbf{x}_2 \\
\vdots \\
\mathbf{x}_N
\end{bmatrix}^\mathrm{T}
\begin{bmatrix}
\mathbf{Q} & 0 & \cdots & 0 \\
0 & \mathbf{Q} & \cdots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
0 & 0 & \cdots & \mathbf{P}
\end{bmatrix}
\begin{bmatrix}
\mathbf{x}_1 \\
\mathbf{x}_2 \\
\vdots \\
\mathbf{x}_N
\end{bmatrix}
+
\begin{bmatrix}
\mathbf{u}_0 \\
\mathbf{u}_1 \\
\vdots \\
\mathbf{u}_{N-1}
\end{bmatrix}^\mathrm{T}
\begin{bmatrix}
\mathbf{R} & 0 & \cdots & 0 \\
0 & \mathbf{R} & \cdots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
0 & 0 & \cdots & \mathbf{R}
\end{bmatrix}
\begin{bmatrix}
\mathbf{u}_0 \\
\mathbf{u}_1 \\
\vdots \\
\mathbf{u}_{N-1}
\end{bmatrix} \\
\Leftrightarrow \\
\mathbf{V}(\mathbf{x},\mathbf{U}) = \mathbf{x}^\mathrm{T}\mathbf{Q}\mathbf{x} +
\mathbf{X}^\mathrm{T}\mathbf{\Omega}\mathbf{X} +
\mathbf{U}^\mathrm{T}\mathbf{\Psi}\mathbf{U}
\end{gathered}
$$
Remark: $\mathbf{x} = \mathbf{x}_0$. Furthermore, $\mathbf{P} \succeq 0 \wedge
\mathbf{Q} \succeq 0$ implies that $\mathbf{\Omega} \succeq 0$ and $\mathbf{R}
\succ 0$ implies that $\mathbf{\Psi} \succ 0$. The cost function now still depends on the future state $\mathbf{X}$. To eliminate $\mathbf{X}$ the prediction matrices $\mathbf{\Phi}$ and $\mathbf{\Gamma}$
are computed such that the stacked state vector is a function of the initial
state and the stacked input vector i.e. $\mathbf{X} = \mathbf{\Phi}\mathbf{x} +
\mathbf{\Gamma}\mathbf{U}$.
$$
\mathbf{\Phi} =
\begin{bmatrix}
\mathbf{A} \\
\mathbf{A}^2 \\
\vdots \\
\mathbf{A}^N
\end{bmatrix}
\qquad
\mathbf{\Gamma} =
\begin{bmatrix}
\mathbf{B} & 0 & \cdots & 0 \\
\mathbf{A}\mathbf{B} & \mathbf{B} & \cdots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
\mathbf{A}^{N-1}\mathbf{B} & \mathbf{A}^{N-2}\mathbf{B} & \cdots & \mathbf{B}
\end{bmatrix}
$$
The cost function $\mathbf{V}(\mathbf{x},\mathbf{U})$ can now be written as a
function of the initial state $\mathbf{x}$ and the stacked input vector
$\mathbf{U}$
$$
\mathbf{V}(\mathbf{x},\mathbf{U}) = \frac{1}{2} \mathbf{U}^\mathrm{T}
\mathbf{G} \mathbf{U} + \mathbf{U}^\mathrm{T} \mathbf{F}\mathbf{x} +
\mathbf{x}^\mathrm{T} \left( \mathbf{Q} + \mathbf{\Phi}^\mathrm{T}
\mathbf{\Omega} \mathbf{\Phi} \right) \mathbf{x}
$$
Where $\mathbf{G} = 2\left(\mathbf{\Psi} + \mathbf{\Gamma}^\mathrm{T}
\mathbf{\Omega} \mathbf{\Gamma} \right)$, $\mathbf{F} = 2 \mathbf{\Gamma}^\mathrm{T} \mathbf{\Omega} \mathbf{\Phi}$ and $\mathbf{G} \succ 0$. The last term of the newly derived cost function is independent on $\mathbf{U}$. Therefore, it can be neglected when computing the optimal input sequence $\mathbf{U}^*(\mathbf{x})$
Now lets add some input and state constraints
$$
\mathbf{u}_\mathrm{min} \leq \mathbf{u}_k \leq \mathbf{u}_\mathrm{max} \wedge
\mathbf{x}_\mathrm{min} \leq \mathbf{x}_k \leq \mathbf{x}_\mathrm{max}
$$
This can be rewritten to
$$
\begin{bmatrix}
0 \\
0 \\
-\mathbf{I}_n \\
\mathbf{I}_n
\end{bmatrix}
\mathbf{x}_k +
\begin{bmatrix}
-\mathbf{I}_m \\
\mathbf{I}_m \\
0 \\
0
\end{bmatrix}
\mathbf{u}_k \leq
\begin{bmatrix}
-\mathbf{u}_\mathrm{min} \\
\mathbf{u}_\mathrm{max} \\
-\mathbf{x}_\mathrm{min} \\
\mathbf{x}_\mathrm{max}
\end{bmatrix}
\Leftrightarrow
\mathbf{M}_k\mathbf{x}_k + \mathbf{E}_k\mathbf{u}_k \leq \mathbf{b}_k
$$
Now note that this is only valid for $k = 0,1 \ldots, N-1$ so not up to the control horizon $N$. As such we add a terminal constraint for $N$ on the state.
$$
\begin{bmatrix}
-\mathbf{I}_{n} \\
\mathbf{I}_{n} \\
\end{bmatrix}
\mathbf{x}_N \leq
\begin{bmatrix}
-\mathbf{x}_\mathrm{min} \\
\mathbf{x}_\mathrm{max} \\
\end{bmatrix}
\Rightarrow \mathbf{M}_N\mathbf{x}_N \leq \mathbf{b}_N
$$
All constraints can now be combined to
$$
\begin{gathered}
\begin{bmatrix}
\mathbf{M}_0 \\
0 \\
\vdots \\
0
\end{bmatrix}
\mathbf{x}_0 +
\begin{bmatrix}
0 & \cdots & 0 \\
\mathbf{M}_1 & \cdots & 0 \\
\vdots & \ddots & \vdots \\
0 & \cdots & \mathbf{M}_N
\end{bmatrix}
\begin{bmatrix}
\mathbf{x}_1 \\
\mathbf{x}_2 \\
\vdots \\
\mathbf{x}_N
\end{bmatrix} +
\begin{bmatrix}
\mathbf{E}_0 & \cdots & 0 \\
\vdots & \ddots & \vdots \\
0 & \cdots & \mathbf{E}_{N-1} \\
0 & \cdots & 0
\end{bmatrix}
\begin{bmatrix}
\mathbf{u}_0 \\
\mathbf{u}_1 \\
\vdots \\
\mathbf{u}_N
\end{bmatrix} \leq
\begin{bmatrix}
\mathbf{b}_0 \\
\mathbf{b}_1 \\
\vdots \\
\mathbf{b}_N
\end{bmatrix} \\
\Leftrightarrow \\
\mathbf{\mathcal{D}}\mathbf{x} + \mathbf{\mathcal{M}}\mathbf{X} +
\mathbf{\mathcal{E}}\mathbf{U} \leq \mathbf{c}
\end{gathered}
$$
Again this equation still depends on $\mathbf{X}$, which we eliminate using the same procedure as before. As a result, the above equation can be written as
$$\mathbf{J}\mathbf{U} \leq \mathbf{c} + \mathbf{W}\mathbf{x}$$
With $\mathbf{J} = \mathbf{\mathcal{M}}\mathbf{\Gamma} + \mathbf{\mathcal{E}}$
and $\mathbf{W} = -\mathbf{\mathcal{D}} - \mathbf{\mathcal{M}}\mathbf{\Phi}$. Now
the constraints only depend on the stacked input vector and the initial state.
The constrained MPC problem can then be formulated as
$$
\arg \underset{\mathbf{U}}{\min}\; \mathbf{V}(\mathbf{x},\mathbf{U}) \quad
\text{s.t.} \quad \mathbf{J}\mathbf{U} \leq \mathbf{c} + \mathbf{W}\mathbf{x}
$$
Now if you use a QP solver you will have the following QP problem
$$
\begin{aligned}
\mathbf{U}^*(\mathbf{x}) = \arg \underset{\mathbf{U}}{\min}\;\;&
\frac{1}{2}\mathbf{U}^\mathrm{T} \mathbf{G} \mathbf{U} + \mathbf{U}^\mathrm{T}
\mathbf{F} \mathbf{x} \\[1ex]
\text{subject to:}\;\;&\mathbf{x}_0 = \mathbf{x} \hspace{3cm}
\text{Measurement} \nonumber \\
&\mathbf{J}\mathbf{U} \leq \mathbf{c} + \mathbf{W}\mathbf{x} \hspace{1.82cm}
\text{Constraints} \nonumber \\
&\mathbf{Q} \succ 0, \mathbf{R} \succ 0 \hspace{1.99cm} \text{Cost weights}
\end{aligned}
$$
Now if you want to solve these kind of typical MPC problems, I would strongly advice to use the MPT toolbox, http://people.ee.ethz.ch/~mpt/3/, an example http://control.ee.ethz.ch/~mpt/3/UI/RegulationProblem. Furthermore, the slides from this workshop may help you as well https://www.kirp.chtf.stuba.sk/pc11/data/workshops/mpc/
This is not a full answer, but would be too long to be a comment.
A delay would mean that $A$ would have one or more poles at zero, therefore some of the coefficients of its characteristic equation, which are estimated with RLS, would be zero. However least squares is not great at returning exactly zero for these coefficients, they might be really small, but often not exactly zero. Using sparse regression might give you better results and a quick search shows that there are also sparse recursive least squares algorithms.
Once you have found your system with delay you will have that $C\,B$ till $C\,A^d\,B$ will be zero, where $d+1$ is the number of samples delay. But in order to have a good prediction you do want the rank of $\Phi$ equal to its width, so choose $N_c$ such that $C\,A^{N_p - N_c}\,B\neq0$.
Best Answer
GPC is essentially finite-horizon unconstrained adaptive discrete-time LQ for a particular system model. As constraint-handling is the main reason MPC has become so successful, it is not that interesting today in an MPC context.
Yes, one could consider it obsolete.