; RUN: opt -instsimplify -S < %s | FileCheck %s ; Fixes PR20832 ; Make sure that we correctly fold a fused multiply-add where operands ; are all finite constants and addend is zero. declare double @llvm.fma.f64(double, double, double) define double @PR20832() { %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0.0) ret double %1 } ; CHECK-LABEL: @PR20832( ; CHECK: ret double 5.600000e+01 ; Test builtin fma with all finite non-zero constants. define double @test_all_finite() { %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 5.0) ret double %1 } ; CHECK-LABEL: @test_all_finite( ; CHECK: ret double 6.100000e+01 ; Test builtin fma with a +/-NaN addend. define double @test_NaN_addend() { %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0x7FF8000000000000) ret double %1 } ; CHECK-LABEL: @test_NaN_addend( ; CHECK: ret double 0x7FF8000000000000 define double @test_NaN_addend_2() { %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0xFFF8000000000000) ret double %1 } ; CHECK-LABEL: @test_NaN_addend_2( ; CHECK: ret double 0xFFF8000000000000 ; Test builtin fma with a +/-Inf addend. define double @test_Inf_addend() { %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0x7FF0000000000000) ret double %1 } ; CHECK-LABEL: @test_Inf_addend( ; CHECK: ret double 0x7FF0000000000000 define double @test_Inf_addend_2() { %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0xFFF0000000000000) ret double %1 } ; CHECK-LABEL: @test_Inf_addend_2( ; CHECK: ret double 0xFFF0000000000000 ; Test builtin fma with one of the operands to the multiply being +/-NaN. define double @test_NaN_1() { %1 = call double @llvm.fma.f64(double 0x7FF8000000000000, double 8.0, double 0.0) ret double %1 } ; CHECK-LABEL: @test_NaN_1( ; CHECK: ret double 0x7FF8000000000000 define double @test_NaN_2() { %1 = call double @llvm.fma.f64(double 7.0, double 0x7FF8000000000000, double 0.0) ret double %1 } ; CHECK-LABEL: @test_NaN_2( ; CHECK: ret double 0x7FF8000000000000 define double @test_NaN_3() { %1 = call double @llvm.fma.f64(double 0xFFF8000000000000, double 8.0, double 0.0) ret double %1 } ; CHECK-LABEL: @test_NaN_3( ; CHECK: ret double 0x7FF8000000000000 define double @test_NaN_4() { %1 = call double @llvm.fma.f64(double 7.0, double 0xFFF8000000000000, double 0.0) ret double %1 } ; CHECK-LABEL: @test_NaN_4( ; CHECK: ret double 0x7FF8000000000000 ; Test builtin fma with one of the operands to the multiply being +/-Inf. define double @test_Inf_1() { %1 = call double @llvm.fma.f64(double 0x7FF0000000000000, double 8.0, double 0.0) ret double %1 } ; CHECK-LABEL: @test_Inf_1( ; CHECK: ret double 0x7FF0000000000000 define double @test_Inf_2() { %1 = call double @llvm.fma.f64(double 7.0, double 0x7FF0000000000000, double 0.0) ret double %1 } ; CHECK-LABEL: @test_Inf_2( ; CHECK: ret double 0x7FF0000000000000 define double @test_Inf_3() { %1 = call double @llvm.fma.f64(double 0xFFF0000000000000, double 8.0, double 0.0) ret double %1 } ; CHECK-LABEL: @test_Inf_3( ; CHECK: ret double 0xFFF0000000000000 define double @test_Inf_4() { %1 = call double @llvm.fma.f64(double 7.0, double 0xFFF0000000000000, double 0.0) ret double %1 } ; CHECK-LABEL: @test_Inf_4( ; CHECK: ret double 0xFFF0000000000000