blob: eeae096bf9449436df4066f3528a51dbb5e0e371 [file] [log] [blame]
Chad Rosier11ab9412014-08-14 15:23:01 +00001; RUN: opt < %s -reassociate -S | FileCheck %s
2
Chad Rosierf8b55f12014-11-14 17:05:59 +00003; Canonicalize operands, but don't optimize floating point vector operations.
Chad Rosier11ab9412014-08-14 15:23:01 +00004define <4 x float> @test1() {
5; CHECK-LABEL: test1
6; CHECK-NEXT: %tmp1 = fsub fast <4 x float> zeroinitializer, zeroinitializer
Chad Rosierf8b55f12014-11-14 17:05:59 +00007; CHECK-NEXT: %tmp2 = fmul fast <4 x float> %tmp1, zeroinitializer
Chad Rosier11ab9412014-08-14 15:23:01 +00008
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
Chad Rosierd99df682014-11-14 17:08:15 +000014; Commute integer vector operations.
Chad Rosier11ab9412014-08-14 15:23:01 +000015define <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
Chad Rosierd99df682014-11-14 17:08:15 +000018; CHECK-NEXT: %tmp2 = add <2 x i32> %x, %y
Chad Rosier11ab9412014-08-14 15:23:01 +000019; 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}
Chad Rosierd99df682014-11-14 17:08:15 +000026
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}