1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4define i8 @urem_low_bits_know(i8 %xx, i8 %yy) { 5; CHECK-LABEL: @urem_low_bits_know( 6; CHECK-NEXT: ret i8 2 7; 8 %x = or i8 %xx, 2 9 %y = and i8 %yy, -4 10 %rem = urem i8 %x, %y 11 %r = and i8 %rem, 2 12 ret i8 %r 13} 14 15define i8 @urem_high_bits_know(i8 %xx, i8 %yy) { 16; CHECK-LABEL: @urem_high_bits_know( 17; CHECK-NEXT: ret i8 0 18; 19 %x = and i8 %xx, 2 20 %y = and i8 %yy, -4 21 %rem = urem i8 %x, %y 22 %r = and i8 %rem, 8 23 ret i8 %r 24} 25 26define i8 @urem_low_bits_know2(i8 %xx, i8 %yy) { 27; CHECK-LABEL: @urem_low_bits_know2( 28; CHECK-NEXT: ret i8 2 29; 30 %xo = or i8 %xx, 2 31 %x = and i8 %xo, 254 32 %y = and i8 %yy, -4 33 %rem = urem i8 %x, %y 34 %r = and i8 %rem, 3 35 ret i8 %r 36} 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:%.*]], 2 41; CHECK-NEXT: [[Y:%.*]] = and i8 [[YY:%.*]], -4 42; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], [[Y]] 43; CHECK-NEXT: [[R:%.*]] = and i8 [[REM]], 3 44; CHECK-NEXT: ret i8 [[R]] 45; 46 %x = or i8 %xx, 2 47 %y = and i8 %yy, -4 48 %rem = urem i8 %x, %y 49 %r = and i8 %rem, 3 50 ret i8 %r 51} 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:%.*]], 4 56; CHECK-NEXT: [[Y:%.*]] = and i8 [[YY:%.*]], -4 57; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], [[Y]] 58; CHECK-NEXT: [[R:%.*]] = and i8 [[REM]], 2 59; CHECK-NEXT: ret i8 [[R]] 60; 61 %x = or i8 %xx, 4 62 %y = and i8 %yy, -4 63 %rem = urem i8 %x, %y 64 %r = and i8 %rem, 2 65 ret i8 %r 66} 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:%.*]], 1 71; CHECK-NEXT: [[Y:%.*]] = and i8 [[YY:%.*]], -5 72; CHECK-NEXT: [[REM:%.*]] = urem i8 [[X]], [[Y]] 73; CHECK-NEXT: [[R:%.*]] = and i8 [[REM]], 2 74; CHECK-NEXT: ret i8 [[R]] 75; 76 %x = or i8 %xx, 1 77 %y = and i8 %yy, -5 78 %rem = urem i8 %x, %y 79 %r = and i8 %rem, 2 80 ret i8 %r 81} 82 83define i8 @srem_low_bits_know(i8 %xx, i8 %yy) { 84; CHECK-LABEL: @srem_low_bits_know( 85; CHECK-NEXT: ret i8 2 86; 87 %x = or i8 %xx, 10 88 %y = and i8 %yy, -4 89 %rem = srem i8 %x, %y 90 %r = and i8 %rem, 2 91 ret i8 %r 92} 93 94define i8 @srem_low_bits_know2(i8 %xx, i8 %yy) { 95; CHECK-LABEL: @srem_low_bits_know2( 96; CHECK-NEXT: ret i8 1 97; 98 %x = or i8 %xx, 1 99 %y = and i8 %yy, -2 100 %rem = srem i8 %x, %y 101 %r = and i8 %rem, 1 102 ret i8 %r 103} 104 105define i8 @srem_high_bits_know(i8 %xx, i8 %yy) { 106; CHECK-LABEL: @srem_high_bits_know( 107; CHECK-NEXT: ret i8 -2 108; 109 %x = or i8 %xx, -2 110 %y = and i8 %yy, -4 111 %rem = srem i8 %x, %y 112 %r = and i8 %rem, -2 113 ret i8 %r 114} 115 116define i8 @srem_high_bits_know2(i8 %xx, i8 %yy) { 117; CHECK-LABEL: @srem_high_bits_know2( 118; CHECK-NEXT: ret i8 0 119; 120 %x = and i8 %xx, 13 121 %y = or i8 %yy, -4 122 %rem = srem i8 %x, %y 123 %r = and i8 %rem, 8 124 ret i8 %r 125} 126 127define i8 @srem_high_bits_know3(i8 %xx, i8 %yy) { 128; CHECK-LABEL: @srem_high_bits_know3( 129; CHECK-NEXT: ret i8 8 130; 131 %x = or i8 %xx, -13 132 %y = and i8 %yy, 4 133 %rem = srem i8 %x, %y 134 %r = and i8 %rem, 8 135 ret i8 %r 136} 137 138define i8 @srem_high_bits_know4(i8 %xx, i8 %yy) { 139; CHECK-LABEL: @srem_high_bits_know4( 140; CHECK-NEXT: ret i8 0 141; 142 %x = and i8 %xx, 4 143 %y = or i8 %yy, -13 144 %rem = srem i8 %x, %y 145 %r = and i8 %rem, 8 146 ret i8 %r 147} 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:%.*]], 2 152; CHECK-NEXT: ret i8 [[X]] 153; 154 %x = and i8 %xx, 2 155 %y = and i8 %yy, 4 156 %rem = srem i8 %x, %y 157 %r = and i8 %rem, 2 158 ret i8 %r 159} 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:%.*]], 10 164; CHECK-NEXT: [[Y:%.*]] = and i8 [[YY:%.*]], -4 165; CHECK-NEXT: [[REM:%.*]] = srem i8 [[X]], [[Y]] 166; CHECK-NEXT: [[R:%.*]] = and i8 [[REM]], 3 167; CHECK-NEXT: ret i8 [[R]] 168; 169 %x = or i8 %xx, 10 170 %y = and i8 %yy, -4 171 %rem = srem i8 %x, %y 172 %r = and i8 %rem, 3 173 ret i8 %r 174} 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:%.*]], 4 179; CHECK-NEXT: [[Y:%.*]] = and i8 [[YY:%.*]], -4 180; CHECK-NEXT: [[REM:%.*]] = srem i8 [[X]], [[Y]] 181; CHECK-NEXT: [[R:%.*]] = and i8 [[REM]], 2 182; CHECK-NEXT: ret i8 [[R]] 183; 184 %x = or i8 %xx, 4 185 %y = and i8 %yy, -4 186 %rem = srem i8 %x, %y 187 %r = and i8 %rem, 2 188 ret i8 %r 189} 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:%.*]], 3 194; CHECK-NEXT: [[Y:%.*]] = and i8 [[YY:%.*]], -6 195; CHECK-NEXT: [[REM:%.*]] = srem i8 [[X]], [[Y]] 196; CHECK-NEXT: [[R:%.*]] = and i8 [[REM]], 2 197; CHECK-NEXT: ret i8 [[R]] 198; 199 %x = or i8 %xx, 3 200 %y = and i8 %yy, -6 201 %rem = srem i8 %x, %y 202 %r = and i8 %rem, 2 203 ret i8 %r 204} 205