バンコ・イタウ・エッセ・アー（Banco Itaú S.A.）の設立は、1945年に遡る。イタウは1960年代から1970年代にかけて、次々と合併を繰り返した。1979年、ニューヨークには海外出張所をブエノスアイレスにブラジル国外の初の支店を設けた。合併は1980年代も継続され、ブラジルの中小銀行の淘汰に一躍かっている。1984年には、ニューヨーク出張所が支店に昇格した。1990年代にも、イタウの事業拡大の勢いはとまることなく、1995年にはクレディ・リヨネ（en）グループからBFB（Banco Francês e Brasileiro）を獲得し、プライベートバンキング分野に参入を開始した。また、1994年には、イタウ・ヨーロッパ（ポルトガル）、イタウ・アルゼンチン（アルゼンチン）、イタウ・バンク（英領ケイマン諸島現地法人）を子会社として設立させた。1997年には、ルクセンブルクの銀行を買収し、現在はイタウ・ヨーロッパ・ルクセンブルク（ルクセンブルク）として機能している。加えて、1998年にはアルゼンチンのBanco Del Buen Ayreを買収した。同時に、この時期には、ATMを含むシステム投資を重点的に行い、かつ、従業員の半分を削減する経営の合理化も行っている。2006年にはバンク・オブ・アメリカの子会社であるボストン銀行（en）のブラジル支店網を買収した。ボストン銀行は1947年からブラジルにおいての業務を営んでいたが、この買収により、ブラジルからボストン銀行の名前は消滅した。また、同時にボストン銀行が保有していたウルグアイとチリにおける業務も引き継いだ。2008年11月2日、ブラジルにおける民間銀行業界第3位のウニバンコとの合併を発表し、社名をイタウ・ウニバンコに改称した。2009年2月、ブラジル中央銀行は、この合併を承認した。2009年8月22日、イタウ・ウニバンコと保険会社のポルト・セグロとの業務協定を結んだと発表した。この業務協定の目的は、住宅及び自動車保険の分野での業務協定であり、豊富な顧客層を持つイタウ・ウニバンコの顧客にポルト・セグロの保険を提供することを目的としたものである。2014年3月4日、日本でのリテール業務から撤退し、顧客によりブラジル銀行への移管案内をした。
2008年に、イタウとウニバンコの合併によりイタウ・ウニバンコ・ホールディングが誕生。株主資本450億レアル（約2.1兆円）という強固な資本に加え、その高い収益性、資産の流動性、キャッシュ創出力、リスクマネジメントが評価され、金融機関としては南半球で最大、世界でも上位10位以内の時価総額を誇る。ブラジルにおいてはリテール事業の11％を握り、また、アルゼンチン、チリ、ウルグアイにも支店網を保有している。また、ニューヨーク、ロンドン、リスボン、上海市にも事業所を設けている。日本国内おいては、2004年に東京駐在事務所から東京支店に昇格した。これはブラジルの民間銀行では初となる金融庁から銀行免許許可を受けたものである。2006年12月にはバネスパ銀行東京支店より預金、送金業務を譲受した。これにより顧客ベースで16,000預金口座を取得する。東京都以外にも、2008年に豊橋出張所を開設している。
前処理と後処理の必要性は、ソフトウェアパイプラインを実装する上で難しい点の一つである。例における前処理は18命令で、ループ自体の3倍も大きい。また後処理も18命令である。すなわち、前処理と後処理は合わせてループ自体より6倍大きい。この例ではまだループの展開を試みるほどではないが、ソフトウェアパイプラインは速度とメモリ使用量の点でトレードオフを必要とする。コードサイズが大きくなりすぎると、キャッシュの性能が相対的に下がるために実行速度に影響を与える。さらに困難な点は、多くのアーキテクチャではほとんどの命令がレジスタを引数に用いており、特定のレジスタが命令にハードコードされている点である。つまり、多くのアーキテクチャでは、「レジスタX の内容とレジスタY の内容を乗算し、結果をレジスタZ に格納せよ」(X, Y, Z をレジスタやメモリから取得した数値とする)といった命令を使うことはできない。このことは従来のアーキテクチャ上ではソフトウェアパイプラインを効率的に実装できない理由としてしばしば取り上げられる。Monica Lam は論文 A Systolic Array Optimizing Compiler(1989) (ISBN 0-89838-300-5) の中でこの問題に対する優れた解決方法を示している。彼女はこの方法を Modulo Renaming と呼んでいる。この方法では、ループの本体をループがスケジュールされた後に複製し、同じ変数の異なる値に対して（両方が同時に生存する必要がある場合には）異なるレジスタが使用できるようにする。最も簡潔な例として、命令 A(i) と命令 B(i) が同時に発行でき、B(i) のレイテンシが 2 サイクルであるとする。パイプライン化されたコードは下記のようになる。A(i+2); B(i)ループ本体のコードにレジスタを割り当てる際、A(i+2) の結果が2回のループの間ずっと生存させている必要がある。A(i+2) の結果と B(i) の入力に同じレジスタを用いると、誤った結果を生じる。しかし、ループの本体を複製すると、問題が解決できる。 A(i+2); B(i) A(i+3); B(i+1)ここで命令 A(i+2) と命令 A(i+3) に異なるレジスタを割り当てることができる。詳細には r1 = A(i+2); B(i) = r1 r2 = A(i+3); B(i+1) = r2 i = i + 2 各命令が出力レジスタに書き込む前に入力レジスタを読み込むことが保証できれば、このコードは正しく動作する。複製されたループ本体コードの最初では、r1 が A(i+2) の結果を保持している。i が2増加するので、これは複製されたループの繰り返し部分では A(i) の値である。もちろんコードの複製により前処理や後処理と同様コードサイズが増加し命令キャッシュへの圧迫が大きくなる。にもかかわらず、十分な命令レベルの並列化が可能なアーキテクチャで、ループの回数が大きい場合に適用すれば、コードサイズを増加させても十分価値がある高い性能を容易に発揮することができる。