brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.1 KiB · c4ce874 Raw
205 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -S -passes=instcombine | FileCheck %s3 4; This file used to contain more tests that folded to true/false,5; but those are all tested identically in InstSimplify now.6; If any remaining tests are made to return true/false, that7; functionality/testing may be better housed in InstSimplify8; rather than InstCombine.9 10define i1 @fabs_sqrt_src_maybe_nan(double %arg0, double %arg1) {11; CHECK-LABEL: @fabs_sqrt_src_maybe_nan(12; CHECK-NEXT:    [[TMP:%.*]] = fcmp ord double [[ARG0:%.*]], 0.000000e+0013; CHECK-NEXT:    ret i1 [[TMP]]14;15  %fabs = call double @llvm.fabs.f64(double %arg0)16  %op = call double @llvm.sqrt.f64(double %fabs)17  %tmp = fcmp ord double %op, %op18  ret i1 %tmp19}20 21define i1 @select_maybe_nan_lhs(i1 %cond, double %lhs, double %arg1) {22; CHECK-LABEL: @select_maybe_nan_lhs(23; CHECK-NEXT:    [[TMP:%.*]] = fcmp ord double [[OP:%.*]], 0.000000e+0024; CHECK-NEXT:    [[NOT_COND:%.*]] = xor i1 [[COND:%.*]], true25; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[NOT_COND]], i1 true, i1 [[TMP]]26; CHECK-NEXT:    ret i1 [[TMP1]]27;28  %rhs = fadd nnan double %arg1, 1.029  %op = select i1 %cond, double %lhs, double %rhs30  %tmp = fcmp ord double %op, %op31  ret i1 %tmp32}33 34define i1 @select_maybe_nan_rhs(i1 %cond, double %arg0, double %rhs) {35; CHECK-LABEL: @select_maybe_nan_rhs(36; CHECK-NEXT:    [[TMP:%.*]] = fcmp ord double [[OP:%.*]], 0.000000e+0037; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[COND:%.*]], i1 true, i1 [[TMP]]38; CHECK-NEXT:    ret i1 [[TMP1]]39;40  %lhs = fadd nnan double %arg0, 1.041  %op = select i1 %cond, double %lhs, double %rhs42  %tmp = fcmp ord double %op, %op43  ret i1 %tmp44}45 46define i1 @nnan_fadd(double %arg0, double %arg1) {47; CHECK-LABEL: @nnan_fadd(48; CHECK-NEXT:    [[NNAN_ARG0:%.*]] = fadd nnan double [[ARG0:%.*]], 1.000000e+0049; CHECK-NEXT:    [[NNAN_ARG1:%.*]] = fadd nnan double [[ARG0]], 2.000000e+0050; CHECK-NEXT:    [[OP:%.*]] = fadd double [[NNAN_ARG0]], [[NNAN_ARG1]]51; CHECK-NEXT:    [[TMP:%.*]] = fcmp ord double [[OP]], 0.000000e+0052; CHECK-NEXT:    ret i1 [[TMP]]53;54  %nnan.arg0 = fadd nnan double %arg0, 1.055  %nnan.arg1 = fadd nnan double %arg0, 2.056  %op = fadd double %nnan.arg0, %nnan.arg157  %tmp = fcmp ord double %op, %op58  ret i1 %tmp59}60 61define i1 @nnan_fadd_maybe_nan_lhs(double %arg0, double %arg1) {62; CHECK-LABEL: @nnan_fadd_maybe_nan_lhs(63; CHECK-NEXT:    [[NNAN_ARG1:%.*]] = fadd nnan double [[ARG1:%.*]], 1.000000e+0064; CHECK-NEXT:    [[OP:%.*]] = fadd double [[ARG0:%.*]], [[NNAN_ARG1]]65; CHECK-NEXT:    [[TMP:%.*]] = fcmp ord double [[OP]], 0.000000e+0066; CHECK-NEXT:    ret i1 [[TMP]]67;68  %nnan.arg1 = fadd nnan double %arg1, 1.069  %op = fadd double %arg0, %nnan.arg170  %tmp = fcmp ord double %op, %op71  ret i1 %tmp72}73 74define i1 @nnan_fadd_maybe_nan_rhs(double %arg0, double %arg1) {75; CHECK-LABEL: @nnan_fadd_maybe_nan_rhs(76; CHECK-NEXT:    [[NNAN_ARG0:%.*]] = fadd nnan double [[ARG0:%.*]], 1.000000e+0077; CHECK-NEXT:    [[OP:%.*]] = fadd double [[NNAN_ARG0]], [[ARG1:%.*]]78; CHECK-NEXT:    [[TMP:%.*]] = fcmp ord double [[OP]], 0.000000e+0079; CHECK-NEXT:    ret i1 [[TMP]]80;81  %nnan.arg0 = fadd nnan double %arg0, 1.082  %op = fadd double %nnan.arg0, %arg183  %tmp = fcmp ord double %op, %op84  ret i1 %tmp85}86 87define i1 @nnan_fmul(double %arg0, double %arg1) {88; CHECK-LABEL: @nnan_fmul(89; CHECK-NEXT:    [[NNAN_ARG0:%.*]] = fadd nnan double [[ARG0:%.*]], 1.000000e+0090; CHECK-NEXT:    [[NNAN_ARG1:%.*]] = fadd nnan double [[ARG0]], 2.000000e+0091; CHECK-NEXT:    [[OP:%.*]] = fmul double [[NNAN_ARG0]], [[NNAN_ARG1]]92; CHECK-NEXT:    [[TMP:%.*]] = fcmp ord double [[OP]], 0.000000e+0093; CHECK-NEXT:    ret i1 [[TMP]]94;95  %nnan.arg0 = fadd nnan double %arg0, 1.096  %nnan.arg1 = fadd nnan double %arg0, 2.097  %op = fmul double %nnan.arg0, %nnan.arg198  %tmp = fcmp ord double %op, %op99  ret i1 %tmp100}101 102define i1 @nnan_fsub(double %arg0, double %arg1) {103; CHECK-LABEL: @nnan_fsub(104; CHECK-NEXT:    [[NNAN_ARG0:%.*]] = fadd nnan double [[ARG0:%.*]], 1.000000e+00105; CHECK-NEXT:    [[NNAN_ARG1:%.*]] = fadd nnan double [[ARG0]], 2.000000e+00106; CHECK-NEXT:    [[OP:%.*]] = fsub double [[NNAN_ARG0]], [[NNAN_ARG1]]107; CHECK-NEXT:    [[TMP:%.*]] = fcmp ord double [[OP]], 0.000000e+00108; CHECK-NEXT:    ret i1 [[TMP]]109;110  %nnan.arg0 = fadd nnan double %arg0, 1.0111  %nnan.arg1 = fadd nnan double %arg0, 2.0112  %op = fsub double %nnan.arg0, %nnan.arg1113  %tmp = fcmp ord double %op, %op114  ret i1 %tmp115}116 117declare double @func()118 119define i1 @nnan_fneg() {120; CHECK-LABEL: @nnan_fneg(121; CHECK-NEXT:    [[NNAN:%.*]] = call nnan double @func()122; CHECK-NEXT:    ret i1 true123;124  %nnan = call nnan double @func()125  %op = fsub double -0.0, %nnan126  %tmp = fcmp ord double %op, %op127  ret i1 %tmp128}129 130define i1 @nnan_unary_fneg() {131; CHECK-LABEL: @nnan_unary_fneg(132; CHECK-NEXT:    [[NNAN:%.*]] = call nnan double @func()133; CHECK-NEXT:    ret i1 true134;135  %nnan = call nnan double @func()136  %op = fneg double %nnan137  %tmp = fcmp ord double %op, %op138  ret i1 %tmp139}140 141define i1 @fpext_maybe_nan(float %arg0) {142; CHECK-LABEL: @fpext_maybe_nan(143; CHECK-NEXT:    [[TMP:%.*]] = fcmp ord float [[ARG0:%.*]], 0.000000e+00144; CHECK-NEXT:    ret i1 [[TMP]]145;146  %op = fpext float %arg0 to double147  %tmp = fcmp ord double %op, %op148  ret i1 %tmp149}150 151define i1 @fptrunc_maybe_nan(double %arg0) {152; CHECK-LABEL: @fptrunc_maybe_nan(153; CHECK-NEXT:    [[OP:%.*]] = fptrunc double [[ARG0:%.*]] to float154; CHECK-NEXT:    [[TMP:%.*]] = fcmp ord float [[OP]], 0.000000e+00155; CHECK-NEXT:    ret i1 [[TMP]]156;157  %op = fptrunc double %arg0 to float158  %tmp = fcmp ord float %op, %op159  ret i1 %tmp160}161 162define i1 @nnan_fdiv(double %arg0, double %arg1) {163; CHECK-LABEL: @nnan_fdiv(164; CHECK-NEXT:    [[NNAN_ARG0:%.*]] = fadd nnan double [[ARG0:%.*]], 1.000000e+00165; CHECK-NEXT:    [[NNAN_ARG1:%.*]] = fadd nnan double [[ARG0]], 2.000000e+00166; CHECK-NEXT:    [[OP:%.*]] = fdiv double [[NNAN_ARG0]], [[NNAN_ARG1]]167; CHECK-NEXT:    [[TMP:%.*]] = fcmp ord double [[OP]], 0.000000e+00168; CHECK-NEXT:    ret i1 [[TMP]]169;170  %nnan.arg0 = fadd nnan double %arg0, 1.0171  %nnan.arg1 = fadd nnan double %arg0, 2.0172  %op = fdiv double %nnan.arg0, %nnan.arg1173  %tmp = fcmp ord double %op, %op174  ret i1 %tmp175}176 177define i1 @nnan_frem(double %arg0, double %arg1) {178; CHECK-LABEL: @nnan_frem(179; CHECK-NEXT:    [[NNAN_ARG0:%.*]] = fadd nnan double [[ARG0:%.*]], 1.000000e+00180; CHECK-NEXT:    [[NNAN_ARG1:%.*]] = fadd nnan double [[ARG0]], 2.000000e+00181; CHECK-NEXT:    [[OP:%.*]] = frem double [[NNAN_ARG0]], [[NNAN_ARG1]]182; CHECK-NEXT:    [[TMP:%.*]] = fcmp ord double [[OP]], 0.000000e+00183; CHECK-NEXT:    ret i1 [[TMP]]184;185  %nnan.arg0 = fadd nnan double %arg0, 1.0186  %nnan.arg1 = fadd nnan double %arg0, 2.0187  %op = frem double %nnan.arg0, %nnan.arg1188  %tmp = fcmp ord double %op, %op189  ret i1 %tmp190}191 192declare double @llvm.sqrt.f64(double)193declare double @llvm.fabs.f64(double)194declare double @llvm.canonicalize.f64(double)195declare double @llvm.copysign.f64(double, double)196declare double @llvm.exp.f64(double)197declare double @llvm.exp2.f64(double)198declare double @llvm.floor.f64(double)199declare double @llvm.ceil.f64(double)200declare double @llvm.trunc.f64(double)201declare double @llvm.rint.f64(double)202declare double @llvm.nearbyint.f64(double)203declare double @llvm.round.f64(double)204 205