1 //===---------------------------------------------------------------------===//
2 // Random ideas for the X86 backend: SSE-specific stuff.
3 //===---------------------------------------------------------------------===//
5 - Consider eliminating the unaligned SSE load intrinsics, replacing them with
6 unaligned LLVM load instructions.
8 //===---------------------------------------------------------------------===//
10 Expand libm rounding functions inline: Significant speedups possible.
11 http://gcc.gnu.org/ml/gcc-patches/2006-10/msg00909.html
13 //===---------------------------------------------------------------------===//
15 When compiled with unsafemath enabled, "main" should enable SSE DAZ mode and
18 //===---------------------------------------------------------------------===//
20 Think about doing i64 math in SSE regs on x86-32.
22 //===---------------------------------------------------------------------===//
24 This testcase should have no SSE instructions in it, and only one load from
27 double %test3(bool %B) {
28 %C = select bool %B, double 123.412, double 523.01123123
32 Currently, the select is being lowered, which prevents the dag combiner from
33 turning 'select (load CPI1), (load CPI2)' -> 'load (select CPI1, CPI2)'
35 The pattern isel got this one right.
37 //===---------------------------------------------------------------------===//
39 SSE should implement 'select_cc' using 'emulated conditional moves' that use
40 pcmp/pand/pandn/por to do a selection instead of a conditional branch:
42 double %X(double %Y, double %Z, double %A, double %B) {
43 %C = setlt double %A, %B
44 %z = fadd double %Z, 0.0 ;; select operand is not a load
45 %D = select bool %C, double %Y, double %z
57 ucomisd 40(%esp), %xmm1
67 //===---------------------------------------------------------------------===//
69 Lower memcpy / memset to a series of SSE 128 bit move instructions when it's
72 //===---------------------------------------------------------------------===//
75 if (copysign(1.0, x) == copysign(1.0, y))
80 //===---------------------------------------------------------------------===//
82 Use movhps to update upper 64-bits of a v4sf value. Also movlps on lower half
85 //===---------------------------------------------------------------------===//
87 Better codegen for vector_shuffles like this { x, 0, 0, 0 } or { x, 0, x, 0}.
88 Perhaps use pxor / xorp* to clear a XMM register first?
90 //===---------------------------------------------------------------------===//
92 External test Nurbs exposed some problems. Look for
93 __ZN15Nurbs_SSE_Cubic17TessellateSurfaceE, bb cond_next140. This is what icc
96 movaps (%edx), %xmm2 #59.21
97 movaps (%edx), %xmm5 #60.21
98 movaps (%edx), %xmm4 #61.21
99 movaps (%edx), %xmm3 #62.21
100 movl 40(%ecx), %ebp #69.49
101 shufps $0, %xmm2, %xmm5 #60.21
102 movl 100(%esp), %ebx #69.20
103 movl (%ebx), %edi #69.20
104 imull %ebp, %edi #69.49
105 addl (%eax), %edi #70.33
106 shufps $85, %xmm2, %xmm4 #61.21
107 shufps $170, %xmm2, %xmm3 #62.21
108 shufps $255, %xmm2, %xmm2 #63.21
109 lea (%ebp,%ebp,2), %ebx #69.49
111 lea -3(%edi,%ebx), %ebx #70.33
113 addl 32(%ecx), %ebx #68.37
114 testb $15, %bl #91.13
115 jne L_B1.24 # Prob 5% #91.13
117 This is the llvm code after instruction scheduling:
119 cond_next140 (0xa910740, LLVM BB @0xa90beb0):
120 %reg1078 = MOV32ri -3
121 %reg1079 = ADD32rm %reg1078, %reg1068, 1, %NOREG, 0
122 %reg1037 = MOV32rm %reg1024, 1, %NOREG, 40
123 %reg1080 = IMUL32rr %reg1079, %reg1037
124 %reg1081 = MOV32rm %reg1058, 1, %NOREG, 0
125 %reg1038 = LEA32r %reg1081, 1, %reg1080, -3
126 %reg1036 = MOV32rm %reg1024, 1, %NOREG, 32
127 %reg1082 = SHL32ri %reg1038, 4
128 %reg1039 = ADD32rr %reg1036, %reg1082
129 %reg1083 = MOVAPSrm %reg1059, 1, %NOREG, 0
130 %reg1034 = SHUFPSrr %reg1083, %reg1083, 170
131 %reg1032 = SHUFPSrr %reg1083, %reg1083, 0
132 %reg1035 = SHUFPSrr %reg1083, %reg1083, 255
133 %reg1033 = SHUFPSrr %reg1083, %reg1083, 85
134 %reg1040 = MOV32rr %reg1039
135 %reg1084 = AND32ri8 %reg1039, 15
137 JE mbb<cond_next204,0xa914d30>
139 Still ok. After register allocation:
141 cond_next140 (0xa910740, LLVM BB @0xa90beb0):
143 %EDX = MOV32rm <fi#3>, 1, %NOREG, 0
144 ADD32rm %EAX<def&use>, %EDX, 1, %NOREG, 0
145 %EDX = MOV32rm <fi#7>, 1, %NOREG, 0
146 %EDX = MOV32rm %EDX, 1, %NOREG, 40
147 IMUL32rr %EAX<def&use>, %EDX
148 %ESI = MOV32rm <fi#5>, 1, %NOREG, 0
149 %ESI = MOV32rm %ESI, 1, %NOREG, 0
150 MOV32mr <fi#4>, 1, %NOREG, 0, %ESI
151 %EAX = LEA32r %ESI, 1, %EAX, -3
152 %ESI = MOV32rm <fi#7>, 1, %NOREG, 0
153 %ESI = MOV32rm %ESI, 1, %NOREG, 32
155 SHL32ri %EDI<def&use>, 4
156 ADD32rr %EDI<def&use>, %ESI
157 %XMM0 = MOVAPSrm %ECX, 1, %NOREG, 0
158 %XMM1 = MOVAPSrr %XMM0
159 SHUFPSrr %XMM1<def&use>, %XMM1, 170
160 %XMM2 = MOVAPSrr %XMM0
161 SHUFPSrr %XMM2<def&use>, %XMM2, 0
162 %XMM3 = MOVAPSrr %XMM0
163 SHUFPSrr %XMM3<def&use>, %XMM3, 255
164 SHUFPSrr %XMM0<def&use>, %XMM0, 85
166 AND32ri8 %EBX<def&use>, 15
168 JE mbb<cond_next204,0xa914d30>
170 This looks really bad. The problem is shufps is a destructive opcode. Since it
171 appears as operand two in more than one shufps ops. It resulted in a number of
172 copies. Note icc also suffers from the same problem. Either the instruction
173 selector should select pshufd or The register allocator can made the two-address
174 to three-address transformation.
176 It also exposes some other problems. See MOV32ri -3 and the spills.
178 //===---------------------------------------------------------------------===//
182 __m128 test(float a) {
183 return _mm_set_ps(0.0, 0.0, 0.0, a*a);
194 Because mulss doesn't modify the top 3 elements, the top elements of
195 xmm1 are already zero'd. We could compile this to:
201 //===---------------------------------------------------------------------===//
203 Here's a sick and twisted idea. Consider code like this:
205 __m128 test(__m128 a) {
206 float b = *(float*)&A;
208 return _mm_set_ps(0.0, 0.0, 0.0, b);
211 This might compile to this code:
213 movaps c(%esp), %xmm1
218 Now consider if the ... code caused xmm1 to get spilled. This might produce
221 movaps c(%esp), %xmm1
222 movaps %xmm1, c2(%esp)
226 movaps c2(%esp), %xmm1
230 However, since the reload is only used by these instructions, we could
231 "fold" it into the uses, producing something like this:
233 movaps c(%esp), %xmm1
234 movaps %xmm1, c2(%esp)
237 movss c2(%esp), %xmm0
240 ... saving two instructions.
242 The basic idea is that a reload from a spill slot, can, if only one 4-byte
243 chunk is used, bring in 3 zeros the one element instead of 4 elements.
244 This can be used to simplify a variety of shuffle operations, where the
245 elements are fixed zeros.
247 //===---------------------------------------------------------------------===//
249 This code generates ugly code, probably due to costs being off or something:
251 define void @test(float* %P, <4 x float>* %P2 ) {
252 %xFloat0.688 = load float* %P
253 %tmp = load <4 x float>* %P2
254 %inFloat3.713 = insertelement <4 x float> %tmp, float 0.0, i32 3
255 store <4 x float> %inFloat3.713, <4 x float>* %P2
266 shufps $50, %xmm1, %xmm2
267 shufps $132, %xmm2, %xmm0
271 Would it be better to generate:
277 pinsrw $6, %eax, %xmm0
278 pinsrw $7, %eax, %xmm0
284 //===---------------------------------------------------------------------===//
286 Some useful information in the Apple Altivec / SSE Migration Guide:
288 http://developer.apple.com/documentation/Performance/Conceptual/
289 Accelerate_sse_migration/index.html
291 e.g. SSE select using and, andnot, or. Various SSE compare translations.
293 //===---------------------------------------------------------------------===//
295 Add hooks to commute some CMPP operations.
297 //===---------------------------------------------------------------------===//
299 Apply the same transformation that merged four float into a single 128-bit load
300 to loads from constant pool.
302 //===---------------------------------------------------------------------===//
304 Floating point max / min are commutable when -enable-unsafe-fp-path is
305 specified. We should turn int_x86_sse_max_ss and X86ISD::FMIN etc. into other
306 nodes which are selected to max / min instructions that are marked commutable.
308 //===---------------------------------------------------------------------===//
310 We should materialize vector constants like "all ones" and "signbit" with
313 cmpeqps xmm1, xmm1 ; xmm1 = all-ones
316 cmpeqps xmm1, xmm1 ; xmm1 = all-ones
317 psrlq xmm1, 31 ; xmm1 = all 100000000000...
319 instead of using a load from the constant pool. The later is important for
320 ABS/NEG/copysign etc.
322 //===---------------------------------------------------------------------===//
326 #include <xmmintrin.h>
328 void x(unsigned short n) {
329 a = _mm_slli_epi32 (a, n);
332 a = _mm_slli_epi32 (a, n);
335 compile to ( -O3 -static -fomit-frame-pointer):
350 "y" looks good, but "x" does silly movzwl stuff around into a GPR. It seems
351 like movd would be sufficient in both cases as the value is already zero
352 extended in the 32-bit stack slot IIRC. For signed short, it should also be
353 save, as a really-signed value would be undefined for pslld.
356 //===---------------------------------------------------------------------===//
359 int t1(double d) { return signbit(d); }
361 This currently compiles to:
363 movsd 16(%esp), %xmm0
370 We should use movmskp{s|d} instead.
372 //===---------------------------------------------------------------------===//
374 CodeGen/X86/vec_align.ll tests whether we can turn 4 scalar loads into a single
375 (aligned) vector load. This functionality has a couple of problems.
377 1. The code to infer alignment from loads of globals is in the X86 backend,
378 not the dag combiner. This is because dagcombine2 needs to be able to see
379 through the X86ISD::Wrapper node, which DAGCombine can't really do.
380 2. The code for turning 4 x load into a single vector load is target
381 independent and should be moved to the dag combiner.
382 3. The code for turning 4 x load into a vector load can only handle a direct
383 load from a global or a direct load from the stack. It should be generalized
384 to handle any load from P, P+4, P+8, P+12, where P can be anything.
385 4. The alignment inference code cannot handle loads from globals in non-static
386 mode because it doesn't look through the extra dyld stub load. If you try
387 vec_align.ll without -relocation-model=static, you'll see what I mean.
389 //===---------------------------------------------------------------------===//
391 We should lower store(fneg(load p), q) into an integer load+xor+store, which
392 eliminates a constant pool load. For example, consider:
394 define i64 @ccosf(float %z.0, float %z.1) nounwind readonly {
396 %tmp6 = fsub float -0.000000e+00, %z.1 ; <float> [#uses=1]
397 %tmp20 = tail call i64 @ccoshf( float %tmp6, float %z.0 ) nounwind readonly
400 declare i64 @ccoshf(float %z.0, float %z.1) nounwind readonly
402 This currently compiles to:
404 LCPI1_0: # <4 x float>
405 .long 2147483648 # float -0
406 .long 2147483648 # float -0
407 .long 2147483648 # float -0
408 .long 2147483648 # float -0
411 movss 16(%esp), %xmm0
413 movss 20(%esp), %xmm0
420 Note the load into xmm0, then xor (to negate), then store. In PIC mode,
421 this code computes the pic base and does two loads to do the constant pool
422 load, so the improvement is much bigger.
424 The tricky part about this xform is that the argument load/store isn't exposed
425 until post-legalize, and at that point, the fneg has been custom expanded into
426 an X86 fxor. This means that we need to handle this case in the x86 backend
427 instead of in target independent code.
429 //===---------------------------------------------------------------------===//
431 Non-SSE4 insert into 16 x i8 is atrociously bad.
433 //===---------------------------------------------------------------------===//
435 <2 x i64> extract is substantially worse than <2 x f64>, even if the destination
438 //===---------------------------------------------------------------------===//
440 SSE4 extract-to-mem ops aren't being pattern matched because of the AssertZext
441 sitting between the truncate and the extract.
443 //===---------------------------------------------------------------------===//
445 INSERTPS can match any insert (extract, imm1), imm2 for 4 x float, and insert
446 any number of 0.0 simultaneously. Currently we only use it for simple
449 See comments in LowerINSERT_VECTOR_ELT_SSE4.
451 //===---------------------------------------------------------------------===//
453 On a random note, SSE2 should declare insert/extract of 2 x f64 as legal, not
454 Custom. All combinations of insert/extract reg-reg, reg-mem, and mem-reg are
455 legal, it'll just take a few extra patterns written in the .td file.
457 Note: this is not a code quality issue; the custom lowered code happens to be
458 right, but we shouldn't have to custom lower anything. This is probably related
459 to <2 x i64> ops being so bad.
461 //===---------------------------------------------------------------------===//
463 'select' on vectors and scalars could be a whole lot better. We currently
464 lower them to conditional branches. On x86-64 for example, we compile this:
466 double test(double a, double b, double c, double d) { return a<b ? c : d; }
488 For unpredictable branches, the later is much more efficient. This should
489 just be a matter of having scalar sse map to SELECT_CC and custom expanding
492 //===---------------------------------------------------------------------===//
494 LLVM currently generates stack realignment code, when it is not necessary
495 needed. The problem is that we need to know about stack alignment too early,
498 At that point we don't know, whether there will be vector spill, or not.
499 Stack realignment logic is overly conservative here, but otherwise we can
500 produce unaligned loads/stores.
502 Fixing this will require some huge RA changes.
505 #include <emmintrin.h>
507 typedef short vSInt16 __attribute__ ((__vector_size__ (16)));
509 static const vSInt16 a = {- 22725, - 12873, - 22725, - 12873, - 22725, - 12873,
512 vSInt16 madd(vSInt16 b)
514 return _mm_madd_epi16(a, b);
517 Generated code (x86-32, linux):
522 movaps .LCPI1_0, %xmm1
528 //===---------------------------------------------------------------------===//
531 #include <emmintrin.h>
532 __m128 foo2 (float x) {
533 return _mm_set_ps (0, 0, x, 0);
536 In x86-32 mode, we generate this spiffy code:
540 pshufd $81, %xmm0, %xmm0
543 in x86-64 mode, we generate this code, which could be better:
548 pshufd $81, %xmm1, %xmm0
551 In sse4 mode, we could use insertps to make both better.
553 Here's another testcase that could use insertps [mem]:
555 #include <xmmintrin.h>
557 __m128 foo1 (float x1, float x4) {
558 return _mm_set_ps (x2, x1, x3, x4);
561 gcc mainline compiles it to:
564 insertps $0x10, x2(%rip), %xmm0
565 insertps $0x10, x3(%rip), %xmm1
571 //===---------------------------------------------------------------------===//
573 We compile vector multiply-by-constant into poor code:
575 define <4 x i32> @f(<4 x i32> %i) nounwind {
576 %A = mul <4 x i32> %i, < i32 10, i32 10, i32 10, i32 10 >
580 On targets without SSE4.1, this compiles into:
582 LCPI1_0: ## <4 x i32>
591 pshufd $3, %xmm0, %xmm1
593 imull LCPI1_0+12, %eax
595 pshufd $1, %xmm0, %xmm2
597 imull LCPI1_0+4, %eax
599 punpckldq %xmm1, %xmm2
605 imull LCPI1_0+8, %eax
607 punpckldq %xmm0, %xmm1
609 punpckldq %xmm2, %xmm0
612 It would be better to synthesize integer vector multiplication by constants
613 using shifts and adds, pslld and paddd here. And even on targets with SSE4.1,
614 simple cases such as multiplication by powers of two would be better as
615 vector shifts than as multiplications.
617 //===---------------------------------------------------------------------===//
624 return _mm_set_epi8 (1, 0, 0, 0, 0, 0, 0, 0, 0, x, 0, 1, 0, 0, 0, 0);
630 pinsrw $2, %eax, %xmm0
632 pinsrw $3, %eax, %xmm0
634 pinsrw $7, %eax, %xmm0
640 movzbl 16(%esp), %eax
642 pinsrw $3, %eax, %xmm0
657 With SSE4, it should be
658 movdqa .LC0(%rip), %xmm0
659 pinsrb $6, %edi, %xmm0
661 //===---------------------------------------------------------------------===//
663 We should transform a shuffle of two vectors of constants into a single vector
664 of constants. Also, insertelement of a constant into a vector of constants
665 should also result in a vector of constants. e.g. 2008-06-25-VecISelBug.ll.
667 We compiled it to something horrible:
671 .long 1065353216 ## float 1
675 LCPI1_0: ## <4 x float>
677 .long 1065353216 ## float 1
679 .long 1065353216 ## float 1
685 movhps LCPI1_0, %xmm0
688 shufps $2, %xmm1, %xmm2
689 shufps $132, %xmm2, %xmm0
692 //===---------------------------------------------------------------------===//
697 float foo(unsigned char x) {
701 compiles to (x86-32):
703 define float @foo(i8 zeroext %x) nounwind {
704 %tmp12 = uitofp i8 %x to float ; <float> [#uses=1]
719 We should be able to use:
720 cvtsi2ss 8($esp), %xmm0
721 since we know the stack slot is already zext'd.
723 //===---------------------------------------------------------------------===//
725 Consider using movlps instead of movsd to implement (scalar_to_vector (loadf64))
726 when code size is critical. movlps is slower than movsd on core2 but it's one
729 //===---------------------------------------------------------------------===//
731 We should use a dynamic programming based approach to tell when using FPStack
732 operations is cheaper than SSE. SciMark montecarlo contains code like this
735 double MonteCarlo_num_flops(int Num_samples) {
736 return ((double) Num_samples)* 4.0;
739 In fpstack mode, this compiles into:
742 .long 1082130432 ## float 4.000000e+00
743 _MonteCarlo_num_flops:
752 in SSE mode, it compiles into significantly slower code:
754 _MonteCarlo_num_flops:
756 cvtsi2sd 16(%esp), %xmm0
763 There are also other cases in scimark where using fpstack is better, it is
764 cheaper to do fld1 than load from a constant pool for example, so
765 "load, add 1.0, store" is better done in the fp stack, etc.
767 //===---------------------------------------------------------------------===//
769 The X86 backend should be able to if-convert SSE comparisons like "ucomisd" to
770 "cmpsd". For example, this code:
772 double d1(double x) { return x == x ? x : x + x; }
784 Also, the 'ret's should be shared. This is PR6032.
786 //===---------------------------------------------------------------------===//
788 These should compile into the same code (PR6214): Perhaps instcombine should
789 canonicalize the former into the later?
791 define float @foo(float %x) nounwind {
792 %t = bitcast float %x to i32
793 %s = and i32 %t, 2147483647
794 %d = bitcast i32 %s to float
798 declare float @fabsf(float %n)
799 define float @bar(float %x) nounwind {
800 %d = call float @fabsf(float %x)
804 //===---------------------------------------------------------------------===//
806 This IR (from PR6194):
808 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
809 target triple = "x86_64-apple-darwin10.0.0"
811 %0 = type { double, double }
812 %struct.float3 = type { float, float, float }
814 define void @test(%0, %struct.float3* nocapture %res) nounwind noinline ssp {
816 %tmp18 = extractvalue %0 %0, 0 ; <double> [#uses=1]
817 %tmp19 = bitcast double %tmp18 to i64 ; <i64> [#uses=1]
818 %tmp20 = zext i64 %tmp19 to i128 ; <i128> [#uses=1]
819 %tmp10 = lshr i128 %tmp20, 32 ; <i128> [#uses=1]
820 %tmp11 = trunc i128 %tmp10 to i32 ; <i32> [#uses=1]
821 %tmp12 = bitcast i32 %tmp11 to float ; <float> [#uses=1]
822 %tmp5 = getelementptr inbounds %struct.float3* %res, i64 0, i32 1 ; <float*> [#uses=1]
823 store float %tmp12, float* %tmp5
835 This would be better kept in the SSE unit by treating XMM0 as a 4xfloat and
836 doing a shuffle from v[1] to v[0] then a float store.
838 //===---------------------------------------------------------------------===//
840 On SSE4 machines, we compile this code:
842 define <2 x float> @test2(<2 x float> %Q, <2 x float> %R,
843 <2 x float> *%P) nounwind {
844 %Z = fadd <2 x float> %Q, %R
846 store <2 x float> %Z, <2 x float> *%P
854 insertps $0, %xmm2, %xmm2
855 insertps $16, %xmm3, %xmm2
856 insertps $0, %xmm0, %xmm3
857 insertps $16, %xmm1, %xmm3
861 pshufd $1, %xmm3, %xmm1
862 ## kill: XMM1<def> XMM1<kill>
865 The insertps's of $0 are pointless complex copies.
867 //===---------------------------------------------------------------------===//