blob: be390961d7cb5346291e5749145fd548e4b5d107 [file] [log] [blame]
Chris Lattner086c0142006-02-03 06:21:43 +00001Target Independent Opportunities:
2
3===-------------------------------------------------------------------------===
4
5FreeBench/mason contains code like this:
6
7static p_type m0u(p_type p) {
8 int m[]={0, 8, 1, 2, 16, 5, 13, 7, 14, 9, 3, 4, 11, 12, 15, 10, 17, 6};
9 p_type pu;
10 pu.a = m[p.a];
11 pu.b = m[p.b];
12 pu.c = m[p.c];
13 return pu;
14}
15
16We currently compile this into a memcpy from a static array into 'm', then
17a bunch of loads from m. It would be better to avoid the memcpy and just do
18loads from the static array.
19
Nate Begeman81e80972006-03-17 01:40:33 +000020//===---------------------------------------------------------------------===//
21
22Make the PPC branch selector target independant
23
24//===---------------------------------------------------------------------===//
Chris Lattner086c0142006-02-03 06:21:43 +000025
26Get the C front-end to expand hypot(x,y) -> llvm.sqrt(x*x+y*y) when errno and
27precision don't matter (ffastmath). Misc/mandel will like this. :)
28
Chris Lattner086c0142006-02-03 06:21:43 +000029//===---------------------------------------------------------------------===//
30
31Solve this DAG isel folding deficiency:
32
33int X, Y;
34
35void fn1(void)
36{
37 X = X | (Y << 3);
38}
39
40compiles to
41
42fn1:
43 movl Y, %eax
44 shll $3, %eax
45 orl X, %eax
46 movl %eax, X
47 ret
48
49The problem is the store's chain operand is not the load X but rather
50a TokenFactor of the load X and load Y, which prevents the folding.
51
52There are two ways to fix this:
53
541. The dag combiner can start using alias analysis to realize that y/x
55 don't alias, making the store to X not dependent on the load from Y.
562. The generated isel could be made smarter in the case it can't
57 disambiguate the pointers.
58
59Number 1 is the preferred solution.
60
Evan Chenge617b082006-03-13 23:19:10 +000061This has been "fixed" by a TableGen hack. But that is a short term workaround
62which will be removed once the proper fix is made.
63
Chris Lattner086c0142006-02-03 06:21:43 +000064//===---------------------------------------------------------------------===//
65
Chris Lattnera1532bc2006-02-21 18:29:44 +000066Turn this into a signed shift right in instcombine:
67
68int f(unsigned x) {
69 return x >> 31 ? -1 : 0;
70}
71
72http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25600
73http://gcc.gnu.org/ml/gcc-patches/2006-02/msg01492.html
74
Chris Lattner89188a12006-03-02 22:34:38 +000075//===---------------------------------------------------------------------===//
76
Chris Lattnerb27b69f2006-03-04 01:19:34 +000077On targets with expensive 64-bit multiply, we could LSR this:
78
79for (i = ...; ++i) {
80 x = 1ULL << i;
81
82into:
83 long long tmp = 1;
84 for (i = ...; ++i, tmp+=tmp)
85 x = tmp;
86
87This would be a win on ppc32, but not x86 or ppc64.
88
Chris Lattnerad019932006-03-04 08:44:51 +000089//===---------------------------------------------------------------------===//
Chris Lattner5b0fe7d2006-03-05 20:00:08 +000090
91Shrink: (setlt (loadi32 P), 0) -> (setlt (loadi8 Phi), 0)
92
93//===---------------------------------------------------------------------===//
Chris Lattner549f27d22006-03-07 02:46:26 +000094
Chris Lattnerc20995e2006-03-11 20:17:08 +000095Reassociate should turn: X*X*X*X -> t=(X*X) (t*t) to eliminate a multiply.
96
97//===---------------------------------------------------------------------===//
98
Chris Lattner74cfb7d2006-03-11 20:20:40 +000099Interesting? testcase for add/shift/mul reassoc:
100
101int bar(int x, int y) {
102 return x*x*x+y+x*x*x*x*x*y*y*y*y;
103}
104int foo(int z, int n) {
105 return bar(z, n) + bar(2*z, 2*n);
106}
107
108//===---------------------------------------------------------------------===//
109
Chris Lattner82c78b22006-03-09 20:13:21 +0000110These two functions should generate the same code on big-endian systems:
111
112int g(int *j,int *l) { return memcmp(j,l,4); }
113int h(int *j, int *l) { return *j - *l; }
114
115this could be done in SelectionDAGISel.cpp, along with other special cases,
116for 1,2,4,8 bytes.
117
118//===---------------------------------------------------------------------===//
119
Chris Lattnercbd3cdd2006-03-14 19:31:24 +0000120This code:
121int rot(unsigned char b) { int a = ((b>>1) ^ (b<<7)) & 0xff; return a; }
122
123Can be improved in two ways:
124
1251. The instcombiner should eliminate the type conversions.
1262. The X86 backend should turn this into a rotate by one bit.
127
Evan Chengd3864b52006-03-19 06:09:23 +0000128//===---------------------------------------------------------------------===//
129
130Add LSR exit value substitution. It'll probably be a win for Ackermann, etc.
Chris Lattnerc04b4232006-03-22 07:33:46 +0000131
132//===---------------------------------------------------------------------===//
133
134It would be nice to revert this patch:
135http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20060213/031986.html
136
137And teach the dag combiner enough to simplify the code expanded before
138legalize. It seems plausible that this knowledge would let it simplify other
139stuff too.
140
Chris Lattnere6cd96d2006-03-24 19:59:17 +0000141//===---------------------------------------------------------------------===//
142
143The loop unroller should be enhanced to be able to unroll loops that aren't
144single basic blocks. It should be able to handle stuff like this:
145
146 for (i = 0; i < c1; ++i)
147 if (c2 & (1 << i))
148 foo
149
150where c1/c2 are constants.
151
152