1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -instsimplify -S | FileCheck %s 3 4; fsub -0.0, (fsub -0.0, X) ==> X 5define float @fsub_-0_-0_x(float %a) { 6; CHECK-LABEL: @fsub_-0_-0_x( 7; CHECK-NEXT: ret float %a 8; 9 %t1 = fsub float -0.0, %a 10 %ret = fsub float -0.0, %t1 11 ret float %ret 12} 13 14; fsub 0.0, (fsub -0.0, X) != X 15define float @fsub_0_-0_x(float %a) { 16; CHECK-LABEL: @fsub_0_-0_x( 17; CHECK-NEXT: [[T1:%.*]] = fsub float 0.000000e+00, %a 18; CHECK-NEXT: [[RET:%.*]] = fsub float -0.000000e+00, [[T1]] 19; CHECK-NEXT: ret float [[RET]] 20; 21 %t1 = fsub float 0.0, %a 22 %ret = fsub float -0.0, %t1 23 ret float %ret 24} 25 26; fsub -0.0, (fsub 0.0, X) != X 27define float @fsub_-0_0_x(float %a) { 28; CHECK-LABEL: @fsub_-0_0_x( 29; CHECK-NEXT: [[T1:%.*]] = fsub float -0.000000e+00, %a 30; CHECK-NEXT: [[RET:%.*]] = fsub float 0.000000e+00, [[T1]] 31; CHECK-NEXT: ret float [[RET]] 32; 33 %t1 = fsub float -0.0, %a 34 %ret = fsub float 0.0, %t1 35 ret float %ret 36} 37 38; fsub X, 0 ==> X 39define float @fsub_x_0(float %a) { 40; CHECK-LABEL: @fsub_x_0( 41; CHECK-NEXT: ret float %a 42; 43 %ret = fsub float %a, 0.0 44 ret float %ret 45} 46 47; fadd X, -0 ==> X 48define float @fadd_x_n0(float %a) { 49; CHECK-LABEL: @fadd_x_n0( 50; CHECK-NEXT: ret float %a 51; 52 %ret = fadd float %a, -0.0 53 ret float %ret 54} 55 56; fmul X, 1.0 ==> X 57define double @fmul_X_1(double %a) { 58; CHECK-LABEL: @fmul_X_1( 59; CHECK-NEXT: ret double %a 60; 61 %b = fmul double 1.000000e+00, %a 62 ret double %b 63} 64 65; fdiv X, 1.0 ==> X 66define float @fdiv_x_1(float %a) { 67; CHECK-LABEL: @fdiv_x_1( 68; CHECK-NEXT: ret float %a 69; 70 %ret = fdiv float %a, 1.0 71 ret float %ret 72} 73 74; We can't optimize away the fadd in this test because the input 75; value to the function and subsequently to the fadd may be -0.0. 76; In that one special case, the result of the fadd should be +0.0 77; rather than the first parameter of the fadd. 78 79; Fragile test warning: We need 6 sqrt calls to trigger the bug 80; because the internal logic has a magic recursion limit of 6. 81; This is presented without any explanation or ability to customize. 82 83declare float @sqrtf(float) 84 85define float @PR22688(float %x) { 86; CHECK-LABEL: @PR22688( 87; CHECK-NEXT: [[TMP1:%.*]] = call float @sqrtf(float %x) 88; CHECK-NEXT: [[TMP2:%.*]] = call float @sqrtf(float [[TMP1]]) 89; CHECK-NEXT: [[TMP3:%.*]] = call float @sqrtf(float [[TMP2]]) 90; CHECK-NEXT: [[TMP4:%.*]] = call float @sqrtf(float [[TMP3]]) 91; CHECK-NEXT: [[TMP5:%.*]] = call float @sqrtf(float [[TMP4]]) 92; CHECK-NEXT: [[TMP6:%.*]] = call float @sqrtf(float [[TMP5]]) 93; CHECK-NEXT: [[TMP7:%.*]] = fadd float [[TMP6]], 0.000000e+00 94; CHECK-NEXT: ret float [[TMP7]] 95; 96 %1 = call float @sqrtf(float %x) 97 %2 = call float @sqrtf(float %1) 98 %3 = call float @sqrtf(float %2) 99 %4 = call float @sqrtf(float %3) 100 %5 = call float @sqrtf(float %4) 101 %6 = call float @sqrtf(float %5) 102 %7 = fadd float %6, 0.0 103 ret float %7 104} 105 106declare float @llvm.fabs.f32(float) 107 108; CHECK-LABEL: @fabs_select_positive_constants( 109; CHECK: %select = select i1 %cmp, float 1.000000e+00, float 2.000000e+00 110; CHECK-NEXT: ret float %select 111define float @fabs_select_positive_constants(i32 %c) { 112 %cmp = icmp eq i32 %c, 0 113 %select = select i1 %cmp, float 1.0, float 2.0 114 %fabs = call float @llvm.fabs.f32(float %select) 115 ret float %fabs 116} 117 118; CHECK-LABEL: @fabs_select_constant_variable( 119; CHECK: %select = select i1 %cmp, float 1.000000e+00, float %x 120; CHECK-NEXT: %fabs = call float @llvm.fabs.f32(float %select) 121define float @fabs_select_constant_variable(i32 %c, float %x) { 122 %cmp = icmp eq i32 %c, 0 123 %select = select i1 %cmp, float 1.0, float %x 124 %fabs = call float @llvm.fabs.f32(float %select) 125 ret float %fabs 126} 127 128; CHECK-LABEL: @fabs_select_neg0_pos0( 129; CHECK: %select = select i1 %cmp, float -0.000000e+00, float 0.000000e+00 130; CHECK: %fabs = call float @llvm.fabs.f32(float %select) 131; CHECK-NEXT: ret float %fabs 132define float @fabs_select_neg0_pos0(float addrspace(1)* %out, i32 %c) { 133 %cmp = icmp eq i32 %c, 0 134 %select = select i1 %cmp, float -0.0, float 0.0 135 %fabs = call float @llvm.fabs.f32(float %select) 136 ret float %fabs 137} 138 139; CHECK-LABEL: @fabs_select_neg0_neg1( 140; CHECK: %select = select i1 %cmp, float -0.000000e+00, float -1.000000e+00 141; CHECK: %fabs = call float @llvm.fabs.f32(float %select) 142define float @fabs_select_neg0_neg1(float addrspace(1)* %out, i32 %c) { 143 %cmp = icmp eq i32 %c, 0 144 %select = select i1 %cmp, float -0.0, float -1.0 145 %fabs = call float @llvm.fabs.f32(float %select) 146 ret float %fabs 147} 148 149; CHECK-LABEL: @fabs_select_nan_nan( 150; CHECK: %select = select i1 %cmp, float 0x7FF8000000000000, float 0x7FF8000100000000 151; CHECK-NEXT: ret float %select 152define float @fabs_select_nan_nan(float addrspace(1)* %out, i32 %c) { 153 %cmp = icmp eq i32 %c, 0 154 %select = select i1 %cmp, float 0x7FF8000000000000, float 0x7FF8000100000000 155 %fabs = call float @llvm.fabs.f32(float %select) 156 ret float %fabs 157} 158 159; CHECK-LABEL: @fabs_select_negnan_nan( 160; CHECK: %select = select i1 %cmp, float 0xFFF8000000000000, float 0x7FF8000000000000 161; CHECK: %fabs = call float @llvm.fabs.f32(float %select) 162define float @fabs_select_negnan_nan(float addrspace(1)* %out, i32 %c) { 163 %cmp = icmp eq i32 %c, 0 164 %select = select i1 %cmp, float 0xFFF8000000000000, float 0x7FF8000000000000 165 %fabs = call float @llvm.fabs.f32(float %select) 166 ret float %fabs 167} 168 169; CHECK-LABEL: @fabs_select_negnan_negnan( 170; CHECK: %select = select i1 %cmp, float 0xFFF8000000000000, float 0x7FF8000100000000 171; CHECK: %fabs = call float @llvm.fabs.f32(float %select) 172define float @fabs_select_negnan_negnan(float addrspace(1)* %out, i32 %c) { 173 %cmp = icmp eq i32 %c, 0 174 %select = select i1 %cmp, float 0xFFF8000000000000, float 0x7FF8000100000000 175 %fabs = call float @llvm.fabs.f32(float %select) 176 ret float %fabs 177} 178 179; CHECK-LABEL: @fabs_select_negnan_negzero( 180; CHECK: %select = select i1 %cmp, float 0xFFF8000000000000, float -0.000000e+00 181; CHECK: %fabs = call float @llvm.fabs.f32(float %select) 182define float @fabs_select_negnan_negzero(float addrspace(1)* %out, i32 %c) { 183 %cmp = icmp eq i32 %c, 0 184 %select = select i1 %cmp, float 0xFFF8000000000000, float -0.0 185 %fabs = call float @llvm.fabs.f32(float %select) 186 ret float %fabs 187} 188 189; CHECK-LABEL: @fabs_select_negnan_zero( 190; CHECK: %select = select i1 %cmp, float 0xFFF8000000000000, float 0.000000e+00 191; CHECK: %fabs = call float @llvm.fabs.f32(float %select) 192define float @fabs_select_negnan_zero(float addrspace(1)* %out, i32 %c) { 193 %cmp = icmp eq i32 %c, 0 194 %select = select i1 %cmp, float 0xFFF8000000000000, float 0.0 195 %fabs = call float @llvm.fabs.f32(float %select) 196 ret float %fabs 197} 198