blob: 1ba381d30eea3183af67dbbf690877f74d9fc1c7 [file] [log] [blame]
Chris Lattner61b8c9b2005-01-11 03:05:03 +00001;; Both functions in this testcase should codegen to the same function, and
2;; neither of them should require spilling anything to the stack.
3
4; RUN: llvm-as < %s | llc -march=x86 -disable-pattern-isel=0 -stats 2>&1 | not grep 'Number of register spills'
5
6;; This can be compiled to use three registers if the loads are not
7;; folded into the multiplies, 2 registers otherwise.
8int %regpressure1(int* %P) {
9 %A = load int* %P
10 %Bp = getelementptr int* %P, int 1
11 %B = load int* %Bp
12 %s1 = mul int %A, %B
13 %Cp = getelementptr int* %P, int 2
14 %C = load int* %Cp
15 %s2 = mul int %s1, %C
16 %Dp = getelementptr int* %P, int 3
17 %D = load int* %Dp
18 %s3 = mul int %s2, %D
19 %Ep = getelementptr int* %P, int 4
20 %E = load int* %Ep
21 %s4 = mul int %s3, %E
22 %Fp = getelementptr int* %P, int 5
23 %F = load int* %Fp
24 %s5 = mul int %s4, %F
25 %Gp = getelementptr int* %P, int 6
26 %G = load int* %Gp
27 %s6 = mul int %s5, %G
28 %Hp = getelementptr int* %P, int 7
29 %H = load int* %Hp
30 %s7 = mul int %s6, %H
31 %Ip = getelementptr int* %P, int 8
32 %I = load int* %Ip
33 %s8 = mul int %s7, %I
34 %Jp = getelementptr int* %P, int 9
35 %J = load int* %Jp
36 %s9 = mul int %s8, %J
37 ret int %s9
38}
39
40;; This testcase should produce identical code to the test above.
41int %regpressure2(int* %P) {
42 %A = load int* %P
43 %Bp = getelementptr int* %P, int 1
44 %B = load int* %Bp
45 %Cp = getelementptr int* %P, int 2
46 %C = load int* %Cp
47 %Dp = getelementptr int* %P, int 3
48 %D = load int* %Dp
49 %Ep = getelementptr int* %P, int 4
50 %E = load int* %Ep
51 %Fp = getelementptr int* %P, int 5
52 %F = load int* %Fp
53 %Gp = getelementptr int* %P, int 6
54 %G = load int* %Gp
55 %Hp = getelementptr int* %P, int 7
56 %H = load int* %Hp
57 %Ip = getelementptr int* %P, int 8
58 %I = load int* %Ip
59 %Jp = getelementptr int* %P, int 9
60 %J = load int* %Jp
61 %s1 = mul int %A, %B
62 %s2 = mul int %s1, %C
63 %s3 = mul int %s2, %D
64 %s4 = mul int %s3, %E
65 %s5 = mul int %s4, %F
66 %s6 = mul int %s5, %G
67 %s7 = mul int %s6, %H
68 %s8 = mul int %s7, %I
69 %s9 = mul int %s8, %J
70 ret int %s9
71}
72
Chris Lattnera8b6f682005-01-17 23:16:01 +000073;; adds should be the same as muls.
74int %regpressure3(short* %P, bool %Cond, int* %Other) {
75 %A = load short* %P
76 %Bp = getelementptr short* %P, int 1
77 %B = load short* %Bp
78 %Cp = getelementptr short* %P, int 2
79 %C = load short* %Cp
80 %Dp = getelementptr short* %P, int 3
81 %D = load short* %Dp
82 %Ep = getelementptr short* %P, int 4
83 %E = load short* %Ep
84 %Fp = getelementptr short* %P, int 5
85 %F = load short* %Fp
86 %Gp = getelementptr short* %P, int 6
87 %G = load short* %Gp
88 %Hp = getelementptr short* %P, int 7
89 %H = load short* %Hp
90 %Ip = getelementptr short* %P, int 8
91 %I = load short* %Ip
92 %Jp = getelementptr short* %P, int 9
93 %J = load short* %Jp
94
95 ;; These casts prevent folding the loads into the adds.
96 %A = cast short %A to int
97 %B = cast short %B to int
98 %D = cast short %D to int
99 %C = cast short %C to int
100 %E = cast short %E to int
101 %F = cast short %F to int
102 %G = cast short %G to int
103 %H = cast short %H to int
104 %I = cast short %I to int
105 %J = cast short %J to int
106 %s1 = add int %A, %B
107 %s2 = add int %C, %s1
108 %s3 = add int %D, %s2
109 %s4 = add int %E, %s3
110 %s5 = add int %F, %s4
111 %s6 = add int %G, %s5
112 %s7 = add int %H, %s6
113 %s8 = add int %I, %s7
114 %s9 = add int %J, %s8
115 ret int %s9
116}
117