151 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=instcombine < %s | FileCheck %s3 4define i1 @sdiv_by_zero_indirect_is_poison(i1 %c, i1 %x, i1 %y) {5; CHECK-LABEL: @sdiv_by_zero_indirect_is_poison(6; CHECK-NEXT: br i1 [[C:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]7; CHECK: true:8; CHECK-NEXT: br label [[DONE:%.*]]9; CHECK: false:10; CHECK-NEXT: br label [[DONE]]11; CHECK: done:12; CHECK-NEXT: ret i1 poison13;14 br i1 %c, label %true, label %false15true:16 %y_true = and i1 %y, 017 br label %done18false:19 %y_false = and i1 %y, 020 br label %done21done:22 %yy = phi i1 [ %y_false, %false ], [ %y_true, %true ]23 %r = sdiv i1 %x, %yy24 ret i1 %r25}26 27define i1 @udiv_by_zero_indirect_is_poison(i1 %c, i1 %x, i1 %y) {28; CHECK-LABEL: @udiv_by_zero_indirect_is_poison(29; CHECK-NEXT: br i1 [[C:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]30; CHECK: true:31; CHECK-NEXT: br label [[DONE:%.*]]32; CHECK: false:33; CHECK-NEXT: br label [[DONE]]34; CHECK: done:35; CHECK-NEXT: ret i1 poison36;37 br i1 %c, label %true, label %false38true:39 %y_true = and i1 %y, 040 br label %done41false:42 %y_false = and i1 %y, 043 br label %done44done:45 %yy = phi i1 [ %y_false, %false ], [ %y_true, %true ]46 %r = udiv i1 %x, %yy47 ret i1 %r48}49 50define i1 @srem_by_zero_indirect_is_poison(i1 %c, i1 %x, i1 %y) {51; CHECK-LABEL: @srem_by_zero_indirect_is_poison(52; CHECK-NEXT: br i1 [[C:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]53; CHECK: true:54; CHECK-NEXT: br label [[DONE:%.*]]55; CHECK: false:56; CHECK-NEXT: br label [[DONE]]57; CHECK: done:58; CHECK-NEXT: ret i1 poison59;60 br i1 %c, label %true, label %false61true:62 %y_true = and i1 %y, 063 br label %done64false:65 %y_false = and i1 %y, 066 br label %done67done:68 %yy = phi i1 [ %y_false, %false ], [ %y_true, %true ]69 %r = srem i1 %x, %yy70 ret i1 %r71}72 73define i1 @urem_by_zero_indirect_is_poison(i1 %c, i1 %x, i1 %y) {74; CHECK-LABEL: @urem_by_zero_indirect_is_poison(75; CHECK-NEXT: br i1 [[C:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]76; CHECK: true:77; CHECK-NEXT: br label [[DONE:%.*]]78; CHECK: false:79; CHECK-NEXT: br label [[DONE]]80; CHECK: done:81; CHECK-NEXT: ret i1 poison82;83 br i1 %c, label %true, label %false84true:85 %y_true = and i1 %y, 086 br label %done87false:88 %y_false = and i1 %y, 089 br label %done90done:91 %yy = phi i1 [ %y_false, %false ], [ %y_true, %true ]92 %r = urem i1 %x, %yy93 ret i1 %r94}95 96define i1 @sdiv_i1_is_op0(i1 %x, i1 %y) {97; CHECK-LABEL: @sdiv_i1_is_op0(98; CHECK-NEXT: ret i1 [[X:%.*]]99;100 %r = sdiv i1 %x, %y101 ret i1 %r102}103 104define i1 @udiv_i1_is_op0(i1 %x, i1 %y) {105; CHECK-LABEL: @udiv_i1_is_op0(106; CHECK-NEXT: ret i1 [[X:%.*]]107;108 %r = udiv i1 %x, %y109 ret i1 %r110}111 112define i1 @srem_i1_is_zero(i1 %x, i1 %y) {113; CHECK-LABEL: @srem_i1_is_zero(114; CHECK-NEXT: ret i1 false115;116 %r = srem i1 %x, %y117 ret i1 %r118}119 120define i1 @urem_i1_is_zero(i1 %x, i1 %y) {121; CHECK-LABEL: @urem_i1_is_zero(122; CHECK-NEXT: ret i1 false123;124 %r = urem i1 %x, %y125 ret i1 %r126}127 128declare void @llvm.assume(i1 noundef)129 130define i1 @pt62607() {131; CHECK-LABEL: @pt62607(132; CHECK-NEXT: entry_1:133; CHECK-NEXT: br label [[LOOP_5:%.*]]134; CHECK: loop_5:135; CHECK-NEXT: br i1 poison, label [[LOOP_5]], label [[LOOP_EXIT_8:%.*]]136; CHECK: loop_exit_8:137; CHECK-NEXT: ret i1 false138;139entry_1:140 %val_i1_38 = trunc i8 109 to i1141 br label %loop_5142loop_5: ; preds = %loop_5, %entry_1143 %loop_cnt_i1_26.0 = phi i1 [ false, %entry_1 ], [ %val_i1_55, %loop_5 ]144 %val_i1_55 = add i1 %loop_cnt_i1_26.0, true145 call void @llvm.assume(i1 %val_i1_55)146 %val_i1_67 = udiv i1 %val_i1_38, %loop_cnt_i1_26.0147 br i1 %val_i1_67, label %loop_5, label %loop_exit_8148loop_exit_8: ; preds = %loop_5149 ret i1 false150}151