70 lines · plain
1; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx | FileCheck %s2 3 4; rdar://131267635; 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, %xmm111; CHECK-NEXT: vaddss %xmm0, %xmm1, %xmm012; CHECK-NEXT: retq13 %t1 = fmul fast float %x, %x14 %t2 = fadd fast float %t1, %x15 ret float %t216}17 18; (x + x) + x => x * 3.019define float @test2(float %x) {20; CHECK-LABEL: test2:21; CHECK: ## %bb.0:22; CHECK-NEXT: vmulss {{.*}}(%rip), %xmm0, %xmm023; CHECK-NEXT: retq24 %t1 = fadd fast float %x, %x25 %t2 = fadd fast float %t1, %x26 ret float %t227}28 29; x + (x + x) => x * 3.030define float @test3(float %x) {31; CHECK-LABEL: test3:32; CHECK: ## %bb.0:33; CHECK-NEXT: vmulss {{.*}}(%rip), %xmm0, %xmm034; CHECK-NEXT: retq35 %t1 = fadd fast float %x, %x36 %t2 = fadd fast float %x, %t137 ret float %t238}39 40; (y + x) + x != x * 3.041define float @test4(float %x, float %y) {42; CHECK-LABEL: test4:43; CHECK: ## %bb.0:44; CHECK-NEXT: vaddss %xmm1, %xmm0, %xmm145; CHECK-NEXT: vaddss %xmm0, %xmm1, %xmm046; CHECK-NEXT: retq47 %t1 = fadd fast float %x, %y48 %t2 = fadd fast float %t1, %x49 ret float %t250}51 52; rdar://1344538753; "x + x + x => 3.0 * x" should be disabled after legalization because54; 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, %xmm060; CHECK-NEXT: retq61 %splat = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> zeroinitializer62 %v1 = extractelement <4 x float> %splat, i32 163 %v0 = extractelement <4 x float> %splat, i32 064 %add1 = fadd reassoc nsz float %v0, %v165 %v2 = extractelement <4 x float> %splat, i32 266 %add2 = fadd reassoc nsz float %v2, %add167 ret float %add268}69 70