; RUN: llvm-as < %s | opt -reassociate -gvn | llvm-dis | grep add | count 6 ; Each of these functions should turn into two adds each. @e = external global i32 ; [#uses=3] @a = external global i32 ; [#uses=3] @b = external global i32 ; [#uses=3] @c = external global i32 ; [#uses=3] @f = external global i32 ; [#uses=3] define void @test1() { %A = load i32* @a ; [#uses=2] %B = load i32* @b ; [#uses=2] %C = load i32* @c ; [#uses=2] %t1 = add i32 %A, %B ; [#uses=1] %t2 = add i32 %t1, %C ; [#uses=1] %t3 = add i32 %C, %A ; [#uses=1] %t4 = add i32 %t3, %B ; [#uses=1] ; e = (a+b)+c; store i32 %t2, i32* @e ; f = (a+c)+b store i32 %t4, i32* @f ret void } define void @test2() { %A = load i32* @a ; [#uses=2] %B = load i32* @b ; [#uses=2] %C = load i32* @c ; [#uses=2] %t1 = add i32 %A, %B ; [#uses=1] %t2 = add i32 %t1, %C ; [#uses=1] %t3 = add i32 %C, %A ; [#uses=1] %t4 = add i32 %t3, %B ; [#uses=1] ; e = c+(a+b) store i32 %t2, i32* @e ; f = (c+a)+b store i32 %t4, i32* @f ret void } define void @test3() { %A = load i32* @a ; [#uses=2] %B = load i32* @b ; [#uses=2] %C = load i32* @c ; [#uses=2] %t1 = add i32 %B, %A ; [#uses=1] %t2 = add i32 %t1, %C ; [#uses=1] %t3 = add i32 %C, %A ; [#uses=1] %t4 = add i32 %t3, %B ; [#uses=1] ; e = c+(b+a) store i32 %t2, i32* @e ; f = (c+a)+b store i32 %t4, i32* @f ret void }