; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -passes=instcombine -S | FileCheck %s declare float @llvm.minimum.f32(float %Val0, float %Val1) declare float @llvm.maximum.f32(float %Val0, float %Val1) declare <4 x float> @llvm.minimum.v4f32(<4 x float> %Val0, <4 x float> %Val1) declare <4 x float> @llvm.maximum.v4f32(<4 x float> %Val0, <4 x float> %Val1) define float @test(float %a, float %b) { ; CHECK-LABEL: @test( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[RES:%.*]] = fadd float [[A:%.*]], [[B:%.*]] ; CHECK-NEXT: ret float [[RES]] ; entry: %min = call float @llvm.minimum.f32(float %a, float %b) %max = call float @llvm.maximum.f32(float %a, float %b) %res = fadd float %min, %max ret float %res } define float @test_comm1(float %a, float %b) { ; CHECK-LABEL: @test_comm1( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[RES:%.*]] = fadd float [[A:%.*]], [[B:%.*]] ; CHECK-NEXT: ret float [[RES]] ; entry: %min = call float @llvm.minimum.f32(float %a, float %b) %max = call float @llvm.maximum.f32(float %a, float %b) %res = fadd float %max, %min ret float %res } define float @test_comm2(float %a, float %b) { ; CHECK-LABEL: @test_comm2( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[RES:%.*]] = fadd float [[B:%.*]], [[A:%.*]] ; CHECK-NEXT: ret float [[RES]] ; entry: %min = call float @llvm.minimum.f32(float %a, float %b) %max = call float @llvm.maximum.f32(float %b, float %a) %res = fadd float %min, %max ret float %res } define float @test_comm3(float %a, float %b) { ; CHECK-LABEL: @test_comm3( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[RES:%.*]] = fadd float [[B:%.*]], [[A:%.*]] ; CHECK-NEXT: ret float [[RES]] ; entry: %min = call float @llvm.minimum.f32(float %a, float %b) %max = call float @llvm.maximum.f32(float %b, float %a) %res = fadd float %max, %min ret float %res } define <4 x float> @test_vect(<4 x float> %a, <4 x float> %b) { ; CHECK-LABEL: @test_vect( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[RES:%.*]] = fadd <4 x float> [[B:%.*]], [[A:%.*]] ; CHECK-NEXT: ret <4 x float> [[RES]] ; entry: %min = call <4 x float> @llvm.minimum.v4f32(<4 x float> %a, <4 x float> %b) %max = call <4 x float> @llvm.maximum.v4f32(<4 x float> %b, <4 x float> %a) %res = fadd <4 x float> %min, %max ret <4 x float> %res } define float @test_flags(float %a, float %b) { ; CHECK-LABEL: @test_flags( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[RES:%.*]] = fadd fast float [[A:%.*]], [[B:%.*]] ; CHECK-NEXT: ret float [[RES]] ; entry: %min = call float @llvm.minimum.f32(float %a, float %b) %max = call float @llvm.maximum.f32(float %a, float %b) %res = fadd fast float %min, %max ret float %res } define float @test_flags2(float %a, float %b) { ; CHECK-LABEL: @test_flags2( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[RES:%.*]] = fadd reassoc nsz arcp contract afn float [[A:%.*]], [[B:%.*]] ; CHECK-NEXT: ret float [[RES]] ; entry: %min = call float @llvm.minimum.f32(float %a, float %b) %max = call float @llvm.maximum.f32(float %a, float %b) %res = fadd reassoc ninf nsz arcp contract afn float %min, %max ret float %res }