1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=instsimplify < %s -S | FileCheck %s 3 4define i1 @shl_C_X_ugt(i8 %x) { 5; CHECK-LABEL: @shl_C_X_ugt( 6; CHECK-NEXT: ret i1 false 7; 8 %shl = shl i8 7, %x 9 %r = icmp ugt i8 %shl, 224 10 ret i1 %r 11} 12 13define i1 @shl_C_X_ugt2(i8 %x) { 14; CHECK-LABEL: @shl_C_X_ugt2( 15; CHECK-NEXT: ret i1 false 16; 17 %shl = shl i8 5, %x 18 %r = icmp ugt i8 %shl, 192 19 ret i1 %r 20} 21 22define i1 @shl_C_X_ugt_fail(i8 %x) { 23; CHECK-LABEL: @shl_C_X_ugt_fail( 24; CHECK-NEXT: [[SHL:%.*]] = shl i8 1, [[X:%.*]] 25; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[SHL]], 127 26; CHECK-NEXT: ret i1 [[R]] 27; 28 %shl = shl i8 1, %x 29 %r = icmp ugt i8 %shl, 127 30 ret i1 %r 31} 32 33define i1 @shl_C_X_ugt_fail2(i8 %x) { 34; CHECK-LABEL: @shl_C_X_ugt_fail2( 35; CHECK-NEXT: [[SHL:%.*]] = shl i8 3, [[X:%.*]] 36; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[SHL]], -66 37; CHECK-NEXT: ret i1 [[R]] 38; 39 %shl = shl i8 3, %x 40 %r = icmp ugt i8 %shl, 190 41 ret i1 %r 42} 43 44define i1 @shl_C_X_ugt_fail3(i8 %x) { 45; CHECK-LABEL: @shl_C_X_ugt_fail3( 46; CHECK-NEXT: [[SHL:%.*]] = shl i8 -1, [[X:%.*]] 47; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[SHL]], -2 48; CHECK-NEXT: ret i1 [[R]] 49; 50 %shl = shl i8 -1, %x 51 %r = icmp ugt i8 %shl, 254 52 ret i1 %r 53} 54 55define i1 @shl_C_X_ugt_todo(i8 %x) { 56; CHECK-LABEL: @shl_C_X_ugt_todo( 57; CHECK-NEXT: [[SHL:%.*]] = shl i8 -127, [[X:%.*]] 58; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[SHL]], -116 59; CHECK-NEXT: ret i1 [[R]] 60; 61 %shl = shl i8 129, %x 62 %r = icmp ugt i8 %shl, 140 63 ret i1 %r 64} 65 66define i1 @shl_X_C_ugt(i8 %x) { 67; CHECK-LABEL: @shl_X_C_ugt( 68; CHECK-NEXT: ret i1 false 69; 70 %shl = shl i8 %x, 6 71 %r = icmp ugt i8 %shl, 192 72 ret i1 %r 73} 74 75define i1 @shl_X_C_ugt_fail(i8 %x) { 76; CHECK-LABEL: @shl_X_C_ugt_fail( 77; CHECK-NEXT: [[SHL:%.*]] = shl i8 [[X:%.*]], 6 78; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[SHL]], -65 79; CHECK-NEXT: ret i1 [[R]] 80; 81 %shl = shl i8 %x, 6 82 %r = icmp ugt i8 %shl, 191 83 ret i1 %r 84} 85 86define i1 @shl_X_C_ugt_fail2(i8 %x) { 87; CHECK-LABEL: @shl_X_C_ugt_fail2( 88; CHECK-NEXT: [[SHL:%.*]] = shl i8 [[X:%.*]], 5 89; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[SHL]], -64 90; CHECK-NEXT: ret i1 [[R]] 91; 92 %shl = shl i8 %x, 5 93 %r = icmp ugt i8 %shl, 192 94 ret i1 %r 95} 96 97define i1 @and_ugt(i8 %xx) { 98; CHECK-LABEL: @and_ugt( 99; CHECK-NEXT: ret i1 false 100; 101 %x = mul i8 %xx, %xx ; thwart complexity-based canonicalization 102 %negx = sub i8 0, %x 103 %x_p2 = and i8 %negx, %x 104 %r = icmp ugt i8 %x_p2, 128 105 ret i1 %r 106} 107 108define i1 @and_ugt2(i8 %xx) { 109; CHECK-LABEL: @and_ugt2( 110; CHECK-NEXT: ret i1 false 111; 112 %x = mul i8 %xx, %xx ; thwart complexity-based canonicalization 113 %negx = sub i8 0, %x 114 %x_p2 = and i8 %x, %negx 115 %r = icmp ugt i8 %x_p2, 128 116 ret i1 %r 117} 118 119define i1 @and_ugt_fail(i8 %xx) { 120; CHECK-LABEL: @and_ugt_fail( 121; CHECK-NEXT: [[X:%.*]] = mul i8 [[XX:%.*]], [[XX]] 122; CHECK-NEXT: [[NEGX:%.*]] = sub i8 0, [[X]] 123; CHECK-NEXT: [[X_P2:%.*]] = and i8 [[X]], [[NEGX]] 124; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[X_P2]], 127 125; CHECK-NEXT: ret i1 [[R]] 126; 127 %x = mul i8 %xx, %xx ; thwart complexity-based canonicalization 128 %negx = sub i8 0, %x 129 %x_p2 = and i8 %x, %negx 130 %r = icmp ugt i8 %x_p2, 127 131 ret i1 %r 132} 133 134define i1 @urem_okay(i8 %x) { 135; CHECK-LABEL: @urem_okay( 136; CHECK-NEXT: ret i1 true 137; 138 %val = urem i8 34, %x 139 %r = icmp ule i8 %val, 35 140 ret i1 %r 141} 142 143define i1 @urem_fail(i8 %x) { 144; CHECK-LABEL: @urem_fail( 145; CHECK-NEXT: [[VAL:%.*]] = urem i8 34, [[X:%.*]] 146; CHECK-NEXT: [[R:%.*]] = icmp ule i8 [[VAL]], 33 147; CHECK-NEXT: ret i1 [[R]] 148; 149 %val = urem i8 34, %x 150 %r = icmp ule i8 %val, 33 151 ret i1 %r 152} 153 154define i1 @srem_posC_okay0(i8 %x) { 155; CHECK-LABEL: @srem_posC_okay0( 156; CHECK-NEXT: ret i1 true 157; 158 %val = srem i8 34, %x 159 %r = icmp sle i8 %val, 34 160 ret i1 %r 161} 162 163define i1 @srem_posC_okay1(i8 %x) { 164; CHECK-LABEL: @srem_posC_okay1( 165; CHECK-NEXT: ret i1 true 166; 167 %val = srem i8 34, %x 168 %r = icmp sge i8 %val, -3 169 ret i1 %r 170} 171 172define i1 @srem_negC_okay0(i8 %x) { 173; CHECK-LABEL: @srem_negC_okay0( 174; CHECK-NEXT: ret i1 true 175; 176 %val = srem i8 -34, %x 177 %r = icmp sle i8 %val, 0 178 ret i1 %r 179} 180 181define i1 @srem_negC_okay1(i8 %x) { 182; CHECK-LABEL: @srem_negC_okay1( 183; CHECK-NEXT: ret i1 true 184; 185 %val = srem i8 -34, %x 186 %r = icmp sge i8 %val, -34 187 ret i1 %r 188} 189 190define i1 @srem_posC_fail0(i8 %x) { 191; CHECK-LABEL: @srem_posC_fail0( 192; CHECK-NEXT: [[VAL:%.*]] = srem i8 34, [[X:%.*]] 193; CHECK-NEXT: [[R:%.*]] = icmp sle i8 [[VAL]], 32 194; CHECK-NEXT: ret i1 [[R]] 195; 196 %val = srem i8 34, %x 197 %r = icmp sle i8 %val, 32 198 ret i1 %r 199} 200 201define i1 @srem_posC_fail1(i8 %x) { 202; CHECK-LABEL: @srem_posC_fail1( 203; CHECK-NEXT: [[VAL:%.*]] = srem i8 34, [[X:%.*]] 204; CHECK-NEXT: [[R:%.*]] = icmp sge i8 [[VAL]], 1 205; CHECK-NEXT: ret i1 [[R]] 206; 207 %val = srem i8 34, %x 208 %r = icmp sge i8 %val, 1 209 ret i1 %r 210} 211 212define i1 @srem_negC_fail0(i8 %x) { 213; CHECK-LABEL: @srem_negC_fail0( 214; CHECK-NEXT: [[VAL:%.*]] = srem i8 -34, [[X:%.*]] 215; CHECK-NEXT: [[R:%.*]] = icmp sle i8 [[VAL]], -1 216; CHECK-NEXT: ret i1 [[R]] 217; 218 %val = srem i8 -34, %x 219 %r = icmp sle i8 %val, -1 220 ret i1 %r 221} 222 223define i1 @srem_negC_fail1(i8 %x) { 224; CHECK-LABEL: @srem_negC_fail1( 225; CHECK-NEXT: [[VAL:%.*]] = srem i8 -34, [[X:%.*]] 226; CHECK-NEXT: [[R:%.*]] = icmp sge i8 [[VAL]], -33 227; CHECK-NEXT: ret i1 [[R]] 228; 229 %val = srem i8 -34, %x 230 %r = icmp sge i8 %val, -33 231 ret i1 %r 232} 233