261 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define i1 @floor_x_ole(float %x) {5; CHECK-LABEL: @floor_x_ole(6; CHECK-NEXT: [[RET:%.*]] = fcmp ninf ord float [[X:%.*]], 0.000000e+007; CHECK-NEXT: ret i1 [[RET]]8;9 %floor = call float @llvm.floor.f32(float %x)10 %ret = fcmp ninf ole float %floor, %x11 ret i1 %ret12}13 14define i1 @floor_x_ule(float %x) {15; CHECK-LABEL: @floor_x_ule(16; CHECK-NEXT: ret i1 true17;18 %floor = call float @llvm.floor.f32(float %x)19 %ret = fcmp ule float %floor, %x20 ret i1 %ret21}22 23define i1 @floor_x_ogt(float %x) {24; CHECK-LABEL: @floor_x_ogt(25; CHECK-NEXT: ret i1 false26;27 %floor = call float @llvm.floor.f32(float %x)28 %ret = fcmp ogt float %floor, %x29 ret i1 %ret30}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+0035; CHECK-NEXT: ret i1 [[RET]]36;37 %floor = call float @llvm.floor.f32(float %x)38 %ret = fcmp ninf ugt float %floor, %x39 ret i1 %ret40}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+0045; CHECK-NEXT: ret i1 [[RET]]46;47 %floor = call float @llvm.floor.f32(float %x)48 %ret = fcmp ninf oge float %x, %floor49 ret i1 %ret50}51 52define i1 @x_floor_uge(float %x) {53; CHECK-LABEL: @x_floor_uge(54; CHECK-NEXT: ret i1 true55;56 %floor = call float @llvm.floor.f32(float %x)57 %ret = fcmp uge float %x, %floor58 ret i1 %ret59}60 61define i1 @x_floor_olt(float %x) {62; CHECK-LABEL: @x_floor_olt(63; CHECK-NEXT: ret i1 false64;65 %floor = call float @llvm.floor.f32(float %x)66 %ret = fcmp olt float %x, %floor67 ret i1 %ret68}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+0073; CHECK-NEXT: ret i1 [[RET]]74;75 %floor = call float @llvm.floor.f32(float %x)76 %ret = fcmp ninf ult float %x, %floor77 ret i1 %ret78}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> zeroinitializer83;84 %floor = call <2 x float> @llvm.floor.f32(<2 x float> %x)85 %ret = fcmp olt <2 x float> %x, %floor86 ret <2 x i1> %ret87}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, %floor97 ret i1 %ret98}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, %floor108 ret i1 %ret109}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, %floor119 ret i1 %ret120}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, %floor130 ret i1 %ret131}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+00136; CHECK-NEXT: ret i1 [[RET]]137;138 %ceil = call float @llvm.ceil.f32(float %x)139 %ret = fcmp ninf oge float %ceil, %x140 ret i1 %ret141}142 143define i1 @ceil_x_uge(float %x) {144; CHECK-LABEL: @ceil_x_uge(145; CHECK-NEXT: ret i1 true146;147 %ceil = call float @llvm.ceil.f32(float %x)148 %ret = fcmp uge float %ceil, %x149 ret i1 %ret150}151 152define i1 @ceil_x_olt(float %x) {153; CHECK-LABEL: @ceil_x_olt(154; CHECK-NEXT: ret i1 false155;156 %ceil = call float @llvm.ceil.f32(float %x)157 %ret = fcmp olt float %ceil, %x158 ret i1 %ret159}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+00164; CHECK-NEXT: ret i1 [[RET]]165;166 %ceil = call float @llvm.ceil.f32(float %x)167 %ret = fcmp ninf ult float %ceil, %x168 ret i1 %ret169}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+00174; CHECK-NEXT: ret i1 [[RET]]175;176 %ceil = call float @llvm.ceil.f32(float %x)177 %ret = fcmp ninf ole float %x, %ceil178 ret i1 %ret179}180 181define i1 @x_ceil_ule(float %x) {182; CHECK-LABEL: @x_ceil_ule(183; CHECK-NEXT: ret i1 true184;185 %ceil = call float @llvm.ceil.f32(float %x)186 %ret = fcmp ule float %x, %ceil187 ret i1 %ret188}189 190define i1 @x_ceil_ogt(float %x) {191; CHECK-LABEL: @x_ceil_ogt(192; CHECK-NEXT: ret i1 false193;194 %ceil = call float @llvm.ceil.f32(float %x)195 %ret = fcmp ogt float %x, %ceil196 ret i1 %ret197}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+00202; CHECK-NEXT: ret i1 [[RET]]203;204 %ceil = call float @llvm.ceil.f32(float %x)205 %ret = fcmp ninf ugt float %x, %ceil206 ret i1 %ret207}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> zeroinitializer212;213 %ceil = call <2 x float> @llvm.ceil.f32(<2 x float> %x)214 %ret = fcmp ogt <2 x float> %x, %ceil215 ret <2 x i1> %ret216}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, %ceil226 ret i1 %ret227}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, %ceil237 ret i1 %ret238}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, %ceil248 ret i1 %ret249}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, %ceil259 ret i1 %ret260}261