122b8edc4SSerguei Katkov; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 222b8edc4SSerguei Katkov; RUN: opt < %s -passes=instcombine -S | FileCheck %s 322b8edc4SSerguei Katkov 422b8edc4SSerguei Katkovdeclare float @llvm.minimum.f32(float %Val0, float %Val1) 522b8edc4SSerguei Katkovdeclare float @llvm.maximum.f32(float %Val0, float %Val1) 622b8edc4SSerguei Katkovdeclare <4 x float> @llvm.minimum.v4f32(<4 x float> %Val0, <4 x float> %Val1) 722b8edc4SSerguei Katkovdeclare <4 x float> @llvm.maximum.v4f32(<4 x float> %Val0, <4 x float> %Val1) 822b8edc4SSerguei Katkov 922b8edc4SSerguei Katkovdefine float @test(float %a, float %b) { 1022b8edc4SSerguei Katkov; CHECK-LABEL: @test( 1122b8edc4SSerguei Katkov; CHECK-NEXT: entry: 12*f38365aeSSerguei Katkov; CHECK-NEXT: [[RES:%.*]] = fmul float [[A:%.*]], [[B:%.*]] 1322b8edc4SSerguei Katkov; CHECK-NEXT: ret float [[RES]] 1422b8edc4SSerguei Katkov; 1522b8edc4SSerguei Katkoventry: 1622b8edc4SSerguei Katkov %min = call float @llvm.minimum.f32(float %a, float %b) 1722b8edc4SSerguei Katkov %max = call float @llvm.maximum.f32(float %a, float %b) 1822b8edc4SSerguei Katkov %res = fmul float %min, %max 1922b8edc4SSerguei Katkov ret float %res 2022b8edc4SSerguei Katkov} 2122b8edc4SSerguei Katkov 2222b8edc4SSerguei Katkovdefine float @test_comm1(float %a, float %b) { 2322b8edc4SSerguei Katkov; CHECK-LABEL: @test_comm1( 2422b8edc4SSerguei Katkov; CHECK-NEXT: entry: 25*f38365aeSSerguei Katkov; CHECK-NEXT: [[RES:%.*]] = fmul float [[A:%.*]], [[B:%.*]] 2622b8edc4SSerguei Katkov; CHECK-NEXT: ret float [[RES]] 2722b8edc4SSerguei Katkov; 2822b8edc4SSerguei Katkoventry: 2922b8edc4SSerguei Katkov %min = call float @llvm.minimum.f32(float %a, float %b) 3022b8edc4SSerguei Katkov %max = call float @llvm.maximum.f32(float %a, float %b) 3122b8edc4SSerguei Katkov %res = fmul float %max, %min 3222b8edc4SSerguei Katkov ret float %res 3322b8edc4SSerguei Katkov} 3422b8edc4SSerguei Katkov 3522b8edc4SSerguei Katkovdefine float @test_comm2(float %a, float %b) { 3622b8edc4SSerguei Katkov; CHECK-LABEL: @test_comm2( 3722b8edc4SSerguei Katkov; CHECK-NEXT: entry: 38*f38365aeSSerguei Katkov; CHECK-NEXT: [[RES:%.*]] = fmul float [[B:%.*]], [[A:%.*]] 3922b8edc4SSerguei Katkov; CHECK-NEXT: ret float [[RES]] 4022b8edc4SSerguei Katkov; 4122b8edc4SSerguei Katkoventry: 4222b8edc4SSerguei Katkov %min = call float @llvm.minimum.f32(float %a, float %b) 4322b8edc4SSerguei Katkov %max = call float @llvm.maximum.f32(float %b, float %a) 4422b8edc4SSerguei Katkov %res = fmul float %min, %max 4522b8edc4SSerguei Katkov ret float %res 4622b8edc4SSerguei Katkov} 4722b8edc4SSerguei Katkov 4822b8edc4SSerguei Katkov 4922b8edc4SSerguei Katkovdefine float @test_comm3(float %a, float %b) { 5022b8edc4SSerguei Katkov; CHECK-LABEL: @test_comm3( 5122b8edc4SSerguei Katkov; CHECK-NEXT: entry: 52*f38365aeSSerguei Katkov; CHECK-NEXT: [[RES:%.*]] = fmul float [[B:%.*]], [[A:%.*]] 5322b8edc4SSerguei Katkov; CHECK-NEXT: ret float [[RES]] 5422b8edc4SSerguei Katkov; 5522b8edc4SSerguei Katkoventry: 5622b8edc4SSerguei Katkov %min = call float @llvm.minimum.f32(float %a, float %b) 5722b8edc4SSerguei Katkov %max = call float @llvm.maximum.f32(float %b, float %a) 5822b8edc4SSerguei Katkov %res = fmul float %max, %min 5922b8edc4SSerguei Katkov ret float %res 6022b8edc4SSerguei Katkov} 6122b8edc4SSerguei Katkov 6222b8edc4SSerguei Katkovdefine <4 x float> @test_vect(<4 x float> %a, <4 x float> %b) { 6322b8edc4SSerguei Katkov; CHECK-LABEL: @test_vect( 6422b8edc4SSerguei Katkov; CHECK-NEXT: entry: 65*f38365aeSSerguei Katkov; CHECK-NEXT: [[RES:%.*]] = fmul <4 x float> [[B:%.*]], [[A:%.*]] 6622b8edc4SSerguei Katkov; CHECK-NEXT: ret <4 x float> [[RES]] 6722b8edc4SSerguei Katkov; 6822b8edc4SSerguei Katkoventry: 6922b8edc4SSerguei Katkov %min = call <4 x float> @llvm.minimum.v4f32(<4 x float> %a, <4 x float> %b) 7022b8edc4SSerguei Katkov %max = call <4 x float> @llvm.maximum.v4f32(<4 x float> %b, <4 x float> %a) 7122b8edc4SSerguei Katkov %res = fmul <4 x float> %min, %max 7222b8edc4SSerguei Katkov ret <4 x float> %res 7322b8edc4SSerguei Katkov} 7422b8edc4SSerguei Katkov 7522b8edc4SSerguei Katkovdefine float @test_flags(float %a, float %b) { 7622b8edc4SSerguei Katkov; CHECK-LABEL: @test_flags( 7722b8edc4SSerguei Katkov; CHECK-NEXT: entry: 78*f38365aeSSerguei Katkov; CHECK-NEXT: [[RES:%.*]] = fmul fast float [[A:%.*]], [[B:%.*]] 7922b8edc4SSerguei Katkov; CHECK-NEXT: ret float [[RES]] 8022b8edc4SSerguei Katkov; 8122b8edc4SSerguei Katkoventry: 8222b8edc4SSerguei Katkov %min = call float @llvm.minimum.f32(float %a, float %b) 8322b8edc4SSerguei Katkov %max = call float @llvm.maximum.f32(float %a, float %b) 8422b8edc4SSerguei Katkov %res = fmul fast float %min, %max 8522b8edc4SSerguei Katkov ret float %res 8622b8edc4SSerguei Katkov} 8722b8edc4SSerguei Katkov 8822b8edc4SSerguei Katkovdefine float @test_flags2(float %a, float %b) { 8922b8edc4SSerguei Katkov; CHECK-LABEL: @test_flags2( 9022b8edc4SSerguei Katkov; CHECK-NEXT: entry: 91*f38365aeSSerguei Katkov; CHECK-NEXT: [[RES:%.*]] = fmul reassoc nsz arcp contract afn float [[A:%.*]], [[B:%.*]] 9222b8edc4SSerguei Katkov; CHECK-NEXT: ret float [[RES]] 9322b8edc4SSerguei Katkov; 9422b8edc4SSerguei Katkoventry: 9522b8edc4SSerguei Katkov %min = call float @llvm.minimum.f32(float %a, float %b) 9622b8edc4SSerguei Katkov %max = call float @llvm.maximum.f32(float %a, float %b) 9722b8edc4SSerguei Katkov %res = fmul reassoc ninf nsz arcp contract afn float %min, %max 9822b8edc4SSerguei Katkov ret float %res 9922b8edc4SSerguei Katkov} 100