1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4declare void @use.i8(i8) 5define i1 @sdiv_exact_eq_0(i8 %x, i8 %y) { 6; CHECK-LABEL: @sdiv_exact_eq_0( 7; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[X:%.*]], 0 8; CHECK-NEXT: ret i1 [[R]] 9; 10 %d = sdiv exact i8 %x, %y 11 %r = icmp eq i8 %d, 0 12 ret i1 %r 13} 14 15define i1 @udiv_exact_ne_0(i8 %x, i8 %y) { 16; CHECK-LABEL: @udiv_exact_ne_0( 17; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[X:%.*]], 0 18; CHECK-NEXT: ret i1 [[R]] 19; 20 %d = udiv exact i8 %x, %y 21 %r = icmp ne i8 %d, 0 22 ret i1 %r 23} 24 25define i1 @sdiv_exact_ne_1(i8 %x, i8 %y) { 26; CHECK-LABEL: @sdiv_exact_ne_1( 27; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[X:%.*]], 0 28; CHECK-NEXT: ret i1 [[R]] 29; 30 %d = sdiv exact i8 %x, %y 31 %r = icmp eq i8 %d, 0 32 ret i1 %r 33} 34 35define i1 @udiv_exact_eq_1(i8 %x, i8 %y) { 36; CHECK-LABEL: @udiv_exact_eq_1( 37; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]] 38; CHECK-NEXT: ret i1 [[R]] 39; 40 %d = udiv exact i8 %x, %y 41 %r = icmp ne i8 %d, 1 42 ret i1 %r 43} 44 45define i1 @sdiv_exact_eq_9_no_of(i8 %x, i8 %y) { 46; CHECK-LABEL: @sdiv_exact_eq_9_no_of( 47; CHECK-NEXT: [[YY:%.*]] = and i8 [[Y:%.*]], 7 48; CHECK-NEXT: [[TMP1:%.*]] = mul nuw nsw i8 [[YY]], 9 49; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[TMP1]], [[X:%.*]] 50; CHECK-NEXT: ret i1 [[R]] 51; 52 %yy = and i8 %y, 7 53 %d = sdiv exact i8 %x, %yy 54 %r = icmp eq i8 %d, 9 55 ret i1 %r 56} 57 58define i1 @sdiv_exact_eq_9_may_of(i8 %x, i8 %y) { 59; CHECK-LABEL: @sdiv_exact_eq_9_may_of( 60; CHECK-NEXT: [[D:%.*]] = sdiv exact i8 [[X:%.*]], [[Y:%.*]] 61; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[D]], 9 62; CHECK-NEXT: ret i1 [[R]] 63; 64 %d = sdiv exact i8 %x, %y 65 %r = icmp eq i8 %d, 9 66 ret i1 %r 67} 68 69define i1 @sdiv_exact_eq_9_no_of_fail_multiuse(i8 %x, i8 %y) { 70; CHECK-LABEL: @sdiv_exact_eq_9_no_of_fail_multiuse( 71; CHECK-NEXT: [[YY:%.*]] = and i8 [[Y:%.*]], 7 72; CHECK-NEXT: [[D:%.*]] = sdiv exact i8 [[X:%.*]], [[YY]] 73; CHECK-NEXT: call void @use.i8(i8 [[D]]) 74; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[D]], 9 75; CHECK-NEXT: ret i1 [[R]] 76; 77 %yy = and i8 %y, 7 78 %d = sdiv exact i8 %x, %yy 79 call void @use.i8(i8 %d) 80 %r = icmp eq i8 %d, 9 81 ret i1 %r 82} 83 84define i1 @sdiv_exact_eq_9_must_of_todo_is_false(i8 %x, i8 %y) { 85; CHECK-LABEL: @sdiv_exact_eq_9_must_of_todo_is_false( 86; CHECK-NEXT: [[YY:%.*]] = or i8 [[Y:%.*]], 55 87; CHECK-NEXT: [[D:%.*]] = sdiv exact i8 [[X:%.*]], [[YY]] 88; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[D]], 9 89; CHECK-NEXT: ret i1 [[R]] 90; 91 %yy = or i8 %y, 55 92 %d = sdiv exact i8 %x, %yy 93 %r = icmp eq i8 %d, 9 94 ret i1 %r 95} 96 97define i1 @udiv_exact_ne_30_no_of(i8 %x, i8 %y) { 98; CHECK-LABEL: @udiv_exact_ne_30_no_of( 99; CHECK-NEXT: [[YY:%.*]] = and i8 [[Y:%.*]], 7 100; CHECK-NEXT: [[TMP1:%.*]] = mul nuw i8 [[YY]], 30 101; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[TMP1]], [[X:%.*]] 102; CHECK-NEXT: ret i1 [[R]] 103; 104 %yy = and i8 %y, 7 105 %d = udiv exact i8 %x, %yy 106 %r = icmp ne i8 %d, 30 107 ret i1 %r 108} 109