| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| ; RUN: opt < %s -passes=instsimplify -S | FileCheck %s |
| |
| declare float @llvm.powi.f32.i16(float, i16) nounwind readonly |
| declare double @llvm.powi.f64.i32(double, i32) nounwind readonly |
| declare i32 @llvm.bswap.i32(i32) |
| |
| ; A |
| define i32 @test_bswap(i32 %a) nounwind { |
| ; CHECK-LABEL: @test_bswap( |
| ; CHECK-NEXT: ret i32 [[A:%.*]] |
| ; |
| %tmp2 = tail call i32 @llvm.bswap.i32( i32 %a ) |
| %tmp4 = tail call i32 @llvm.bswap.i32( i32 %tmp2 ) |
| ret i32 %tmp4 |
| } |
| |
| define void @powi(double %V, ptr%P) { |
| ; CHECK-LABEL: @powi( |
| ; CHECK-NEXT: store volatile double 1.000000e+00, ptr [[P:%.*]], align 8 |
| ; CHECK-NEXT: store volatile double [[V:%.*]], ptr [[P]], align 8 |
| ; CHECK-NEXT: ret void |
| ; |
| %B = tail call double @llvm.powi.f64.i32(double %V, i32 0) nounwind |
| store volatile double %B, ptr %P |
| |
| %C = tail call double @llvm.powi.f64.i32(double %V, i32 1) nounwind |
| store volatile double %C, ptr %P |
| |
| ret void |
| } |
| |
| define void @powi_i16(float %V, ptr%P) { |
| ; CHECK-LABEL: @powi_i16( |
| ; CHECK-NEXT: store volatile float 1.000000e+00, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile float [[D:%.*]], ptr [[P]], align 4 |
| ; CHECK-NEXT: ret void |
| ; |
| %B = tail call float @llvm.powi.f32.i16(float %V, i16 0) nounwind |
| store volatile float %B, ptr %P |
| |
| %C = tail call float @llvm.powi.f32.i16(float %V, i16 1) nounwind |
| store volatile float %C, ptr %P |
| |
| ret void |
| } |
| |
| define i32 @test_ctpop_poison(i32 %a) { |
| ; CHECK-LABEL: @test_ctpop_poison( |
| ; CHECK-NEXT: ret i32 poison |
| ; |
| %res = tail call i32 @llvm.ctpop.i32(i32 poison) |
| ret i32 %res |
| } |
| |
| define void @pow_poison(i16 %arg_int,float %arg_flt, ptr %P) { |
| ; CHECK-LABEL: @pow_poison( |
| ; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile float poison, ptr [[P]], align 4 |
| ; CHECK-NEXT: store volatile float poison, ptr [[P]], align 4 |
| ; CHECK-NEXT: store volatile float poison, ptr [[P]], align 4 |
| ; CHECK-NEXT: store volatile float poison, ptr [[P]], align 4 |
| ; CHECK-NEXT: store volatile float poison, ptr [[P]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: ret void |
| ; |
| %2 = tail call float @llvm.powi(float poison, i16 %arg_int) nounwind |
| store volatile float %2, ptr %P |
| |
| %3 = tail call float @llvm.pow(float poison, float %arg_flt) nounwind |
| store volatile float %3, ptr %P |
| |
| %4 = tail call float @llvm.powi(float %arg_flt, i16 poison) nounwind |
| store volatile float %4, ptr %P |
| |
| %5 = tail call float @llvm.pow(float %arg_flt, float poison) nounwind |
| store volatile float %5, ptr %P |
| |
| %6 = tail call float @llvm.powi(float poison, i16 poison) nounwind |
| store volatile float %6, ptr %P |
| |
| %7 = tail call float @llvm.pow(float poison, float poison) nounwind |
| store volatile float %7, ptr %P |
| |
| %8 = tail call <2 x float> @llvm.pow(<2 x float> poison, <2 x float> poison) nounwind |
| store volatile <2 x float> %8, ptr %P |
| |
| ret void |
| } |
| |
| define void @sin_poison(ptr %P) { |
| ; CHECK-LABEL: @sin_poison( |
| ; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: store volatile float poison, ptr [[P]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: ret void |
| ; |
| %sin_f32 = call float @llvm.sin(float poison) |
| store volatile float %sin_f32, ptr %P |
| |
| %sin_2xf32 = call <2 x float> @llvm.sin(<2 x float> poison) |
| store volatile <2 x float> %sin_2xf32, ptr %P |
| |
| %sin_4xf64 = call <4 x double> @llvm.sin(<4 x double> poison) |
| store volatile <4 x double> %sin_4xf64, ptr %P |
| |
| %asin_f32 = call float @llvm.asin(float poison) |
| store volatile float %asin_f32, ptr %P |
| |
| %asin_2xf32 = call <2 x float> @llvm.asin(<2 x float> poison) |
| store volatile <2 x float> %asin_2xf32, ptr %P |
| |
| %asin_4xf64 = call <4 x double> @llvm.asin(<4 x double> poison) |
| store volatile <4 x double> %asin_4xf64, ptr %P |
| |
| ret void |
| } |
| |
| |
| define void @cos_poison(ptr %P) { |
| ; CHECK-LABEL: @cos_poison( |
| ; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: store volatile float poison, ptr [[P]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: ret void |
| ; |
| %cos_f32 = call float @llvm.cos(float poison) |
| store volatile float %cos_f32, ptr %P |
| |
| %cos_2xf32 = call <2 x float> @llvm.cos(<2 x float> poison) |
| store volatile <2 x float> %cos_2xf32, ptr %P |
| |
| %cos_4xf64 = call <4 x double> @llvm.cos(<4 x double> poison) |
| store volatile <4 x double> %cos_4xf64, ptr %P |
| |
| %acos_f32 = call float @llvm.acos(float poison) |
| store volatile float %acos_f32, ptr %P |
| |
| %acos_2xf32 = call <2 x float> @llvm.acos(<2 x float> poison) |
| store volatile <2 x float> %acos_2xf32, ptr %P |
| |
| %acos_4xf64 = call <4 x double> @llvm.acos(<4 x double> poison) |
| store volatile <4 x double> %acos_4xf64, ptr %P |
| |
| ret void |
| } |
| |
| |
| define void @tan_poison(ptr %P) { |
| ; CHECK-LABEL: @tan_poison( |
| ; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: store volatile float poison, ptr [[P]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: store volatile float poison, ptr [[P]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: ret void |
| ; |
| %tan_f32 = call float @llvm.tan(float poison) |
| store volatile float %tan_f32, ptr %P |
| |
| %tan_2xf32 = call <2 x float> @llvm.tan(<2 x float> poison) |
| store volatile <2 x float> %tan_2xf32, ptr %P |
| |
| %tan_4xf64 = call <4 x double> @llvm.tan(<4 x double> poison) |
| store volatile <4 x double> %tan_4xf64, ptr %P |
| |
| %atan_f32 = call float @llvm.atan(float poison) |
| store volatile float %atan_f32, ptr %P |
| |
| %atan_2xf32 = call <2 x float> @llvm.atan(<2 x float> poison) |
| store volatile <2 x float> %atan_2xf32, ptr %P |
| |
| %atan_4xf64 = call <4 x double> @llvm.atan(<4 x double> poison) |
| store volatile <4 x double> %atan_4xf64, ptr %P |
| |
| %atan2_f32 = call float @llvm.atan2(float poison, float poison) |
| store volatile float %atan2_f32, ptr %P |
| |
| %atan2_2xf32 = call <2 x float> @llvm.atan2(<2 x float> poison, <2 x float> poison) |
| store volatile <2 x float> %atan2_2xf32, ptr %P |
| |
| %atan2_4xf64 = call <4 x double> @llvm.atan2(<4 x double> poison, <4 x double> poison) |
| store volatile <4 x double> %atan2_4xf64, ptr %P |
| |
| ret void |
| } |
| |
| |
| define void @sincos_poison(ptr %P) { |
| ; CHECK-LABEL: @sincos_poison( |
| ; CHECK-NEXT: store volatile { float, float } poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile { <2 x float>, <2 x float> } poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile { <4 x double>, <4 x double> } poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: store volatile { float, float } poison, ptr [[P]], align 4 |
| ; CHECK-NEXT: store volatile { <2 x float>, <2 x float> } poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile { <4 x double>, <4 x double> } poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: ret void |
| ; |
| %sincos_f32 = call { float, float } @llvm.sincos(float poison) |
| store volatile { float, float } %sincos_f32, ptr %P |
| |
| %sincos_2xf32 = call { <2 x float>, <2 x float> } @llvm.sincos(<2 x float> poison) |
| store volatile { <2 x float>, <2 x float> } %sincos_2xf32, ptr %P |
| |
| %sincos_4xf64 = call { <4 x double>, <4 x double> } @llvm.sincos(<4 x double> poison) |
| store volatile { <4 x double>, <4 x double> } %sincos_4xf64, ptr %P |
| |
| %sincospi_f32 = call { float, float } @llvm.sincospi(float poison) |
| store volatile { float, float } %sincospi_f32, ptr %P |
| |
| %sincospi_2xf32 = call { <2 x float>, <2 x float> } @llvm.sincospi(<2 x float> poison) |
| store volatile { <2 x float>, <2 x float> } %sincospi_2xf32, ptr %P |
| |
| %sincospi_4xf64 = call { <4 x double>, <4 x double> } @llvm.sincospi(<4 x double> poison) |
| store volatile { <4 x double>, <4 x double> } %sincospi_4xf64, ptr %P |
| |
| ret void |
| } |
| |
| |
| define void @sinh_poison(ptr %P) { |
| ; CHECK-LABEL: @sinh_poison( |
| ; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: ret void |
| ; |
| %sinh_f32 = call float @llvm.sinh(float poison) |
| store volatile float %sinh_f32, ptr %P |
| |
| %sinh_2xf32 = call <2 x float> @llvm.sinh(<2 x float> poison) |
| store volatile <2 x float> %sinh_2xf32, ptr %P |
| |
| %sinh_4xf64 = call <4 x double> @llvm.sinh(<4 x double> poison) |
| store volatile <4 x double> %sinh_4xf64, ptr %P |
| |
| ret void |
| } |
| |
| |
| define void @cosh_poison(ptr %P) { |
| ; CHECK-LABEL: @cosh_poison( |
| ; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: ret void |
| ; |
| %cosh_f32 = call float @llvm.cosh(float poison) |
| store volatile float %cosh_f32, ptr %P |
| |
| %cosh_2xf32 = call <2 x float> @llvm.cosh(<2 x float> poison) |
| store volatile <2 x float> %cosh_2xf32, ptr %P |
| |
| %cosh_4xf64 = call <4 x double> @llvm.cosh(<4 x double> poison) |
| store volatile <4 x double> %cosh_4xf64, ptr %P |
| |
| ret void |
| } |
| |
| |
| define void @tanh_poison(ptr %P) { |
| ; CHECK-LABEL: @tanh_poison( |
| ; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: ret void |
| ; |
| %tanh_f32 = call float @llvm.tanh(float poison) |
| store volatile float %tanh_f32, ptr %P |
| |
| %tanh_2xf32 = call <2 x float> @llvm.tanh(<2 x float> poison) |
| store volatile <2 x float> %tanh_2xf32, ptr %P |
| |
| %tanh_4xf64 = call <4 x double> @llvm.tanh(<4 x double> poison) |
| store volatile <4 x double> %tanh_4xf64, ptr %P |
| |
| ret void |
| } |
| |
| |
| define void @exp_poison(ptr %P) { |
| ; CHECK-LABEL: @exp_poison( |
| ; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: store volatile float poison, ptr [[P]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: store volatile float poison, ptr [[P]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: ret void |
| ; |
| %exp_f32 = call float @llvm.exp(float poison) |
| store volatile float %exp_f32, ptr %P |
| |
| %exp_2xf32 = call <2 x float> @llvm.exp(<2 x float> poison) |
| store volatile <2 x float> %exp_2xf32, ptr %P |
| |
| %exp_4xf64 = call <4 x double> @llvm.exp(<4 x double> poison) |
| store volatile <4 x double> %exp_4xf64, ptr %P |
| |
| %exp2_f32 = call float @llvm.exp2(float poison) |
| store volatile float %exp2_f32, ptr %P |
| |
| %exp2_2xf32 = call <2 x float> @llvm.exp2(<2 x float> poison) |
| store volatile <2 x float> %exp2_2xf32, ptr %P |
| |
| %exp2_4xf64 = call <4 x double> @llvm.exp2(<4 x double> poison) |
| store volatile <4 x double> %exp2_4xf64, ptr %P |
| |
| %exp10_f32 = call float @llvm.exp10(float poison) |
| store volatile float %exp10_f32, ptr %P |
| |
| %exp10_2xf32 = call <2 x float> @llvm.exp10(<2 x float> poison) |
| store volatile <2 x float> %exp10_2xf32, ptr %P |
| |
| %exp10_4xf64 = call <4 x double> @llvm.exp10(<4 x double> poison) |
| store volatile <4 x double> %exp10_4xf64, ptr %P |
| ret void |
| } |
| |
| |
| define void @log_poison(ptr %P) { |
| ; CHECK-LABEL: @log_poison( |
| ; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: store volatile float poison, ptr [[P]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: store volatile float poison, ptr [[P]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: ret void |
| ; |
| %log_f32 = call float @llvm.log(float poison) |
| store volatile float %log_f32, ptr %P |
| |
| %log_2xf32 = call <2 x float> @llvm.log(<2 x float> poison) |
| store volatile <2 x float> %log_2xf32, ptr %P |
| |
| %log_4xf64 = call <4 x double> @llvm.log(<4 x double> poison) |
| store volatile <4 x double> %log_4xf64, ptr %P |
| |
| %log2_f32 = call float @llvm.log2(float poison) |
| store volatile float %log2_f32, ptr %P |
| |
| %log2_2xf32 = call <2 x float> @llvm.log2(<2 x float> poison) |
| store volatile <2 x float> %log2_2xf32, ptr %P |
| |
| %log2_4xf64 = call <4 x double> @llvm.log2(<4 x double> poison) |
| store volatile <4 x double> %log2_4xf64, ptr %P |
| |
| %log10_f32 = call float @llvm.log10(float poison) |
| store volatile float %log10_f32, ptr %P |
| |
| %log10_2xf32 = call <2 x float> @llvm.log10(<2 x float> poison) |
| store volatile <2 x float> %log10_2xf32, ptr %P |
| |
| %log10_4xf64 = call <4 x double> @llvm.log10(<4 x double> poison) |
| store volatile <4 x double> %log10_4xf64, ptr %P |
| ret void |
| } |
| |
| |
| define void @modf_poison(ptr %P) { |
| ; CHECK-LABEL: @modf_poison( |
| ; CHECK-NEXT: store volatile { float, float } poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile { <2 x float>, <2 x float> } poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile { <4 x double>, <4 x double> } poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: ret void |
| ; |
| %modf_f32 = call { float, float } @llvm.modf(float poison) |
| store volatile { float, float } %modf_f32, ptr %P |
| |
| %modf_2xf32 = call { <2 x float>, <2 x float> } @llvm.modf(<2 x float> poison) |
| store volatile { <2 x float>, <2 x float> } %modf_2xf32, ptr %P |
| |
| %modf_4xf64 = call { <4 x double>, <4 x double> } @llvm.modf(<4 x double> poison) |
| store volatile { <4 x double>, <4 x double> } %modf_4xf64, ptr %P |
| |
| ret void |
| } |
| |
| |
| define void @floor_poison(ptr %P) { |
| ; CHECK-LABEL: @floor_poison( |
| ; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: ret void |
| ; |
| %floor_f32 = call float @llvm.floor(float poison) |
| store volatile float %floor_f32, ptr %P |
| |
| %floor_2xf32 = call <2 x float> @llvm.floor(<2 x float> poison) |
| store volatile <2 x float> %floor_2xf32, ptr %P |
| |
| %floor_4xf64 = call <4 x double> @llvm.floor(<4 x double> poison) |
| store volatile <4 x double> %floor_4xf64, ptr %P |
| |
| ret void |
| } |
| |
| |
| define void @ceil_poison(ptr %P) { |
| ; CHECK-LABEL: @ceil_poison( |
| ; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: ret void |
| ; |
| %ceil_f32 = call float @llvm.ceil(float poison) |
| store volatile float %ceil_f32, ptr %P |
| |
| %ceil_2xf32 = call <2 x float> @llvm.ceil(<2 x float> poison) |
| store volatile <2 x float> %ceil_2xf32, ptr %P |
| |
| %ceil_4xf64 = call <4 x double> @llvm.ceil(<4 x double> poison) |
| store volatile <4 x double> %ceil_4xf64, ptr %P |
| |
| ret void |
| } |
| |
| |
| define void @trunc_poison(ptr %P) { |
| ; CHECK-LABEL: @trunc_poison( |
| ; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: ret void |
| ; |
| %trunc_f32 = call float @llvm.trunc(float poison) |
| store volatile float %trunc_f32, ptr %P |
| |
| %trunc_2xf32 = call <2 x float> @llvm.trunc(<2 x float> poison) |
| store volatile <2 x float> %trunc_2xf32, ptr %P |
| |
| %trunc_4xf64 = call <4 x double> @llvm.trunc(<4 x double> poison) |
| store volatile <4 x double> %trunc_4xf64, ptr %P |
| |
| ret void |
| } |
| |
| define void @rint_poison(ptr %P) { |
| ; CHECK-LABEL: @rint_poison( |
| ; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: ret void |
| ; |
| %rint_f32 = call float @llvm.rint(float poison) |
| store volatile float %rint_f32, ptr %P |
| |
| %rint_2xf32 = call <2 x float> @llvm.rint(<2 x float> poison) |
| store volatile <2 x float> %rint_2xf32, ptr %P |
| |
| %rint_4xf64 = call <4 x double> @llvm.rint(<4 x double> poison) |
| store volatile <4 x double> %rint_4xf64, ptr %P |
| |
| ret void |
| } |
| |
| define void @nearbyint_poison(ptr %P) { |
| ; CHECK-LABEL: @nearbyint_poison( |
| ; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: ret void |
| ; |
| %nearbyint_f32 = call float @llvm.nearbyint(float poison) |
| store volatile float %nearbyint_f32, ptr %P |
| |
| %nearbyint_2xf32 = call <2 x float> @llvm.nearbyint(<2 x float> poison) |
| store volatile <2 x float> %nearbyint_2xf32, ptr %P |
| |
| %nearbyint_4xf64 = call <4 x double> @llvm.nearbyint(<4 x double> poison) |
| store volatile <4 x double> %nearbyint_4xf64, ptr %P |
| |
| ret void |
| } |
| |
| |
| define void @round_poison(ptr %P) { |
| ; CHECK-LABEL: @round_poison( |
| ; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: ret void |
| ; |
| %round_f32 = call float @llvm.round(float poison) |
| store volatile float %round_f32, ptr %P |
| |
| %round_2xf32 = call <2 x float> @llvm.round(<2 x float> poison) |
| store volatile <2 x float> %round_2xf32, ptr %P |
| |
| %round_4xf64 = call <4 x double> @llvm.round(<4 x double> poison) |
| store volatile <4 x double> %round_4xf64, ptr %P |
| |
| ret void |
| } |
| |
| |
| define void @roundeven_poison(ptr %P) { |
| ; CHECK-LABEL: @roundeven_poison( |
| ; CHECK-NEXT: store volatile float poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile <2 x float> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x double> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: ret void |
| ; |
| %roundeven_f32 = call float @llvm.roundeven(float poison) |
| store volatile float %roundeven_f32, ptr %P |
| |
| %roundeven_2xf32 = call <2 x float> @llvm.roundeven(<2 x float> poison) |
| store volatile <2 x float> %roundeven_2xf32, ptr %P |
| |
| %roundeven_4xf64 = call <4 x double> @llvm.roundeven(<4 x double> poison) |
| store volatile <4 x double> %roundeven_4xf64, ptr %P |
| |
| ret void |
| } |
| |
| |
| define void @lrint_poison(ptr %P) { |
| ; CHECK-LABEL: @lrint_poison( |
| ; CHECK-NEXT: store volatile i32 poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile <2 x i32> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x i64> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: ret void |
| ; |
| %lrint_f32 = call i32 @llvm.lrint(float poison) |
| store volatile i32 %lrint_f32, ptr %P |
| |
| %lrint_2xf32 = call <2 x i32> @llvm.lrint(<2 x float> poison) |
| store volatile <2 x i32> %lrint_2xf32, ptr %P |
| |
| %lrint_4xf64 = call <4 x i64> @llvm.lrint(<4 x double> poison) |
| store volatile <4 x i64> %lrint_4xf64, ptr %P |
| |
| ret void |
| } |
| |
| |
| define void @llrint_poison(ptr %P) { |
| ; CHECK-LABEL: @llrint_poison( |
| ; CHECK-NEXT: store volatile i32 poison, ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: store volatile <2 x i32> poison, ptr [[P]], align 8 |
| ; CHECK-NEXT: store volatile <4 x i64> poison, ptr [[P]], align 32 |
| ; CHECK-NEXT: ret void |
| ; |
| %llrint_f32 = call i32 @llvm.llrint(float poison) |
| store volatile i32 %llrint_f32, ptr %P |
| |
| %llrint_2xf32 = call <2 x i32> @llvm.llrint(<2 x float> poison) |
| store volatile <2 x i32> %llrint_2xf32, ptr %P |
| |
| %llrint_4xf64 = call <4 x i64> @llvm.llrint(<4 x double> poison) |
| store volatile <4 x i64> %llrint_4xf64, ptr %P |
| |
| ret void |
| } |
| |
| |
| define void @umul_fix_poison(ptr %P) { |
| ; CHECK-LABEL: @umul_fix_poison( |
| ; CHECK-NEXT: store volatile i16 poison, ptr [[P:%.*]], align 2 |
| ; CHECK-NEXT: store volatile i32 poison, ptr [[P]], align 4 |
| ; CHECK-NEXT: store volatile <4 x i32> poison, ptr [[P]], align 16 |
| ; CHECK-NEXT: ret void |
| ; |
| %umul_fix_i16 = call i16 @llvm.umul.fix(i16 poison, i16 poison, i32 2) |
| store volatile i16 %umul_fix_i16, ptr %P |
| |
| %umul_fix_i32 = call i32 @llvm.umul.fix(i32 poison, i32 poison, i32 2) |
| store volatile i32 %umul_fix_i32, ptr %P |
| |
| %umul_fix_4xi32 = call <4 x i32> @llvm.umul.fix(<4 x i32> poison, <4 x i32> poison, i32 2) |
| store volatile <4 x i32> %umul_fix_4xi32, ptr %P |
| |
| ret void |
| } |
| |
| |
| define void @umul_fix_sat_poison(ptr %P) { |
| ; CHECK-LABEL: @umul_fix_sat_poison( |
| ; CHECK-NEXT: store volatile i16 poison, ptr [[P:%.*]], align 2 |
| ; CHECK-NEXT: store volatile i32 poison, ptr [[P]], align 4 |
| ; CHECK-NEXT: store volatile <4 x i32> poison, ptr [[P]], align 16 |
| ; CHECK-NEXT: ret void |
| ; |
| %umul_fix_sati16 = call i16 @llvm.umul.fix.sat(i16 poison, i16 poison, i32 2) |
| store volatile i16 %umul_fix_sati16, ptr %P |
| |
| %umul_fix_sati32 = call i32 @llvm.umul.fix.sat(i32 poison, i32 poison, i32 2) |
| store volatile i32 %umul_fix_sati32, ptr %P |
| |
| %umul_fix_sat4xi32 = call <4 x i32> @llvm.umul.fix.sat(<4 x i32> poison, <4 x i32> poison, i32 2) |
| store volatile <4 x i32> %umul_fix_sat4xi32, ptr %P |
| |
| ret void |
| } |