xref: /llvm-project/llvm/test/CodeGen/X86/dagcombine-unsafe-math.ll (revision 005d705d4392d320244cfe9b1d5fdb6d02bdcd68)
1; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx | FileCheck %s
2
3
4; rdar://13126763
5; Expression "x + x*x" was mistakenly transformed into "x * 3.0f".
6
7define float @test1(float %x) {
8; CHECK-LABEL: test1:
9; CHECK:       ## %bb.0:
10; CHECK-NEXT:    vmulss %xmm0, %xmm0, %xmm1
11; CHECK-NEXT:    vaddss %xmm0, %xmm1, %xmm0
12; CHECK-NEXT:    retq
13  %t1 = fmul fast float %x, %x
14  %t2 = fadd fast float %t1, %x
15  ret float %t2
16}
17
18; (x + x) + x => x * 3.0
19define float @test2(float %x) {
20; CHECK-LABEL: test2:
21; CHECK:       ## %bb.0:
22; CHECK-NEXT:    vmulss {{.*}}(%rip), %xmm0, %xmm0
23; CHECK-NEXT:    retq
24  %t1 = fadd fast float %x, %x
25  %t2 = fadd fast float %t1, %x
26  ret float %t2
27}
28
29; x + (x + x) => x * 3.0
30define float @test3(float %x) {
31; CHECK-LABEL: test3:
32; CHECK:       ## %bb.0:
33; CHECK-NEXT:    vmulss {{.*}}(%rip), %xmm0, %xmm0
34; CHECK-NEXT:    retq
35  %t1 = fadd fast float %x, %x
36  %t2 = fadd fast float %x, %t1
37  ret float %t2
38}
39
40; (y + x) + x != x * 3.0
41define float @test4(float %x, float %y) {
42; CHECK-LABEL: test4:
43; CHECK:       ## %bb.0:
44; CHECK-NEXT:    vaddss %xmm1, %xmm0, %xmm1
45; CHECK-NEXT:    vaddss %xmm0, %xmm1, %xmm0
46; CHECK-NEXT:    retq
47  %t1 = fadd fast float %x, %y
48  %t2 = fadd fast float %t1, %x
49  ret float %t2
50}
51
52; rdar://13445387
53; "x + x + x => 3.0 * x" should be disabled after legalization because
54; Instruction-Selection doesn't know how to handle "3.0"
55;
56define float @test5(<4 x float> %x) {
57; CHECK-LABEL: test5:
58; CHECK:       ## %bb.0:
59; CHECK-NEXT:    vmulss {{.*}}(%rip), %xmm0, %xmm0
60; CHECK-NEXT:    retq
61  %splat = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> zeroinitializer
62  %v1 = extractelement <4 x float> %splat, i32 1
63  %v0 = extractelement <4 x float> %splat, i32 0
64  %add1 = fadd reassoc nsz float %v0, %v1
65  %v2 = extractelement <4 x float> %splat, i32 2
66  %add2 = fadd reassoc nsz float %v2, %add1
67  ret float %add2
68}
69
70