brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.8 KiB · 53ed448 Raw
504 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s3 4declare void @llvm.assume(i1)5declare void @use(i64)6declare void @use4(i4)7 8define i1 @select_v_ne_fail(i8 %v, i8 %C, i8 %y) {9; CHECK-LABEL: @select_v_ne_fail(10; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 011; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])12; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i8 [[V:%.*]], [[C:%.*]]13; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]14; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 015; CHECK-NEXT:    ret i1 [[R]]16;17  %ynz = icmp ne i8 %y, 018  call void @llvm.assume(i1 %ynz)19  %cmp = icmp ne i8 %v, %C20  %s = select i1 %cmp, i8 %v, i8 %y21  %r = icmp eq i8 %s, 022  ret i1 %r23}24 25define i1 @select_v_eq_nz(i8 %v, i8 %C, i8 %y) {26; CHECK-LABEL: @select_v_eq_nz(27; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 028; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])29; CHECK-NEXT:    [[PCOND0:%.*]] = icmp ne i8 [[C:%.*]], 030; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])31; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[C]], [[V:%.*]]32; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]33; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 034; CHECK-NEXT:    ret i1 [[R]]35;36  %ynz = icmp ne i8 %y, 037  call void @llvm.assume(i1 %ynz)38  %pcond0 = icmp ne i8 %C, 039  call void @llvm.assume(i1 %pcond0)40  %cmp = icmp eq i8 %C, %v41  %s = select i1 %cmp, i8 %v, i8 %y42  %r = icmp eq i8 %s, 043  ret i1 %r44}45 46define i1 @inv_select_v_ugt_nz(i8 %v, i8 %C, i8 %y) {47; CHECK-LABEL: @inv_select_v_ugt_nz(48; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 049; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])50; CHECK-NEXT:    [[PCOND0:%.*]] = icmp ne i8 [[C:%.*]], 051; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])52; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[C]], [[V:%.*]]53; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]]54; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 055; CHECK-NEXT:    ret i1 [[R]]56;57  %ynz = icmp ne i8 %y, 058  call void @llvm.assume(i1 %ynz)59  %pcond0 = icmp ne i8 %C, 060  call void @llvm.assume(i1 %pcond0)61  %cmp = icmp ugt i8 %C, %v62  %s = select i1 %cmp, i8 %y, i8 %v63  %r = icmp eq i8 %s, 064  ret i1 %r65}66 67define i1 @inv_select_v_ugt_fail(i8 %v, i8 %C, i8 %y) {68; CHECK-LABEL: @inv_select_v_ugt_fail(69; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 070; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])71; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], -872; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])73; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[C]], [[V:%.*]]74; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]]75; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 076; CHECK-NEXT:    ret i1 [[R]]77;78  %ynz = icmp ne i8 %y, 079  call void @llvm.assume(i1 %ynz)80  %pcond0 = icmp sge i8 %C, -881  call void @llvm.assume(i1 %pcond0)82  %cmp = icmp ugt i8 %C, %v83  %s = select i1 %cmp, i8 %y, i8 %v84  %r = icmp eq i8 %s, 085  ret i1 %r86}87 88define i1 @select_v_uge_nz(i8 %v, i8 %C, i8 %y) {89; CHECK-LABEL: @select_v_uge_nz(90; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 091; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])92; CHECK-NEXT:    [[PCOND0:%.*]] = icmp ne i8 [[C:%.*]], 093; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])94; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i8 [[V:%.*]], [[C]]95; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]96; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 097; CHECK-NEXT:    ret i1 [[R]]98;99  %ynz = icmp ne i8 %y, 0100  call void @llvm.assume(i1 %ynz)101  %pcond0 = icmp ne i8 %C, 0102  call void @llvm.assume(i1 %pcond0)103  %cmp = icmp uge i8 %v, %C104  %s = select i1 %cmp, i8 %v, i8 %y105  %r = icmp eq i8 %s, 0106  ret i1 %r107}108 109define i1 @select_v_sgt_nonneg(i8 %v, i8 %C, i8 %y) {110; CHECK-LABEL: @select_v_sgt_nonneg(111; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0112; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])113; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], 0114; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])115; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[V:%.*]], [[C]]116; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]117; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0118; CHECK-NEXT:    ret i1 [[R]]119;120  %ynz = icmp ne i8 %y, 0121  call void @llvm.assume(i1 %ynz)122  %pcond0 = icmp sge i8 %C, 0123  call void @llvm.assume(i1 %pcond0)124  %cmp = icmp sgt i8 %v, %C125  %s = select i1 %cmp, i8 %v, i8 %y126  %r = icmp eq i8 %s, 0127  ret i1 %r128}129 130define i1 @select_v_sgt_fail(i8 %v, i8 %C, i8 %y) {131; CHECK-LABEL: @select_v_sgt_fail(132; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0133; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])134; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], -4135; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])136; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[V:%.*]], [[C]]137; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]138; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0139; CHECK-NEXT:    ret i1 [[R]]140;141  %ynz = icmp ne i8 %y, 0142  call void @llvm.assume(i1 %ynz)143  %pcond0 = icmp sge i8 %C, -4144  call void @llvm.assume(i1 %pcond0)145  %cmp = icmp sgt i8 %v, %C146  %s = select i1 %cmp, i8 %v, i8 %y147  %r = icmp eq i8 %s, 0148  ret i1 %r149}150 151define i1 @inv_select_v_sgt_neg(i8 %v, i8 %C, i8 %y) {152; CHECK-LABEL: @inv_select_v_sgt_neg(153; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0154; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])155; CHECK-NEXT:    [[PCOND0:%.*]] = icmp slt i8 [[C:%.*]], 0156; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])157; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[V:%.*]], [[C]]158; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]]159; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0160; CHECK-NEXT:    ret i1 [[R]]161;162  %ynz = icmp ne i8 %y, 0163  call void @llvm.assume(i1 %ynz)164  %pcond0 = icmp slt i8 %C, 0165  call void @llvm.assume(i1 %pcond0)166  %cmp = icmp sgt i8 %v, %C167  %s = select i1 %cmp, i8 %y, i8 %v168  %r = icmp eq i8 %s, 0169  ret i1 %r170}171 172define i1 @inv_select_v_sgt_nonneg_nz(i8 %v, i8 %C, i8 %y) {173; CHECK-LABEL: @inv_select_v_sgt_nonneg_nz(174; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0175; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])176; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sgt i8 [[C:%.*]], 0177; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])178; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[C]], [[V:%.*]]179; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]]180; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0181; CHECK-NEXT:    ret i1 [[R]]182;183  %ynz = icmp ne i8 %y, 0184  call void @llvm.assume(i1 %ynz)185  %pcond0 = icmp sgt i8 %C, 0186  call void @llvm.assume(i1 %pcond0)187  %cmp = icmp sgt i8 %C, %v188  %s = select i1 %cmp, i8 %y, i8 %v189  %r = icmp eq i8 %s, 0190  ret i1 %r191}192 193define i1 @select_v_slt_nonneg(i8 %v, i8 %C, i8 %y) {194; CHECK-LABEL: @select_v_slt_nonneg(195; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0196; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])197; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], 0198; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])199; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[C]], [[V:%.*]]200; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]201; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0202; CHECK-NEXT:    ret i1 [[R]]203;204  %ynz = icmp ne i8 %y, 0205  call void @llvm.assume(i1 %ynz)206  %pcond0 = icmp sge i8 %C, 0207  call void @llvm.assume(i1 %pcond0)208  %cmp = icmp slt i8 %C, %v209  %s = select i1 %cmp, i8 %v, i8 %y210  %r = icmp eq i8 %s, 0211  ret i1 %r212}213 214define i1 @select_v_slt_nonneg_fail(i8 %v, i8 %C, i8 %y) {215; CHECK-LABEL: @select_v_slt_nonneg_fail(216; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0217; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])218; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], -1219; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])220; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[C]], [[V:%.*]]221; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]222; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0223; CHECK-NEXT:    ret i1 [[R]]224;225  %ynz = icmp ne i8 %y, 0226  call void @llvm.assume(i1 %ynz)227  %pcond0 = icmp sge i8 %C, -1228  call void @llvm.assume(i1 %pcond0)229  %cmp = icmp slt i8 %C, %v230  %s = select i1 %cmp, i8 %v, i8 %y231  %r = icmp eq i8 %s, 0232  ret i1 %r233}234 235define i1 @select_v_slt_neg(i8 %v, i8 %C, i8 %y) {236; CHECK-LABEL: @select_v_slt_neg(237; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0238; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])239; CHECK-NEXT:    [[PCOND0:%.*]] = icmp slt i8 [[C:%.*]], 0240; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])241; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[V:%.*]], [[C]]242; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]243; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0244; CHECK-NEXT:    ret i1 [[R]]245;246  %ynz = icmp ne i8 %y, 0247  call void @llvm.assume(i1 %ynz)248  %pcond0 = icmp slt i8 %C, 0249  call void @llvm.assume(i1 %pcond0)250  %cmp = icmp slt i8 %v, %C251  %s = select i1 %cmp, i8 %v, i8 %y252  %r = icmp eq i8 %s, 0253  ret i1 %r254}255 256define i1 @select_v_sge_nonneg_nz(i8 %v, i8 %C, i8 %y) {257; CHECK-LABEL: @select_v_sge_nonneg_nz(258; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0259; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])260; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sgt i8 [[C:%.*]], 0261; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])262; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i8 [[V:%.*]], [[C]]263; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]264; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0265; CHECK-NEXT:    ret i1 [[R]]266;267  %ynz = icmp ne i8 %y, 0268  call void @llvm.assume(i1 %ynz)269  %pcond0 = icmp sgt i8 %C, 0270  call void @llvm.assume(i1 %pcond0)271  %cmp = icmp sge i8 %v, %C272  %s = select i1 %cmp, i8 %v, i8 %y273  %r = icmp eq i8 %s, 0274  ret i1 %r275}276 277define i1 @select_v_sge_neg(i8 %v, i8 %C, i8 %y) {278; CHECK-LABEL: @select_v_sge_neg(279; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0280; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])281; CHECK-NEXT:    [[PCOND0:%.*]] = icmp slt i8 [[C:%.*]], 0282; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])283; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i8 [[C]], [[V:%.*]]284; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]285; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0286; CHECK-NEXT:    ret i1 [[R]]287;288  %ynz = icmp ne i8 %y, 0289  call void @llvm.assume(i1 %ynz)290  %pcond0 = icmp slt i8 %C, 0291  call void @llvm.assume(i1 %pcond0)292  %cmp = icmp sge i8 %C, %v293  %s = select i1 %cmp, i8 %v, i8 %y294  %r = icmp eq i8 %s, 0295  ret i1 %r296}297 298define i1 @inv_select_v_sge_fail(i8 %v, i8 %C, i8 %y) {299; CHECK-LABEL: @inv_select_v_sge_fail(300; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0301; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])302; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i8 [[V:%.*]], [[C:%.*]]303; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]]304; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0305; CHECK-NEXT:    ret i1 [[R]]306;307  %ynz = icmp ne i8 %y, 0308  call void @llvm.assume(i1 %ynz)309  %cmp = icmp sge i8 %v, %C310  %s = select i1 %cmp, i8 %y, i8 %v311  %r = icmp eq i8 %s, 0312  ret i1 %r313}314 315define i1 @select_v_sle_neg(i8 %v, i8 %C, i8 %y) {316; CHECK-LABEL: @select_v_sle_neg(317; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0318; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])319; CHECK-NEXT:    [[PCOND0:%.*]] = icmp slt i8 [[C:%.*]], 0320; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])321; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i8 [[V:%.*]], [[C]]322; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]323; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0324; CHECK-NEXT:    ret i1 [[R]]325;326  %ynz = icmp ne i8 %y, 0327  call void @llvm.assume(i1 %ynz)328  %pcond0 = icmp slt i8 %C, 0329  call void @llvm.assume(i1 %pcond0)330  %cmp = icmp sle i8 %v, %C331  %s = select i1 %cmp, i8 %v, i8 %y332  %r = icmp eq i8 %s, 0333  ret i1 %r334}335 336define i1 @select_v_sle_nonneg_nz(i8 %v, i8 %C, i8 %y) {337; CHECK-LABEL: @select_v_sle_nonneg_nz(338; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0339; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])340; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sgt i8 [[C:%.*]], 0341; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])342; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i8 [[C]], [[V:%.*]]343; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]344; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0345; CHECK-NEXT:    ret i1 [[R]]346;347  %ynz = icmp ne i8 %y, 0348  call void @llvm.assume(i1 %ynz)349  %pcond0 = icmp sgt i8 %C, 0350  call void @llvm.assume(i1 %pcond0)351  %cmp = icmp sle i8 %C, %v352  %s = select i1 %cmp, i8 %v, i8 %y353  %r = icmp eq i8 %s, 0354  ret i1 %r355}356 357define i1 @select_v_sle_fail(i8 %v, i8 %C, i8 %y) {358; CHECK-LABEL: @select_v_sle_fail(359; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0360; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])361; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], 0362; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])363; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i8 [[C]], [[V:%.*]]364; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]]365; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0366; CHECK-NEXT:    ret i1 [[R]]367;368  %ynz = icmp ne i8 %y, 0369  call void @llvm.assume(i1 %ynz)370  %pcond0 = icmp sge i8 %C, 0371  call void @llvm.assume(i1 %pcond0)372  %cmp = icmp sle i8 %C, %v373  %s = select i1 %cmp, i8 %v, i8 %y374  %r = icmp eq i8 %s, 0375  ret i1 %r376}377 378define i1 @inv_select_v_sle_nonneg(i8 %v, i8 %C, i8 %y) {379; CHECK-LABEL: @inv_select_v_sle_nonneg(380; CHECK-NEXT:    [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0381; CHECK-NEXT:    call void @llvm.assume(i1 [[YNZ]])382; CHECK-NEXT:    [[PCOND0:%.*]] = icmp sge i8 [[C:%.*]], 0383; CHECK-NEXT:    call void @llvm.assume(i1 [[PCOND0]])384; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i8 [[V:%.*]], [[C]]385; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[V]]386; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[S]], 0387; CHECK-NEXT:    ret i1 [[R]]388;389  %ynz = icmp ne i8 %y, 0390  call void @llvm.assume(i1 %ynz)391  %pcond0 = icmp sge i8 %C, 0392  call void @llvm.assume(i1 %pcond0)393  %cmp = icmp sle i8 %v, %C394  %s = select i1 %cmp, i8 %y, i8 %v395  %r = icmp eq i8 %s, 0396  ret i1 %r397}398 399; Check udiv/sdiv occuring before icmp.400define i64 @incorrect_safe_div_1(i64 %n, i64 %d) {401; CHECK-LABEL: @incorrect_safe_div_1(402; CHECK-NEXT:    [[TMP1:%.*]] = udiv i64 [[N:%.*]], [[D:%.*]]403; CHECK-NEXT:    ret i64 [[TMP1]]404;405  %1 = udiv i64 %n, %d406  %2 = icmp eq i64 %d, 0407  %3 = select i1 %2, i64 -1, i64 %1408  ret i64 %3409}410 411; Check icmp occuring before udiv/sdiv.412define i64 @incorrect_safe_div_2(i64 %n, i64 %d) {413; CHECK-LABEL: @incorrect_safe_div_2(414; CHECK-NEXT:    [[TMP1:%.*]] = sdiv i64 [[N:%.*]], [[D:%.*]]415; CHECK-NEXT:    ret i64 [[TMP1]]416;417  %1 = icmp eq i64 %d, 0418  %2 = sdiv i64 %n, %d419  %3 = select i1 %1, i64 -1, i64 %2420  ret i64 %3421}422 423define i64 @incorrect_safe_div_call_1(i64 %n, i64 %d) {424; CHECK-LABEL: @incorrect_safe_div_call_1(425; CHECK-NEXT:    [[TMP1:%.*]] = sdiv i64 [[N:%.*]], [[D:%.*]]426; CHECK-NEXT:    tail call void @use(i64 [[D]])427; CHECK-NEXT:    ret i64 [[TMP1]]428;429  %1 = sdiv i64 %n, %d430  tail call void @use(i64 %d)431  %2 = icmp eq i64 %d, 0432  %3 = select i1 %2, i64 -1, i64 %1433  ret i64 %3434}435 436define i64 @incorrect_safe_div_call_2(i64 %n, i64 %d) {437; CHECK-LABEL: @incorrect_safe_div_call_2(438; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i64 [[D:%.*]], 0439; CHECK-NEXT:    tail call void @use(i64 [[D]])440; CHECK-NEXT:    [[TMP2:%.*]] = udiv i64 [[N:%.*]], [[D]]441; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i64 -1, i64 [[TMP2]]442; CHECK-NEXT:    ret i64 [[TMP3]]443;444  %1 = icmp eq i64 %d, 0445  tail call void @use(i64 %d)446  %2 = udiv i64 %n, %d447  %3 = select i1 %1, i64 -1, i64 %2448  ret i64 %3449}450 451; https://alive2.llvm.org/ce/z/Si_B7b452define i4 @icmp_urem(i4 %n, i4 %d) {453; CHECK-LABEL: @icmp_urem(454; CHECK-NEXT:    [[TMP1:%.*]] = urem i4 [[N:%.*]], [[D:%.*]]455; CHECK-NEXT:    ret i4 [[TMP1]]456;457  %1 = icmp eq i4 %d, 0458  %2 = urem i4 %n, %d459  %3 = select i1 %1, i4 -1, i4 %2460  ret i4 %3461}462 463define i4 @icmp_urem_clobber_by_call(i4 %n, i4 %d) {464; CHECK-LABEL: @icmp_urem_clobber_by_call(465; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i4 [[D:%.*]], 0466; CHECK-NEXT:    tail call void @use4(i4 [[D]])467; CHECK-NEXT:    [[TMP2:%.*]] = urem i4 [[N:%.*]], [[D]]468; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i4 -1, i4 [[TMP2]]469; CHECK-NEXT:    ret i4 [[TMP3]]470;471  %1 = icmp eq i4 %d, 0472  tail call void @use4(i4 %d)473  %2 = urem i4 %n, %d474  %3 = select i1 %1, i4 -1, i4 %2475  ret i4 %3476}477 478; https://alive2.llvm.org/ce/z/Fn3Wac479define i4 @icmp_srem(i4 %n, i4 %d) {480; CHECK-LABEL: @icmp_srem(481; CHECK-NEXT:    [[TMP1:%.*]] = srem i4 [[N:%.*]], [[D:%.*]]482; CHECK-NEXT:    ret i4 [[TMP1]]483;484  %1 = icmp eq i4 %d, 0485  %2 = srem i4 %n, %d486  %3 = select i1 %1, i4 -1, i4 %2487  ret i4 %3488}489 490define i4 @icmp_srem_clobber_by_call(i4 %n, i4 %d) {491; CHECK-LABEL: @icmp_srem_clobber_by_call(492; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i4 [[D:%.*]], 0493; CHECK-NEXT:    tail call void @use4(i4 [[D]])494; CHECK-NEXT:    [[TMP2:%.*]] = srem i4 [[N:%.*]], [[D]]495; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i4 -1, i4 [[TMP2]]496; CHECK-NEXT:    ret i4 [[TMP3]]497;498  %1 = icmp eq i4 %d, 0499  tail call void @use4(i4 %d)500  %2 = srem i4 %n, %d501  %3 = select i1 %1, i4 -1, i4 %2502  ret i4 %3503}504