205 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define i8 @urem_low_bits_know(i8 %xx, i8 %yy) {5; CHECK-LABEL: @urem_low_bits_know(6; CHECK-NEXT: ret i8 27;8 %x = or i8 %xx, 29 %y = and i8 %yy, -410 %rem = urem i8 %x, %y11 %r = and i8 %rem, 212 ret i8 %r13}14 15define i8 @urem_high_bits_know(i8 %xx, i8 %yy) {16; CHECK-LABEL: @urem_high_bits_know(17; CHECK-NEXT: ret i8 018;19 %x = and i8 %xx, 220 %y = and i8 %yy, -421 %rem = urem i8 %x, %y22 %r = and i8 %rem, 823 ret i8 %r24}25 26define i8 @urem_low_bits_know2(i8 %xx, i8 %yy) {27; CHECK-LABEL: @urem_low_bits_know2(28; CHECK-NEXT: ret i8 229;30 %xo = or i8 %xx, 231 %x = and i8 %xo, 25432 %y = and i8 %yy, -433 %rem = urem i8 %x, %y34 %r = and i8 %rem, 335 ret i8 %r36}37 38define i8 @urem_todo_low_bits_partially_know_should_fold_out_urem(i8 %xx, i8 %yy) {39; CHECK-LABEL: @urem_todo_low_bits_partially_know_should_fold_out_urem(40; CHECK-NEXT: [[X:%.*]] = or i8 [[XX:%.*]], 241; CHECK-NEXT: [[Y:%.*]] = and i8 [[YY:%.*]], -442; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], [[Y]]43; CHECK-NEXT: [[R:%.*]] = and i8 [[REM]], 344; CHECK-NEXT: ret i8 [[R]]45;46 %x = or i8 %xx, 247 %y = and i8 %yy, -448 %rem = urem i8 %x, %y49 %r = and i8 %rem, 350 ret i8 %r51}52 53define i8 @urem_fail_low_bits_unknown(i8 %xx, i8 %yy) {54; CHECK-LABEL: @urem_fail_low_bits_unknown(55; CHECK-NEXT: [[X:%.*]] = or i8 [[XX:%.*]], 456; CHECK-NEXT: [[Y:%.*]] = and i8 [[YY:%.*]], -457; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], [[Y]]58; CHECK-NEXT: [[R:%.*]] = and i8 [[REM]], 259; CHECK-NEXT: ret i8 [[R]]60;61 %x = or i8 %xx, 462 %y = and i8 %yy, -463 %rem = urem i8 %x, %y64 %r = and i8 %rem, 265 ret i8 %r66}67 68define i8 @urem_fail_low_bits_unknown2(i8 %xx, i8 %yy) {69; CHECK-LABEL: @urem_fail_low_bits_unknown2(70; CHECK-NEXT: [[X:%.*]] = or i8 [[XX:%.*]], 171; CHECK-NEXT: [[Y:%.*]] = and i8 [[YY:%.*]], -572; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], [[Y]]73; CHECK-NEXT: [[R:%.*]] = and i8 [[REM]], 274; CHECK-NEXT: ret i8 [[R]]75;76 %x = or i8 %xx, 177 %y = and i8 %yy, -578 %rem = urem i8 %x, %y79 %r = and i8 %rem, 280 ret i8 %r81}82 83define i8 @srem_low_bits_know(i8 %xx, i8 %yy) {84; CHECK-LABEL: @srem_low_bits_know(85; CHECK-NEXT: ret i8 286;87 %x = or i8 %xx, 1088 %y = and i8 %yy, -489 %rem = srem i8 %x, %y90 %r = and i8 %rem, 291 ret i8 %r92}93 94define i8 @srem_low_bits_know2(i8 %xx, i8 %yy) {95; CHECK-LABEL: @srem_low_bits_know2(96; CHECK-NEXT: ret i8 197;98 %x = or i8 %xx, 199 %y = and i8 %yy, -2100 %rem = srem i8 %x, %y101 %r = and i8 %rem, 1102 ret i8 %r103}104 105define i8 @srem_high_bits_know(i8 %xx, i8 %yy) {106; CHECK-LABEL: @srem_high_bits_know(107; CHECK-NEXT: ret i8 -2108;109 %x = or i8 %xx, -2110 %y = and i8 %yy, -4111 %rem = srem i8 %x, %y112 %r = and i8 %rem, -2113 ret i8 %r114}115 116define i8 @srem_high_bits_know2(i8 %xx, i8 %yy) {117; CHECK-LABEL: @srem_high_bits_know2(118; CHECK-NEXT: ret i8 0119;120 %x = and i8 %xx, 13121 %y = or i8 %yy, -4122 %rem = srem i8 %x, %y123 %r = and i8 %rem, 8124 ret i8 %r125}126 127define i8 @srem_high_bits_know3(i8 %xx, i8 %yy) {128; CHECK-LABEL: @srem_high_bits_know3(129; CHECK-NEXT: ret i8 8130;131 %x = or i8 %xx, -13132 %y = and i8 %yy, 4133 %rem = srem i8 %x, %y134 %r = and i8 %rem, 8135 ret i8 %r136}137 138define i8 @srem_high_bits_know4(i8 %xx, i8 %yy) {139; CHECK-LABEL: @srem_high_bits_know4(140; CHECK-NEXT: ret i8 0141;142 %x = and i8 %xx, 4143 %y = or i8 %yy, -13144 %rem = srem i8 %x, %y145 %r = and i8 %rem, 8146 ret i8 %r147}148 149define i8 @srem_high_bits_know5(i8 %xx, i8 %yy) {150; CHECK-LABEL: @srem_high_bits_know5(151; CHECK-NEXT: [[X:%.*]] = and i8 [[XX:%.*]], 2152; CHECK-NEXT: ret i8 [[X]]153;154 %x = and i8 %xx, 2155 %y = and i8 %yy, 4156 %rem = srem i8 %x, %y157 %r = and i8 %rem, 2158 ret i8 %r159}160 161define i8 @srem_todo_low_bits_partially_know_should_fold_out_srem(i8 %xx, i8 %yy) {162; CHECK-LABEL: @srem_todo_low_bits_partially_know_should_fold_out_srem(163; CHECK-NEXT: [[X:%.*]] = or i8 [[XX:%.*]], 10164; CHECK-NEXT: [[Y:%.*]] = and i8 [[YY:%.*]], -4165; CHECK-NEXT: [[REM:%.*]] = srem i8 [[X]], [[Y]]166; CHECK-NEXT: [[R:%.*]] = and i8 [[REM]], 3167; CHECK-NEXT: ret i8 [[R]]168;169 %x = or i8 %xx, 10170 %y = and i8 %yy, -4171 %rem = srem i8 %x, %y172 %r = and i8 %rem, 3173 ret i8 %r174}175 176define i8 @srem_fail_low_bits_unknown(i8 %xx, i8 %yy) {177; CHECK-LABEL: @srem_fail_low_bits_unknown(178; CHECK-NEXT: [[X:%.*]] = or i8 [[XX:%.*]], 4179; CHECK-NEXT: [[Y:%.*]] = and i8 [[YY:%.*]], -4180; CHECK-NEXT: [[REM:%.*]] = srem i8 [[X]], [[Y]]181; CHECK-NEXT: [[R:%.*]] = and i8 [[REM]], 2182; CHECK-NEXT: ret i8 [[R]]183;184 %x = or i8 %xx, 4185 %y = and i8 %yy, -4186 %rem = srem i8 %x, %y187 %r = and i8 %rem, 2188 ret i8 %r189}190 191define i8 @srem_fail_irrelivent_bits_known(i8 %xx, i8 %yy) {192; CHECK-LABEL: @srem_fail_irrelivent_bits_known(193; CHECK-NEXT: [[X:%.*]] = or i8 [[XX:%.*]], 3194; CHECK-NEXT: [[Y:%.*]] = and i8 [[YY:%.*]], -6195; CHECK-NEXT: [[REM:%.*]] = srem i8 [[X]], [[Y]]196; CHECK-NEXT: [[R:%.*]] = and i8 [[REM]], 2197; CHECK-NEXT: ret i8 [[R]]198;199 %x = or i8 %xx, 3200 %y = and i8 %yy, -6201 %rem = srem i8 %x, %y202 %r = and i8 %rem, 2203 ret i8 %r204}205