David Majnemer 643bef9333 InstCombine: Fix another infinite loop caused by visitFPTrunc
We would attempt to replace an frem's operand with the same operand.
This would cause InstCombine to think real work was done, causing
InstCombine to enter an infinite loop.

This fixes the second part of PR21576.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222265 91177308-0d34-0410-b5e6-96231b3b80d8
2014-11-18 22:06:45 +00:00

76 lines
1.8 KiB
LLVM

; Test some floating point casting cases
; RUN: opt < %s -instcombine -S | FileCheck %s
define i8 @test1() {
%x = fptoui float 2.550000e+02 to i8 ; <i8> [#uses=1]
ret i8 %x
; CHECK: ret i8 -1
}
define i8 @test2() {
%x = fptosi float -1.000000e+00 to i8 ; <i8> [#uses=1]
ret i8 %x
; CHECK: ret i8 -1
}
; CHECK: test3
define half @test3(float %a) {
; CHECK: fptrunc
; CHECK: llvm.fabs.f16
%b = call float @llvm.fabs.f32(float %a)
%c = fptrunc float %b to half
ret half %c
}
; CHECK: test4
define half @test4(float %a) {
; CHECK: fptrunc
; CHECK: fsub
%b = fsub float -0.0, %a
%c = fptrunc float %b to half
ret half %c
}
; CHECK: test4-fast
define half @test4-fast(float %a) {
; CHECK: fptrunc
; CHECK: fsub fast
%b = fsub fast float -0.0, %a
%c = fptrunc float %b to half
ret half %c
}
; CHECK: test5
define half @test5(float %a, float %b, float %c) {
; CHECK: fcmp ogt
; CHECK: fptrunc
; CHECK: select
; CHECK: half 0xH3C00
%d = fcmp ogt float %a, %b
%e = select i1 %d, float %c, float 1.0
%f = fptrunc float %e to half
ret half %f
}
declare float @llvm.fabs.f32(float) nounwind readonly
define <1 x float> @test6(<1 x double> %V) {
%frem = frem <1 x double> %V, %V
%trunc = fptrunc <1 x double> %frem to <1 x float>
ret <1 x float> %trunc
; CHECK-LABEL: @test6
; CHECK-NEXT: %[[frem:.*]] = frem <1 x double> %V, %V
; CHECK-NEXT: %[[trunc:.*]] = fptrunc <1 x double> %[[frem]] to <1 x float>
; CHECK-NEXT: ret <1 x float> %trunc
}
define float @test7(double %V) {
%frem = frem double %V, 1.000000e+00
%trunc = fptrunc double %frem to float
ret float %trunc
; CHECK-LABEL: @test7
; CHECK-NEXT: %[[frem:.*]] = frem double %V, 1.000000e+00
; CHECK-NEXT: %[[trunc:.*]] = fptrunc double %frem to float
; CHECK-NEXT: ret float %trunc
}