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