llvm/test/Transforms/InstCombine/fast-math-scalarization.ll
Owen Anderson 2b8030cd97 Fix an issue where fast math flags were dropped during scalarization.
Most portions of InstCombine properly propagate fast math flags, but
apparently the vector scalarization section was overlooked.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@262376 91177308-0d34-0410-b5e6-96231b3b80d8
2016-03-01 19:35:52 +00:00

40 lines
1.4 KiB
LLVM

; RUN: opt -instcombine -S < %s | FileCheck %s
; CHECK-LABEL: test_scalarize_phi
; CHECK: fmul fast float
define void @test_scalarize_phi(i32 * %n, float * %inout) {
entry:
%0 = load volatile float, float * %inout, align 4
%splat.splatinsert = insertelement <4 x float> undef, float %0, i32 0
%splat.splat = shufflevector <4 x float> %splat.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer
%splat.splatinsert1 = insertelement <4 x float> undef, float 3.0, i32 0
br label %for.cond
for.cond:
%x.0 = phi <4 x float> [ %splat.splat, %entry ], [ %mul, %for.body ]
%i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
%1 = load i32, i32 * %n, align 4
%cmp = icmp ne i32 %i.0, %1
br i1 %cmp, label %for.body, label %for.end
for.body:
%2 = extractelement <4 x float> %x.0, i32 1
store volatile float %2, float * %inout, align 4
%mul = fmul fast <4 x float> %x.0, <float 0x4002A3D700000000, float 0x4002A3D700000000, float 0x4002A3D700000000, float 0x4002A3D700000000>
%inc = add nsw i32 %i.0, 1
br label %for.cond
for.end:
ret void
}
; CHECK-LABEL: test_extract_element_fastmath
; CHECK: fadd fast float
define float @test_extract_element_fastmath(<4 x float> %x) #0 {
entry:
%add = fadd fast <4 x float> %x, <float 0x4002A3D700000000, float 0x4002A3D700000000, float 0x4002A3D700000000, float 0x4002A3D700000000>
%0 = extractelement <4 x float> %add, i32 2
ret float %0
}