1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -simplifycfg < %s | FileCheck %s 3; RUN: opt -S -simplifycfg -speculate-one-expensive-inst=false < %s | FileCheck %s 4 5declare float @llvm.sqrt.f32(float) nounwind readonly 6declare float @llvm.fma.f32(float, float, float) nounwind readonly 7declare float @llvm.fmuladd.f32(float, float, float) nounwind readonly 8declare float @llvm.fabs.f32(float) nounwind readonly 9declare float @llvm.minnum.f32(float, float) nounwind readonly 10declare float @llvm.maxnum.f32(float, float) nounwind readonly 11declare float @llvm.minimum.f32(float, float) nounwind readonly 12declare float @llvm.maximum.f32(float, float) nounwind readonly 13 14define double @fdiv_test(double %a, double %b) { 15; CHECK-LABEL: @fdiv_test( 16; CHECK-NEXT: entry: 17; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[A:%.*]], 0.000000e+00 18; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[B:%.*]], [[A]] 19; CHECK-NEXT: [[COND:%.*]] = select nsz i1 [[CMP]], double [[DIV]], double 0.000000e+00 20; CHECK-NEXT: ret double [[COND]] 21; 22entry: 23 %cmp = fcmp ogt double %a, 0.0 24 br i1 %cmp, label %cond.true, label %cond.end 25 26cond.true: 27 %div = fdiv double %b, %a 28 br label %cond.end 29 30cond.end: 31 %cond = phi nsz double [ %div, %cond.true ], [ 0.0, %entry ] 32 ret double %cond 33} 34 35define void @sqrt_test(float addrspace(1)* noalias nocapture %out, float %a) nounwind { 36; CHECK-LABEL: @sqrt_test( 37; CHECK-NEXT: entry: 38; CHECK-NEXT: [[CMP_I:%.*]] = fcmp olt float [[A:%.*]], 0.000000e+00 39; CHECK-NEXT: [[TMP0:%.*]] = tail call float @llvm.sqrt.f32(float [[A]]) #2 40; CHECK-NEXT: [[COND_I:%.*]] = select afn i1 [[CMP_I]], float 0x7FF8000000000000, float [[TMP0]] 41; CHECK-NEXT: store float [[COND_I]], float addrspace(1)* [[OUT:%.*]], align 4 42; CHECK-NEXT: ret void 43; 44entry: 45 %cmp.i = fcmp olt float %a, 0.000000e+00 46 br i1 %cmp.i, label %test_sqrt.exit, label %cond.else.i 47 48cond.else.i: ; preds = %entry 49 %0 = tail call float @llvm.sqrt.f32(float %a) nounwind readnone 50 br label %test_sqrt.exit 51 52test_sqrt.exit: ; preds = %cond.else.i, %entry 53 %cond.i = phi afn float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ] 54 store float %cond.i, float addrspace(1)* %out, align 4 55 ret void 56} 57 58define void @fabs_test(float addrspace(1)* noalias nocapture %out, float %a) nounwind { 59; CHECK-LABEL: @fabs_test( 60; CHECK-NEXT: entry: 61; CHECK-NEXT: [[CMP_I:%.*]] = fcmp olt float [[A:%.*]], 0.000000e+00 62; CHECK-NEXT: [[TMP0:%.*]] = tail call float @llvm.fabs.f32(float [[A]]) #2 63; CHECK-NEXT: [[COND_I:%.*]] = select reassoc i1 [[CMP_I]], float 0x7FF8000000000000, float [[TMP0]] 64; CHECK-NEXT: store float [[COND_I]], float addrspace(1)* [[OUT:%.*]], align 4 65; CHECK-NEXT: ret void 66; 67entry: 68 %cmp.i = fcmp olt float %a, 0.000000e+00 69 br i1 %cmp.i, label %test_fabs.exit, label %cond.else.i 70 71cond.else.i: ; preds = %entry 72 %0 = tail call float @llvm.fabs.f32(float %a) nounwind readnone 73 br label %test_fabs.exit 74 75test_fabs.exit: ; preds = %cond.else.i, %entry 76 %cond.i = phi reassoc float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ] 77 store float %cond.i, float addrspace(1)* %out, align 4 78 ret void 79} 80 81define void @fma_test(float addrspace(1)* noalias nocapture %out, float %a, float %b, float %c) nounwind { 82; CHECK-LABEL: @fma_test( 83; CHECK-NEXT: entry: 84; CHECK-NEXT: [[CMP_I:%.*]] = fcmp olt float [[A:%.*]], 0.000000e+00 85; CHECK-NEXT: [[TMP0:%.*]] = tail call float @llvm.fma.f32(float [[A]], float [[B:%.*]], float [[C:%.*]]) #2 86; CHECK-NEXT: [[COND_I:%.*]] = select reassoc nsz i1 [[CMP_I]], float 0x7FF8000000000000, float [[TMP0]] 87; CHECK-NEXT: store float [[COND_I]], float addrspace(1)* [[OUT:%.*]], align 4 88; CHECK-NEXT: ret void 89; 90entry: 91 %cmp.i = fcmp olt float %a, 0.000000e+00 92 br i1 %cmp.i, label %test_fma.exit, label %cond.else.i 93 94cond.else.i: ; preds = %entry 95 %0 = tail call float @llvm.fma.f32(float %a, float %b, float %c) nounwind readnone 96 br label %test_fma.exit 97 98test_fma.exit: ; preds = %cond.else.i, %entry 99 %cond.i = phi nsz reassoc float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ] 100 store float %cond.i, float addrspace(1)* %out, align 4 101 ret void 102} 103 104define void @fmuladd_test(float addrspace(1)* noalias nocapture %out, float %a, float %b, float %c) nounwind { 105; CHECK-LABEL: @fmuladd_test( 106; CHECK-NEXT: entry: 107; CHECK-NEXT: [[CMP_I:%.*]] = fcmp olt float [[A:%.*]], 0.000000e+00 108; CHECK-NEXT: [[TMP0:%.*]] = tail call float @llvm.fmuladd.f32(float [[A]], float [[B:%.*]], float [[C:%.*]]) #2 109; CHECK-NEXT: [[COND_I:%.*]] = select ninf i1 [[CMP_I]], float 0x7FF8000000000000, float [[TMP0]] 110; CHECK-NEXT: store float [[COND_I]], float addrspace(1)* [[OUT:%.*]], align 4 111; CHECK-NEXT: ret void 112; 113entry: 114 %cmp.i = fcmp olt float %a, 0.000000e+00 115 br i1 %cmp.i, label %test_fmuladd.exit, label %cond.else.i 116 117cond.else.i: ; preds = %entry 118 %0 = tail call float @llvm.fmuladd.f32(float %a, float %b, float %c) nounwind readnone 119 br label %test_fmuladd.exit 120 121test_fmuladd.exit: ; preds = %cond.else.i, %entry 122 %cond.i = phi ninf float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ] 123 store float %cond.i, float addrspace(1)* %out, align 4 124 ret void 125} 126 127define void @minnum_test(float addrspace(1)* noalias nocapture %out, float %a, float %b) nounwind { 128; CHECK-LABEL: @minnum_test( 129; CHECK-NEXT: entry: 130; CHECK-NEXT: [[CMP_I:%.*]] = fcmp olt float [[A:%.*]], 0.000000e+00 131; CHECK-NEXT: [[TMP0:%.*]] = tail call float @llvm.minnum.f32(float [[A]], float [[B:%.*]]) #2 132; CHECK-NEXT: [[COND_I:%.*]] = select i1 [[CMP_I]], float 0x7FF8000000000000, float [[TMP0]] 133; CHECK-NEXT: store float [[COND_I]], float addrspace(1)* [[OUT:%.*]], align 4 134; CHECK-NEXT: ret void 135; 136entry: 137 %cmp.i = fcmp olt float %a, 0.000000e+00 138 br i1 %cmp.i, label %test_minnum.exit, label %cond.else.i 139 140cond.else.i: ; preds = %entry 141 %0 = tail call float @llvm.minnum.f32(float %a, float %b) nounwind readnone 142 br label %test_minnum.exit 143 144test_minnum.exit: ; preds = %cond.else.i, %entry 145 %cond.i = phi float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ] 146 store float %cond.i, float addrspace(1)* %out, align 4 147 ret void 148} 149 150define void @maxnum_test(float addrspace(1)* noalias nocapture %out, float %a, float %b) nounwind { 151; CHECK-LABEL: @maxnum_test( 152; CHECK-NEXT: entry: 153; CHECK-NEXT: [[CMP_I:%.*]] = fcmp olt float [[A:%.*]], 0.000000e+00 154; CHECK-NEXT: [[TMP0:%.*]] = tail call float @llvm.maxnum.f32(float [[A]], float [[B:%.*]]) #2 155; CHECK-NEXT: [[COND_I:%.*]] = select ninf nsz i1 [[CMP_I]], float 0x7FF8000000000000, float [[TMP0]] 156; CHECK-NEXT: store float [[COND_I]], float addrspace(1)* [[OUT:%.*]], align 4 157; CHECK-NEXT: ret void 158; 159entry: 160 %cmp.i = fcmp olt float %a, 0.000000e+00 161 br i1 %cmp.i, label %test_maxnum.exit, label %cond.else.i 162 163cond.else.i: ; preds = %entry 164 %0 = tail call float @llvm.maxnum.f32(float %a, float %b) nounwind readnone 165 br label %test_maxnum.exit 166 167test_maxnum.exit: ; preds = %cond.else.i, %entry 168 %cond.i = phi ninf nsz float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ] 169 store float %cond.i, float addrspace(1)* %out, align 4 170 ret void 171} 172 173define void @minimum_test(float addrspace(1)* noalias nocapture %out, float %a, float %b) nounwind { 174; CHECK-LABEL: @minimum_test( 175; CHECK-NEXT: entry: 176; CHECK-NEXT: [[CMP_I:%.*]] = fcmp olt float [[A:%.*]], 0.000000e+00 177; CHECK-NEXT: [[TMP0:%.*]] = tail call float @llvm.minimum.f32(float [[A]], float [[B:%.*]]) #2 178; CHECK-NEXT: [[COND_I:%.*]] = select reassoc i1 [[CMP_I]], float 0x7FF8000000000000, float [[TMP0]] 179; CHECK-NEXT: store float [[COND_I]], float addrspace(1)* [[OUT:%.*]], align 4 180; CHECK-NEXT: ret void 181; 182entry: 183 %cmp.i = fcmp olt float %a, 0.000000e+00 184 br i1 %cmp.i, label %test_minimum.exit, label %cond.else.i 185 186cond.else.i: ; preds = %entry 187 %0 = tail call float @llvm.minimum.f32(float %a, float %b) nounwind readnone 188 br label %test_minimum.exit 189 190test_minimum.exit: ; preds = %cond.else.i, %entry 191 %cond.i = phi reassoc float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ] 192 store float %cond.i, float addrspace(1)* %out, align 4 193 ret void 194} 195 196define void @maximum_test(float addrspace(1)* noalias nocapture %out, float %a, float %b) nounwind { 197; CHECK-LABEL: @maximum_test( 198; CHECK-NEXT: entry: 199; CHECK-NEXT: [[CMP_I:%.*]] = fcmp olt float [[A:%.*]], 0.000000e+00 200; CHECK-NEXT: [[TMP0:%.*]] = tail call float @llvm.maximum.f32(float [[A]], float [[B:%.*]]) #2 201; CHECK-NEXT: [[COND_I:%.*]] = select nsz i1 [[CMP_I]], float 0x7FF8000000000000, float [[TMP0]] 202; CHECK-NEXT: store float [[COND_I]], float addrspace(1)* [[OUT:%.*]], align 4 203; CHECK-NEXT: ret void 204; 205entry: 206 %cmp.i = fcmp olt float %a, 0.000000e+00 207 br i1 %cmp.i, label %test_maximum.exit, label %cond.else.i 208 209cond.else.i: ; preds = %entry 210 %0 = tail call float @llvm.maximum.f32(float %a, float %b) nounwind readnone 211 br label %test_maximum.exit 212 213test_maximum.exit: ; preds = %cond.else.i, %entry 214 %cond.i = phi nsz float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ] 215 store float %cond.i, float addrspace(1)* %out, align 4 216 ret void 217} 218