データ型を受け取って同じデータ型を返す関数を次々に適用した場合の最適化について質問です。

次のようなデータ型と、それを使った関数があるとします。

data T = T Int Int
f (T x y) = T (x*2) (y*3)

この関数を次のようにして使った時、

a = T 1 2
b = f (f a)

一度目の f の出力値を作る所から二度目の f の入力の間にかけて、
データ型を被せてすぐに剥がすという無駄なことをしているので、
次のように最適化される嬉しいのですが、

b = T (1 * 2 * 2, 2 * 3 * 3)

特に何もしなくても自動的にこのように最適化されるのでしょうか。
あるいは、書き換え規則(RULES)のような
何かコンパイラへのヒントを与えれば自動的に最適化されるのでしょうか。
それとも、自動的には不可能でしょうか。

コンパイラは GHC 6.12.3 を使用しています。