1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4define i1 @floor_x_ole(float %x) { 5; CHECK-LABEL: @floor_x_ole( 6; CHECK-NEXT: [[RET:%.*]] = fcmp ninf ord float [[X:%.*]], 0.000000e+00 7; CHECK-NEXT: ret i1 [[RET]] 8; 9 %floor = call float @llvm.floor.f32(float %x) 10 %ret = fcmp ninf ole float %floor, %x 11 ret i1 %ret 12} 13 14define i1 @floor_x_ule(float %x) { 15; CHECK-LABEL: @floor_x_ule( 16; CHECK-NEXT: ret i1 true 17; 18 %floor = call float @llvm.floor.f32(float %x) 19 %ret = fcmp ule float %floor, %x 20 ret i1 %ret 21} 22 23define i1 @floor_x_ogt(float %x) { 24; CHECK-LABEL: @floor_x_ogt( 25; CHECK-NEXT: ret i1 false 26; 27 %floor = call float @llvm.floor.f32(float %x) 28 %ret = fcmp ogt float %floor, %x 29 ret i1 %ret 30} 31 32define i1 @floor_x_ugt(float %x) { 33; CHECK-LABEL: @floor_x_ugt( 34; CHECK-NEXT: [[RET:%.*]] = fcmp ninf uno float [[X:%.*]], 0.000000e+00 35; CHECK-NEXT: ret i1 [[RET]] 36; 37 %floor = call float @llvm.floor.f32(float %x) 38 %ret = fcmp ninf ugt float %floor, %x 39 ret i1 %ret 40} 41 42define i1 @x_floor_oge(float %x) { 43; CHECK-LABEL: @x_floor_oge( 44; CHECK-NEXT: [[RET:%.*]] = fcmp ninf ord float [[X:%.*]], 0.000000e+00 45; CHECK-NEXT: ret i1 [[RET]] 46; 47 %floor = call float @llvm.floor.f32(float %x) 48 %ret = fcmp ninf oge float %x, %floor 49 ret i1 %ret 50} 51 52define i1 @x_floor_uge(float %x) { 53; CHECK-LABEL: @x_floor_uge( 54; CHECK-NEXT: ret i1 true 55; 56 %floor = call float @llvm.floor.f32(float %x) 57 %ret = fcmp uge float %x, %floor 58 ret i1 %ret 59} 60 61define i1 @x_floor_olt(float %x) { 62; CHECK-LABEL: @x_floor_olt( 63; CHECK-NEXT: ret i1 false 64; 65 %floor = call float @llvm.floor.f32(float %x) 66 %ret = fcmp olt float %x, %floor 67 ret i1 %ret 68} 69 70define i1 @x_floor_ult(float %x) { 71; CHECK-LABEL: @x_floor_ult( 72; CHECK-NEXT: [[RET:%.*]] = fcmp ninf uno float [[X:%.*]], 0.000000e+00 73; CHECK-NEXT: ret i1 [[RET]] 74; 75 %floor = call float @llvm.floor.f32(float %x) 76 %ret = fcmp ninf ult float %x, %floor 77 ret i1 %ret 78} 79 80define <2 x i1> @x_floor_olt_vec(<2 x float> %x) { 81; CHECK-LABEL: @x_floor_olt_vec( 82; CHECK-NEXT: ret <2 x i1> zeroinitializer 83; 84 %floor = call <2 x float> @llvm.floor.f32(<2 x float> %x) 85 %ret = fcmp olt <2 x float> %x, %floor 86 ret <2 x i1> %ret 87} 88 89define i1 @x_floor_ole_neg(float %x) { 90; CHECK-LABEL: @x_floor_ole_neg( 91; CHECK-NEXT: [[FLOOR:%.*]] = call float @llvm.floor.f32(float [[X:%.*]]) 92; CHECK-NEXT: [[RET:%.*]] = fcmp ole float [[X]], [[FLOOR]] 93; CHECK-NEXT: ret i1 [[RET]] 94; 95 %floor = call float @llvm.floor.f32(float %x) 96 %ret = fcmp ole float %x, %floor 97 ret i1 %ret 98} 99 100define i1 @x_floor_ogt_neg(float %x) { 101; CHECK-LABEL: @x_floor_ogt_neg( 102; CHECK-NEXT: [[FLOOR:%.*]] = call float @llvm.floor.f32(float [[X:%.*]]) 103; CHECK-NEXT: [[RET:%.*]] = fcmp ogt float [[X]], [[FLOOR]] 104; CHECK-NEXT: ret i1 [[RET]] 105; 106 %floor = call float @llvm.floor.f32(float %x) 107 %ret = fcmp ogt float %x, %floor 108 ret i1 %ret 109} 110 111define i1 @x_floor_ueq_neg(float %x) { 112; CHECK-LABEL: @x_floor_ueq_neg( 113; CHECK-NEXT: [[FLOOR:%.*]] = call float @llvm.floor.f32(float [[X:%.*]]) 114; CHECK-NEXT: [[RET:%.*]] = fcmp ueq float [[X]], [[FLOOR]] 115; CHECK-NEXT: ret i1 [[RET]] 116; 117 %floor = call float @llvm.floor.f32(float %x) 118 %ret = fcmp ueq float %x, %floor 119 ret i1 %ret 120} 121 122define i1 @x_floor_une_neg(float %x) { 123; CHECK-LABEL: @x_floor_une_neg( 124; CHECK-NEXT: [[FLOOR:%.*]] = call float @llvm.floor.f32(float [[X:%.*]]) 125; CHECK-NEXT: [[RET:%.*]] = fcmp une float [[X]], [[FLOOR]] 126; CHECK-NEXT: ret i1 [[RET]] 127; 128 %floor = call float @llvm.floor.f32(float %x) 129 %ret = fcmp une float %x, %floor 130 ret i1 %ret 131} 132 133define i1 @ceil_x_oge(float %x) { 134; CHECK-LABEL: @ceil_x_oge( 135; CHECK-NEXT: [[RET:%.*]] = fcmp ninf ord float [[X:%.*]], 0.000000e+00 136; CHECK-NEXT: ret i1 [[RET]] 137; 138 %ceil = call float @llvm.ceil.f32(float %x) 139 %ret = fcmp ninf oge float %ceil, %x 140 ret i1 %ret 141} 142 143define i1 @ceil_x_uge(float %x) { 144; CHECK-LABEL: @ceil_x_uge( 145; CHECK-NEXT: ret i1 true 146; 147 %ceil = call float @llvm.ceil.f32(float %x) 148 %ret = fcmp uge float %ceil, %x 149 ret i1 %ret 150} 151 152define i1 @ceil_x_olt(float %x) { 153; CHECK-LABEL: @ceil_x_olt( 154; CHECK-NEXT: ret i1 false 155; 156 %ceil = call float @llvm.ceil.f32(float %x) 157 %ret = fcmp olt float %ceil, %x 158 ret i1 %ret 159} 160 161define i1 @ceil_x_ult(float %x) { 162; CHECK-LABEL: @ceil_x_ult( 163; CHECK-NEXT: [[RET:%.*]] = fcmp ninf uno float [[X:%.*]], 0.000000e+00 164; CHECK-NEXT: ret i1 [[RET]] 165; 166 %ceil = call float @llvm.ceil.f32(float %x) 167 %ret = fcmp ninf ult float %ceil, %x 168 ret i1 %ret 169} 170 171define i1 @x_ceil_ole(float %x) { 172; CHECK-LABEL: @x_ceil_ole( 173; CHECK-NEXT: [[RET:%.*]] = fcmp ninf ord float [[X:%.*]], 0.000000e+00 174; CHECK-NEXT: ret i1 [[RET]] 175; 176 %ceil = call float @llvm.ceil.f32(float %x) 177 %ret = fcmp ninf ole float %x, %ceil 178 ret i1 %ret 179} 180 181define i1 @x_ceil_ule(float %x) { 182; CHECK-LABEL: @x_ceil_ule( 183; CHECK-NEXT: ret i1 true 184; 185 %ceil = call float @llvm.ceil.f32(float %x) 186 %ret = fcmp ule float %x, %ceil 187 ret i1 %ret 188} 189 190define i1 @x_ceil_ogt(float %x) { 191; CHECK-LABEL: @x_ceil_ogt( 192; CHECK-NEXT: ret i1 false 193; 194 %ceil = call float @llvm.ceil.f32(float %x) 195 %ret = fcmp ogt float %x, %ceil 196 ret i1 %ret 197} 198 199define i1 @x_ceil_ugt(float %x) { 200; CHECK-LABEL: @x_ceil_ugt( 201; CHECK-NEXT: [[RET:%.*]] = fcmp ninf uno float [[X:%.*]], 0.000000e+00 202; CHECK-NEXT: ret i1 [[RET]] 203; 204 %ceil = call float @llvm.ceil.f32(float %x) 205 %ret = fcmp ninf ugt float %x, %ceil 206 ret i1 %ret 207} 208 209define <2 x i1> @x_ceil_ogt_vec(<2 x float> %x) { 210; CHECK-LABEL: @x_ceil_ogt_vec( 211; CHECK-NEXT: ret <2 x i1> zeroinitializer 212; 213 %ceil = call <2 x float> @llvm.ceil.f32(<2 x float> %x) 214 %ret = fcmp ogt <2 x float> %x, %ceil 215 ret <2 x i1> %ret 216} 217 218define i1 @x_ceil_oge_neg(float %x) { 219; CHECK-LABEL: @x_ceil_oge_neg( 220; CHECK-NEXT: [[CEIL:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]]) 221; CHECK-NEXT: [[RET:%.*]] = fcmp oge float [[X]], [[CEIL]] 222; CHECK-NEXT: ret i1 [[RET]] 223; 224 %ceil = call float @llvm.ceil.f32(float %x) 225 %ret = fcmp oge float %x, %ceil 226 ret i1 %ret 227} 228 229define i1 @x_ceil_olt_neg(float %x) { 230; CHECK-LABEL: @x_ceil_olt_neg( 231; CHECK-NEXT: [[CEIL:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]]) 232; CHECK-NEXT: [[RET:%.*]] = fcmp olt float [[X]], [[CEIL]] 233; CHECK-NEXT: ret i1 [[RET]] 234; 235 %ceil = call float @llvm.ceil.f32(float %x) 236 %ret = fcmp olt float %x, %ceil 237 ret i1 %ret 238} 239 240define i1 @x_ceil_oeq_neg(float %x) { 241; CHECK-LABEL: @x_ceil_oeq_neg( 242; CHECK-NEXT: [[CEIL:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]]) 243; CHECK-NEXT: [[RET:%.*]] = fcmp oeq float [[X]], [[CEIL]] 244; CHECK-NEXT: ret i1 [[RET]] 245; 246 %ceil = call float @llvm.ceil.f32(float %x) 247 %ret = fcmp oeq float %x, %ceil 248 ret i1 %ret 249} 250 251define i1 @x_ceil_one_neg(float %x) { 252; CHECK-LABEL: @x_ceil_one_neg( 253; CHECK-NEXT: [[CEIL:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]]) 254; CHECK-NEXT: [[RET:%.*]] = fcmp one float [[X]], [[CEIL]] 255; CHECK-NEXT: ret i1 [[RET]] 256; 257 %ceil = call float @llvm.ceil.f32(float %x) 258 %ret = fcmp one float %x, %ceil 259 ret i1 %ret 260} 261