1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -passes=instcombine < %s | FileCheck %s 3 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 poison 13; 14 br i1 %c, label %true, label %false 15true: 16 %y_true = and i1 %y, 0 17 br label %done 18false: 19 %y_false = and i1 %y, 0 20 br label %done 21done: 22 %yy = phi i1 [ %y_false, %false ], [ %y_true, %true ] 23 %r = sdiv i1 %x, %yy 24 ret i1 %r 25} 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 poison 36; 37 br i1 %c, label %true, label %false 38true: 39 %y_true = and i1 %y, 0 40 br label %done 41false: 42 %y_false = and i1 %y, 0 43 br label %done 44done: 45 %yy = phi i1 [ %y_false, %false ], [ %y_true, %true ] 46 %r = udiv i1 %x, %yy 47 ret i1 %r 48} 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 poison 59; 60 br i1 %c, label %true, label %false 61true: 62 %y_true = and i1 %y, 0 63 br label %done 64false: 65 %y_false = and i1 %y, 0 66 br label %done 67done: 68 %yy = phi i1 [ %y_false, %false ], [ %y_true, %true ] 69 %r = srem i1 %x, %yy 70 ret i1 %r 71} 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 poison 82; 83 br i1 %c, label %true, label %false 84true: 85 %y_true = and i1 %y, 0 86 br label %done 87false: 88 %y_false = and i1 %y, 0 89 br label %done 90done: 91 %yy = phi i1 [ %y_false, %false ], [ %y_true, %true ] 92 %r = urem i1 %x, %yy 93 ret i1 %r 94} 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, %y 101 ret i1 %r 102} 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, %y 109 ret i1 %r 110} 111 112define i1 @srem_i1_is_zero(i1 %x, i1 %y) { 113; CHECK-LABEL: @srem_i1_is_zero( 114; CHECK-NEXT: ret i1 false 115; 116 %r = srem i1 %x, %y 117 ret i1 %r 118} 119 120define i1 @urem_i1_is_zero(i1 %x, i1 %y) { 121; CHECK-LABEL: @urem_i1_is_zero( 122; CHECK-NEXT: ret i1 false 123; 124 %r = urem i1 %x, %y 125 ret i1 %r 126} 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 false 138; 139entry_1: 140 %val_i1_38 = trunc i8 109 to i1 141 br label %loop_5 142loop_5: ; preds = %loop_5, %entry_1 143 %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, true 145 call void @llvm.assume(i1 %val_i1_55) 146 %val_i1_67 = udiv i1 %val_i1_38, %loop_cnt_i1_26.0 147 br i1 %val_i1_67, label %loop_5, label %loop_exit_8 148loop_exit_8: ; preds = %loop_5 149 ret i1 false 150} 151