1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -enable-unsafe-fp-math -mtriple=x86_64-apple-darwin -mcpu=corei7-avx | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; rdar://13126763 5*9880d681SAndroid Build Coastguard Worker; Expression "x + x*x" was mistakenly transformed into "x * 3.0f". 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine float @test1(float %x) { 8*9880d681SAndroid Build Coastguard Worker %t1 = fmul fast float %x, %x 9*9880d681SAndroid Build Coastguard Worker %t2 = fadd fast float %t1, %x 10*9880d681SAndroid Build Coastguard Worker ret float %t2 11*9880d681SAndroid Build Coastguard Worker; CHECK: test1 12*9880d681SAndroid Build Coastguard Worker; CHECK: vaddss 13*9880d681SAndroid Build Coastguard Worker} 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker; (x + x) + x => x * 3.0 16*9880d681SAndroid Build Coastguard Workerdefine float @test2(float %x) { 17*9880d681SAndroid Build Coastguard Worker %t1 = fadd fast float %x, %x 18*9880d681SAndroid Build Coastguard Worker %t2 = fadd fast float %t1, %x 19*9880d681SAndroid Build Coastguard Worker ret float %t2 20*9880d681SAndroid Build Coastguard Worker; CHECK: .long 1077936128 21*9880d681SAndroid Build Coastguard Worker; CHECK: test2 22*9880d681SAndroid Build Coastguard Worker; CHECK: vmulss LCPI1_0(%rip), %xmm0, %xmm0 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; x + (x + x) => x * 3.0 26*9880d681SAndroid Build Coastguard Workerdefine float @test3(float %x) { 27*9880d681SAndroid Build Coastguard Worker %t1 = fadd fast float %x, %x 28*9880d681SAndroid Build Coastguard Worker %t2 = fadd fast float %t1, %x 29*9880d681SAndroid Build Coastguard Worker ret float %t2 30*9880d681SAndroid Build Coastguard Worker; CHECK: .long 1077936128 31*9880d681SAndroid Build Coastguard Worker; CHECK: test3 32*9880d681SAndroid Build Coastguard Worker; CHECK: vmulss LCPI2_0(%rip), %xmm0, %xmm0 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker; (y + x) + x != x * 3.0 36*9880d681SAndroid Build Coastguard Workerdefine float @test4(float %x, float %y) { 37*9880d681SAndroid Build Coastguard Worker %t1 = fadd fast float %x, %y 38*9880d681SAndroid Build Coastguard Worker %t2 = fadd fast float %t1, %x 39*9880d681SAndroid Build Coastguard Worker ret float %t2 40*9880d681SAndroid Build Coastguard Worker; CHECK: test4 41*9880d681SAndroid Build Coastguard Worker; CHECK: vaddss 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; rdar://13445387 45*9880d681SAndroid Build Coastguard Worker; "x + x + x => 3.0 * x" should be disabled after legalization because 46*9880d681SAndroid Build Coastguard Worker; Instruction-Selection doesn't know how to handle "3.0" 47*9880d681SAndroid Build Coastguard Worker; 48*9880d681SAndroid Build Coastguard Workerdefine float @test5() { 49*9880d681SAndroid Build Coastguard Worker %mul.i.i151 = fmul <4 x float> zeroinitializer, zeroinitializer 50*9880d681SAndroid Build Coastguard Worker %vecext.i8.i152 = extractelement <4 x float> %mul.i.i151, i32 1 51*9880d681SAndroid Build Coastguard Worker %vecext1.i9.i153 = extractelement <4 x float> %mul.i.i151, i32 0 52*9880d681SAndroid Build Coastguard Worker %add.i10.i154 = fadd float %vecext1.i9.i153, %vecext.i8.i152 53*9880d681SAndroid Build Coastguard Worker %vecext.i7.i155 = extractelement <4 x float> %mul.i.i151, i32 2 54*9880d681SAndroid Build Coastguard Worker %add.i.i156 = fadd float %vecext.i7.i155, %add.i10.i154 55*9880d681SAndroid Build Coastguard Worker ret float %add.i.i156 56*9880d681SAndroid Build Coastguard Worker} 57