OLD | NEW |
---|---|
(Empty) | |
1 ; Test the lowering sequence for commutative operations. If there is a source | |
2 ; operand whose lifetime ends in an operation, it should be the first operand, | |
3 ; eliminating the need for a move to start the new lifetime. | |
4 | |
5 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ | |
6 ; RUN: --target x8632 -i %s --args -O2 \ | |
7 ; RUN: | %if --need=target_X8632 --command FileCheck %s | |
8 | |
9 declare void @useInteger(i32 %arg) | |
10 declare void @useFloat(float %arg) | |
11 | |
12 define void @integerAddLeft(i32 %a, i32 %b) { | |
13 entry: | |
14 %tmp = add i32 %a, %b | |
15 %result = add i32 %a, %tmp | |
16 tail call void @useInteger(i32 %result) | |
17 ret void | |
18 } | |
19 ; CHECK-LABEL: integerAddLeft | |
20 ; CHECK-NOT: mov [[REG1:e.x]],[[REG2:e.x]] | |
Jim Stichnoth
2015/10/06 19:35:49
A few problems here.
1. You're matching eax/ebx/e
sehr
2015/10/07 00:18:30
Completely revamped per your comments here and in
| |
21 ; CHECK: add [[REG1:e.x]],[[REG2:e.x]] | |
22 ; CHECK: add [[REG1:e.x]],[[REG2:e.x]] | |
23 | |
24 define void @integerAddRight(i32 %a, i32 %b) { | |
25 entry: | |
26 %tmp = add i32 %a, %b | |
27 %result = add i32 %b, %tmp | |
28 tail call void @useInteger(i32 %result) | |
29 ret void | |
30 } | |
31 ; CHECK-LABEL: integerAddRight | |
32 ; CHECK-NOT: mov [[REG1:e.x]],[[REG2:e.x]] | |
33 ; CHECK: add [[REG1:e.x]],[[REG2:e.x]] | |
34 ; CHECK: add [[REG1:e.x]],[[REG2:e.x]] | |
35 | |
36 define void @integerMultiplyLeft(i32 %a, i32 %b) { | |
37 entry: | |
38 %tmp = mul i32 %a, %b | |
39 %result = mul i32 %a, %tmp | |
40 tail call void @useInteger(i32 %result) | |
41 ret void | |
42 } | |
43 ; CHECK-LABEL: integerMultiplyLeft | |
44 ; CHECK-NOT: mov [[REG1:e.x]],[[REG2:e.x]] | |
45 ; CHECK: mul [[REG1:e.x]],[[REG2:e.x]] | |
46 ; CHECK: mul [[REG1:e.x]],[[REG2:e.x]] | |
47 | |
48 define void @integerMultiplyRight(i32 %a, i32 %b) { | |
49 entry: | |
50 %tmp = mul i32 %a, %b | |
51 %result = mul i32 %b, %tmp | |
52 tail call void @useInteger(i32 %result) | |
53 ret void | |
54 } | |
55 ; CHECK-LABEL: integerMultiplyRight | |
56 ; CHECK-NOT: mov [[REG1:e.x]],[[REG2:e.x]] | |
57 ; CHECK: mul [[REG1:e.x]],[[REG2:e.x]] | |
58 ; CHECK: mul [[REG1:e.x]],[[REG2:e.x]] | |
59 | |
60 define void @floatAddLeft(float %a, float %b) { | |
61 entry: | |
62 %tmp = fadd float %a, %b | |
63 %result = fadd float %a, %tmp | |
64 tail call void @useFloat(float %result) | |
65 ret void | |
66 } | |
67 ; CHECK-LABEL: floatAddLeft | |
68 ; CHECK-NOT: movss [[REG1:xmm.]],[[REG2:xmm.]] | |
69 ; CHECK: addss [[REG1:xmm.]],[[REG2:xmm.]] | |
70 ; CHECK: addss [[REG1:xmm.]],[[REG2:xmm.]] | |
71 | |
72 define void @floatAddRight(float %a, float %b) { | |
73 entry: | |
74 %tmp = fadd float %a, %b | |
75 %result = fadd float %b, %tmp | |
76 tail call void @useFloat(float %result) | |
77 ret void | |
78 } | |
79 ; CHECK-LABEL: floatAddRight | |
80 ; CHECK-NOT: movss [[REG1:xmm.]],[[REG2:xmm.]] | |
81 ; CHECK: addss [[REG1:xmm.]],[[REG2:xmm.]] | |
82 ; CHECK: addss [[REG1:xmm.]],[[REG2:xmm.]] | |
83 | |
84 define void @floatMultiplyLeft(float %a, float %b) { | |
85 entry: | |
86 %tmp = fmul float %a, %b | |
87 %result = fmul float %a, %tmp | |
88 tail call void @useFloat(float %result) | |
89 ret void | |
90 } | |
91 ; CHECK-LABEL: floatMultiplyLeft | |
92 ; CHECK-NOT: movss [[REG1:xmm.]],[[REG2:xmm.]] | |
93 ; CHECK: mulss [[REG1:xmm.]],[[REG2:xmm.]] | |
94 ; CHECK: mulss [[REG1:xmm.]],[[REG2:xmm.]] | |
95 | |
96 define void @floatMultiplyRight(float %a, float %b) { | |
97 entry: | |
98 %tmp = fmul float %a, %b | |
99 %result = fmul float %b, %tmp | |
100 tail call void @useFloat(float %result) | |
101 ret void | |
102 } | |
103 ; CHECK-LABEL: floatMultiplyRight | |
104 ; CHECK-NOT: movss [[REG1:xmm.]],[[REG2:xmm.]] | |
105 ; CHECK: mulss [[REG1:xmm.]],[[REG2:xmm.]] | |
106 ; CHECK: mulss [[REG1:xmm.]],[[REG2:xmm.]] | |
OLD | NEW |