1; RUN: opt < %s -reassociate -S | FileCheck %s
2
3; Canonicalize operands, but don't optimize floating point vector operations.
4define <4 x float> @test1() {
5; CHECK-LABEL: test1
6; CHECK-NEXT: %tmp1 = fsub fast <4 x float> zeroinitializer, zeroinitializer
7; CHECK-NEXT: %tmp2 = fmul fast <4 x float> %tmp1, zeroinitializer
8
9  %tmp1 = fsub fast <4 x float> zeroinitializer, zeroinitializer
10  %tmp2 = fmul fast <4 x float> zeroinitializer, %tmp1
11  ret <4 x float> %tmp2
12}
13
14; Commute integer vector operations.
15define <2 x i32> @test2(<2 x i32> %x, <2 x i32> %y) {
16; CHECK-LABEL: test2
17; CHECK-NEXT: %tmp1 = add <2 x i32> %x, %y
18; CHECK-NEXT: %tmp2 = add <2 x i32> %x, %y
19; CHECK-NEXT: %tmp3 = add <2 x i32> %tmp1, %tmp2
20
21  %tmp1 = add <2 x i32> %x, %y
22  %tmp2 = add <2 x i32> %y, %x
23  %tmp3 = add <2 x i32> %tmp1, %tmp2
24  ret <2 x i32> %tmp3
25}
26
27define <2 x i32> @test3(<2 x i32> %x, <2 x i32> %y) {
28; CHECK-LABEL: test3
29; CHECK-NEXT: %tmp1 = mul <2 x i32> %x, %y
30; CHECK-NEXT: %tmp2 = mul <2 x i32> %x, %y
31; CHECK-NEXT: %tmp3 = mul <2 x i32> %tmp1, %tmp2
32
33  %tmp1 = mul <2 x i32> %x, %y
34  %tmp2 = mul <2 x i32> %y, %x
35  %tmp3 = mul <2 x i32> %tmp1, %tmp2
36  ret <2 x i32> %tmp3
37}
38
39define <2 x i32> @test4(<2 x i32> %x, <2 x i32> %y) {
40; CHECK-LABEL: test4
41; CHECK-NEXT: %tmp1 = and <2 x i32> %x, %y
42; CHECK-NEXT: %tmp2 = and <2 x i32> %x, %y
43; CHECK-NEXT: %tmp3 = and <2 x i32> %tmp1, %tmp2
44
45  %tmp1 = and <2 x i32> %x, %y
46  %tmp2 = and <2 x i32> %y, %x
47  %tmp3 = and <2 x i32> %tmp1, %tmp2
48  ret <2 x i32> %tmp3
49}
50
51define <2 x i32> @test5(<2 x i32> %x, <2 x i32> %y) {
52; CHECK-LABEL: test5
53; CHECK-NEXT: %tmp1 = or <2 x i32> %x, %y
54; CHECK-NEXT: %tmp2 = or <2 x i32> %x, %y
55; CHECK-NEXT: %tmp3 = or <2 x i32> %tmp1, %tmp2
56
57  %tmp1 = or <2 x i32> %x, %y
58  %tmp2 = or <2 x i32> %y, %x
59  %tmp3 = or <2 x i32> %tmp1, %tmp2
60  ret <2 x i32> %tmp3
61}
62
63define <2 x i32> @test6(<2 x i32> %x, <2 x i32> %y) {
64; CHECK-LABEL: test6
65; CHECK-NEXT: %tmp1 = xor <2 x i32> %x, %y
66; CHECK-NEXT: %tmp2 = xor <2 x i32> %x, %y
67; CHECK-NEXT: %tmp3 = xor <2 x i32> %tmp1, %tmp2
68
69  %tmp1 = xor <2 x i32> %x, %y
70  %tmp2 = xor <2 x i32> %y, %x
71  %tmp3 = xor <2 x i32> %tmp1, %tmp2
72  ret <2 x i32> %tmp3
73}
74