1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s 3 4define float @fdiv_constant_fold() { 5; CHECK-LABEL: @fdiv_constant_fold( 6; CHECK-NEXT: ret float 1.500000e+00 7; 8 %f = fdiv float 3.0, 2.0 9 ret float %f 10} 11 12define float @frem_constant_fold() { 13; CHECK-LABEL: @frem_constant_fold( 14; CHECK-NEXT: ret float 1.000000e+00 15; 16 %f = frem float 3.0, 2.0 17 ret float %f 18} 19 20define double @fmul_fdiv_common_operand(double %x, double %y) { 21; CHECK-LABEL: @fmul_fdiv_common_operand( 22; CHECK-NEXT: ret double [[X:%.*]] 23; 24 %m = fmul double %x, %y 25 %d = fdiv reassoc nnan double %m, %y 26 ret double %d 27} 28 29; Negative test - the fdiv must be reassociative and not allow NaNs. 30 31define double @fmul_fdiv_common_operand_too_strict(double %x, double %y) { 32; CHECK-LABEL: @fmul_fdiv_common_operand_too_strict( 33; CHECK-NEXT: [[M:%.*]] = fmul fast double [[X:%.*]], [[Y:%.*]] 34; CHECK-NEXT: [[D:%.*]] = fdiv reassoc double [[M]], [[Y]] 35; CHECK-NEXT: ret double [[D]] 36; 37 %m = fmul fast double %x, %y 38 %d = fdiv reassoc double %m, %y 39 ret double %d 40} 41 42; Commute the fmul operands. Use a vector type to verify that works too. 43 44define <2 x float> @fmul_fdiv_common_operand_commute_vec(<2 x float> %x, <2 x float> %y) { 45; CHECK-LABEL: @fmul_fdiv_common_operand_commute_vec( 46; CHECK-NEXT: ret <2 x float> [[X:%.*]] 47; 48 %m = fmul <2 x float> %y, %x 49 %d = fdiv fast <2 x float> %m, %y 50 ret <2 x float> %d 51} 52 53; The constant expression version of this used to crash llvm-as. 54define <2 x i1> @pr6096() { 55; CHECK-LABEL: @pr6096( 56; CHECK-NEXT: ret <2 x i1> zeroinitializer 57; 58 %fdiv = fdiv <2 x float> undef, <float 1.000000e+00, float 1.000000e+00> 59 %fcmp = fcmp ole <2 x float> %fdiv, zeroinitializer 60 ret <2 x i1> %fcmp 61} 62 63 64; https://alive2.llvm.org/ce/z/JxX5in 65define float @fdiv_nnan_ninf_by_zero_f32(float %x) { 66; CHECK-LABEL: @fdiv_nnan_ninf_by_zero_f32( 67; CHECK-NEXT: ret float poison 68; 69 %fdiv = fdiv nnan ninf float %x, 0.0 70 ret float %fdiv 71} 72 73define float @fdiv_nnan_ninf_by_negzero_f32(float %x) { 74; CHECK-LABEL: @fdiv_nnan_ninf_by_negzero_f32( 75; CHECK-NEXT: ret float poison 76; 77 %fdiv = fdiv nnan ninf float %x, -0.0 78 ret float %fdiv 79} 80 81define float @fdiv_nnan_ninf_by_undef_f32(float %x) { 82; CHECK-LABEL: @fdiv_nnan_ninf_by_undef_f32( 83; CHECK-NEXT: ret float poison 84; 85 %fdiv = fdiv nnan ninf float %x, undef 86 ret float %fdiv 87} 88 89define float @fdiv_nnan_ninf_by_poison_f32(float %x) { 90; CHECK-LABEL: @fdiv_nnan_ninf_by_poison_f32( 91; CHECK-NEXT: ret float poison 92; 93 %fdiv = fdiv nnan ninf float %x, poison 94 ret float %fdiv 95} 96 97define <2 x float> @fdiv_nnan_ninf_by_zero_v2f32(<2 x float> %x) { 98; CHECK-LABEL: @fdiv_nnan_ninf_by_zero_v2f32( 99; CHECK-NEXT: ret <2 x float> poison 100; 101 %fdiv = fdiv nnan ninf <2 x float> %x, zeroinitializer 102 ret <2 x float> %fdiv 103} 104 105define <2 x float> @fdiv_nnan_ninf_by_undef_v2f32(<2 x float> %x) { 106; CHECK-LABEL: @fdiv_nnan_ninf_by_undef_v2f32( 107; CHECK-NEXT: ret <2 x float> poison 108; 109 %fdiv = fdiv nnan ninf <2 x float> %x, undef 110 ret <2 x float> %fdiv 111} 112 113define <2 x float> @fdiv_nnan_ninf_by_zero_poison_v2f32(<2 x float> %x) { 114; CHECK-LABEL: @fdiv_nnan_ninf_by_zero_poison_v2f32( 115; CHECK-NEXT: ret <2 x float> poison 116; 117 %fdiv = fdiv nnan ninf <2 x float> %x, <float 0.0, float poison> 118 ret <2 x float> %fdiv 119} 120 121; https://alive2.llvm.org/ce/z/wRV28p 122define float @fdiv_nnan_nsz_ninf_by_zero_f32(float %x) { 123; CHECK-LABEL: @fdiv_nnan_nsz_ninf_by_zero_f32( 124; CHECK-NEXT: [[FDIV:%.*]] = fdiv nnan nsz float [[X:%.*]], 0.000000e+00 125; CHECK-NEXT: ret float [[FDIV]] 126; 127 %fdiv = fdiv nnan nsz float %x, 0.0 128 ret float %fdiv 129} 130 131define float @fdiv_nnan_nsz_ninf_by_negzero_f32(float %x) { 132; CHECK-LABEL: @fdiv_nnan_nsz_ninf_by_negzero_f32( 133; CHECK-NEXT: [[FDIV:%.*]] = fdiv nnan nsz float [[X:%.*]], -0.000000e+00 134; CHECK-NEXT: ret float [[FDIV]] 135; 136 %fdiv = fdiv nnan nsz float %x, -0.0 137 ret float %fdiv 138} 139 140define <2 x float> @fdiv_nnan_nsz_ninf_by_zero_v2f32(<2 x float> %x) { 141; CHECK-LABEL: @fdiv_nnan_nsz_ninf_by_zero_v2f32( 142; CHECK-NEXT: [[FDIV:%.*]] = fdiv nnan nsz <2 x float> [[X:%.*]], zeroinitializer 143; CHECK-NEXT: ret <2 x float> [[FDIV]] 144; 145 %fdiv = fdiv nnan nsz <2 x float> %x, zeroinitializer 146 ret <2 x float> %fdiv 147} 148 149define <2 x float> @fdiv_nnan_nsz_ninf_by_negzero_v2f32(<2 x float> %x) { 150; CHECK-LABEL: @fdiv_nnan_nsz_ninf_by_negzero_v2f32( 151; CHECK-NEXT: [[FDIV:%.*]] = fdiv nnan nsz <2 x float> [[X:%.*]], splat (float -0.000000e+00) 152; CHECK-NEXT: ret <2 x float> [[FDIV]] 153; 154 %fdiv = fdiv nnan nsz <2 x float> %x, <float -0.0, float -0.0> 155 ret <2 x float> %fdiv 156} 157