When checking for sret-demotion, it needs to use legal types. When using the return...
[oota-llvm.git] / test / Transforms / InstCombine / fsub-fadd.ll
1 ; RUN: opt < %s -instcombine -S | FileCheck %s
2 ; <rdar://problem/7530098>
3
4 define void @func(double* %rhi, double* %rlo, double %xh, double %xl, double %yh, double %yl) nounwind ssp {
5 entry:
6   %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
7   %tmp = fmul double %xh, 0x41A0000002000000      ; <double> [#uses=2]
8   %tmp1 = fsub double %xh, %tmp                   ; <double> [#uses=1]
9   %tmp2 = fadd double %tmp1, %tmp                 ; <double> [#uses=3]
10   %tmp3 = fsub double %xh, %tmp2                  ; <double> [#uses=2]
11   %tmp4 = fmul double %yh, 0x41A0000002000000     ; <double> [#uses=2]
12   %tmp5 = fsub double %yh, %tmp4                  ; <double> [#uses=1]
13   %tmp6 = fadd double %tmp5, %tmp4                ; <double> [#uses=3]
14   %tmp7 = fsub double %yh, %tmp6                  ; <double> [#uses=2]
15   %tmp8 = fmul double %xh, %yh                    ; <double> [#uses=3]
16   %tmp9 = fmul double %tmp2, %tmp6                ; <double> [#uses=1]
17   %tmp10 = fsub double %tmp9, %tmp8               ; <double> [#uses=1]
18   %tmp11 = fmul double %tmp2, %tmp7               ; <double> [#uses=1]
19   %tmp12 = fadd double %tmp10, %tmp11             ; <double> [#uses=1]
20   %tmp13 = fmul double %tmp3, %tmp6               ; <double> [#uses=1]
21   %tmp14 = fadd double %tmp12, %tmp13             ; <double> [#uses=1]
22   %tmp15 = fmul double %tmp3, %tmp7               ; <double> [#uses=1]
23   %tmp16 = fadd double %tmp14, %tmp15             ; <double> [#uses=1]
24   %tmp17 = fmul double %xh, %yl                   ; <double> [#uses=1]
25   %tmp18 = fmul double %xl, %yh                   ; <double> [#uses=1]
26   %tmp19 = fadd double %tmp17, %tmp18             ; <double> [#uses=1]
27   %tmp20 = fadd double %tmp19, %tmp16             ; <double> [#uses=2]
28   %tmp21 = fadd double %tmp8, %tmp20              ; <double> [#uses=1]
29   store double %tmp21, double* %rhi, align 8
30   %tmp22 = load double* %rhi, align 8             ; <double> [#uses=1]
31   %tmp23 = fsub double %tmp8, %tmp22              ; <double> [#uses=1]
32   %tmp24 = fadd double %tmp23, %tmp20             ; <double> [#uses=1]
33
34 ; CHECK: %tmp23 = fsub double %tmp8, %tmp21
35 ; CHECK: %tmp24 = fadd double %tmp23, %tmp20
36
37   store double %tmp24, double* %rlo, align 8
38   ret void
39 }