1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-p1:16:16:16-p2:32:32:32-p3:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @lshr_eq_msb_low_last_zero 6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ugt i8 %a, 6 7*9880d681SAndroid Build Coastguard Workerdefine i1 @lshr_eq_msb_low_last_zero(i8 %a) { 8*9880d681SAndroid Build Coastguard Worker %shr = lshr i8 127, %a 9*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, 0 10*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ashr_eq_msb_low_second_zero 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ugt i8 %a, 6 15*9880d681SAndroid Build Coastguard Workerdefine i1 @ashr_eq_msb_low_second_zero(i8 %a) { 16*9880d681SAndroid Build Coastguard Worker %shr = ashr i8 127, %a 17*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, 0 18*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @lshr_ne_msb_low_last_zero 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ult i8 %a, 7 23*9880d681SAndroid Build Coastguard Workerdefine i1 @lshr_ne_msb_low_last_zero(i8 %a) { 24*9880d681SAndroid Build Coastguard Worker %shr = lshr i8 127, %a 25*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, 0 26*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ashr_ne_msb_low_second_zero 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ult i8 %a, 7 31*9880d681SAndroid Build Coastguard Workerdefine i1 @ashr_ne_msb_low_second_zero(i8 %a) { 32*9880d681SAndroid Build Coastguard Worker %shr = ashr i8 127, %a 33*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, 0 34*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ashr_eq_both_equal 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i8 %a, 0 39*9880d681SAndroid Build Coastguard Workerdefine i1 @ashr_eq_both_equal(i8 %a) { 40*9880d681SAndroid Build Coastguard Worker %shr = ashr i8 128, %a 41*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, 128 42*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ashr_ne_both_equal 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i8 %a, 0 47*9880d681SAndroid Build Coastguard Workerdefine i1 @ashr_ne_both_equal(i8 %a) { 48*9880d681SAndroid Build Coastguard Worker %shr = ashr i8 128, %a 49*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, 128 50*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @lshr_eq_both_equal 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i8 %a, 0 55*9880d681SAndroid Build Coastguard Workerdefine i1 @lshr_eq_both_equal(i8 %a) { 56*9880d681SAndroid Build Coastguard Worker %shr = lshr i8 127, %a 57*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, 127 58*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 59*9880d681SAndroid Build Coastguard Worker} 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @lshr_ne_both_equal 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i8 %a, 0 63*9880d681SAndroid Build Coastguard Workerdefine i1 @lshr_ne_both_equal(i8 %a) { 64*9880d681SAndroid Build Coastguard Worker %shr = lshr i8 127, %a 65*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, 127 66*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exact_ashr_eq_both_equal 70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i8 %a, 0 71*9880d681SAndroid Build Coastguard Workerdefine i1 @exact_ashr_eq_both_equal(i8 %a) { 72*9880d681SAndroid Build Coastguard Worker %shr = ashr exact i8 128, %a 73*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, 128 74*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exact_ashr_ne_both_equal 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i8 %a, 0 79*9880d681SAndroid Build Coastguard Workerdefine i1 @exact_ashr_ne_both_equal(i8 %a) { 80*9880d681SAndroid Build Coastguard Worker %shr = ashr exact i8 128, %a 81*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, 128 82*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exact_lshr_eq_both_equal 86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i8 %a, 0 87*9880d681SAndroid Build Coastguard Workerdefine i1 @exact_lshr_eq_both_equal(i8 %a) { 88*9880d681SAndroid Build Coastguard Worker %shr = lshr exact i8 126, %a 89*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, 126 90*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exact_lshr_ne_both_equal 94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i8 %a, 0 95*9880d681SAndroid Build Coastguard Workerdefine i1 @exact_lshr_ne_both_equal(i8 %a) { 96*9880d681SAndroid Build Coastguard Worker %shr = lshr exact i8 126, %a 97*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, 126 98*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exact_lshr_eq_opposite_msb 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i8 %a, 7 103*9880d681SAndroid Build Coastguard Workerdefine i1 @exact_lshr_eq_opposite_msb(i8 %a) { 104*9880d681SAndroid Build Coastguard Worker %shr = lshr exact i8 -128, %a 105*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, 1 106*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @lshr_eq_opposite_msb 110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i8 %a, 7 111*9880d681SAndroid Build Coastguard Workerdefine i1 @lshr_eq_opposite_msb(i8 %a) { 112*9880d681SAndroid Build Coastguard Worker %shr = lshr i8 -128, %a 113*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, 1 114*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 115*9880d681SAndroid Build Coastguard Worker} 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exact_lshr_ne_opposite_msb 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i8 %a, 7 119*9880d681SAndroid Build Coastguard Workerdefine i1 @exact_lshr_ne_opposite_msb(i8 %a) { 120*9880d681SAndroid Build Coastguard Worker %shr = lshr exact i8 -128, %a 121*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, 1 122*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @lshr_ne_opposite_msb 126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i8 %a, 7 127*9880d681SAndroid Build Coastguard Workerdefine i1 @lshr_ne_opposite_msb(i8 %a) { 128*9880d681SAndroid Build Coastguard Worker %shr = lshr i8 -128, %a 129*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, 1 130*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 131*9880d681SAndroid Build Coastguard Worker} 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exact_ashr_eq 134*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i8 %a, 7 135*9880d681SAndroid Build Coastguard Workerdefine i1 @exact_ashr_eq(i8 %a) { 136*9880d681SAndroid Build Coastguard Worker %shr = ashr exact i8 -128, %a 137*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, -1 138*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 139*9880d681SAndroid Build Coastguard Worker} 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exact_ashr_ne 142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i8 %a, 7 143*9880d681SAndroid Build Coastguard Workerdefine i1 @exact_ashr_ne(i8 %a) { 144*9880d681SAndroid Build Coastguard Worker %shr = ashr exact i8 -128, %a 145*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, -1 146*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 147*9880d681SAndroid Build Coastguard Worker} 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exact_lshr_eq 150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i8 %a, 2 151*9880d681SAndroid Build Coastguard Workerdefine i1 @exact_lshr_eq(i8 %a) { 152*9880d681SAndroid Build Coastguard Worker %shr = lshr exact i8 4, %a 153*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, 1 154*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 155*9880d681SAndroid Build Coastguard Worker} 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exact_lshr_ne 158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i8 %a, 2 159*9880d681SAndroid Build Coastguard Workerdefine i1 @exact_lshr_ne(i8 %a) { 160*9880d681SAndroid Build Coastguard Worker %shr = lshr exact i8 4, %a 161*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, 1 162*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 163*9880d681SAndroid Build Coastguard Worker} 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonexact_ashr_eq 166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i8 %a, 7 167*9880d681SAndroid Build Coastguard Workerdefine i1 @nonexact_ashr_eq(i8 %a) { 168*9880d681SAndroid Build Coastguard Worker %shr = ashr i8 -128, %a 169*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, -1 170*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 171*9880d681SAndroid Build Coastguard Worker} 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonexact_ashr_ne 174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i8 %a, 7 175*9880d681SAndroid Build Coastguard Workerdefine i1 @nonexact_ashr_ne(i8 %a) { 176*9880d681SAndroid Build Coastguard Worker %shr = ashr i8 -128, %a 177*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, -1 178*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 179*9880d681SAndroid Build Coastguard Worker} 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonexact_lshr_eq 182*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i8 %a, 2 183*9880d681SAndroid Build Coastguard Workerdefine i1 @nonexact_lshr_eq(i8 %a) { 184*9880d681SAndroid Build Coastguard Worker %shr = lshr i8 4, %a 185*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, 1 186*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 187*9880d681SAndroid Build Coastguard Worker} 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonexact_lshr_ne 190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i8 %a, 2 191*9880d681SAndroid Build Coastguard Workerdefine i1 @nonexact_lshr_ne(i8 %a) { 192*9880d681SAndroid Build Coastguard Worker %shr = lshr i8 4, %a 193*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, 1 194*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 195*9880d681SAndroid Build Coastguard Worker} 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exact_lshr_eq_exactdiv 198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i8 %a, 4 199*9880d681SAndroid Build Coastguard Workerdefine i1 @exact_lshr_eq_exactdiv(i8 %a) { 200*9880d681SAndroid Build Coastguard Worker %shr = lshr exact i8 80, %a 201*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, 5 202*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 203*9880d681SAndroid Build Coastguard Worker} 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exact_lshr_ne_exactdiv 206*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i8 %a, 4 207*9880d681SAndroid Build Coastguard Workerdefine i1 @exact_lshr_ne_exactdiv(i8 %a) { 208*9880d681SAndroid Build Coastguard Worker %shr = lshr exact i8 80, %a 209*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, 5 210*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 211*9880d681SAndroid Build Coastguard Worker} 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonexact_lshr_eq_exactdiv 214*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i8 %a, 4 215*9880d681SAndroid Build Coastguard Workerdefine i1 @nonexact_lshr_eq_exactdiv(i8 %a) { 216*9880d681SAndroid Build Coastguard Worker %shr = lshr i8 80, %a 217*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, 5 218*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 219*9880d681SAndroid Build Coastguard Worker} 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonexact_lshr_ne_exactdiv 222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i8 %a, 4 223*9880d681SAndroid Build Coastguard Workerdefine i1 @nonexact_lshr_ne_exactdiv(i8 %a) { 224*9880d681SAndroid Build Coastguard Worker %shr = lshr i8 80, %a 225*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, 5 226*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 227*9880d681SAndroid Build Coastguard Worker} 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exact_ashr_eq_exactdiv 230*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i8 %a, 4 231*9880d681SAndroid Build Coastguard Workerdefine i1 @exact_ashr_eq_exactdiv(i8 %a) { 232*9880d681SAndroid Build Coastguard Worker %shr = ashr exact i8 -80, %a 233*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, -5 234*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 235*9880d681SAndroid Build Coastguard Worker} 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exact_ashr_ne_exactdiv 238*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i8 %a, 4 239*9880d681SAndroid Build Coastguard Workerdefine i1 @exact_ashr_ne_exactdiv(i8 %a) { 240*9880d681SAndroid Build Coastguard Worker %shr = ashr exact i8 -80, %a 241*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, -5 242*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 243*9880d681SAndroid Build Coastguard Worker} 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonexact_ashr_eq_exactdiv 246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp eq i8 %a, 4 247*9880d681SAndroid Build Coastguard Workerdefine i1 @nonexact_ashr_eq_exactdiv(i8 %a) { 248*9880d681SAndroid Build Coastguard Worker %shr = ashr i8 -80, %a 249*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, -5 250*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 251*9880d681SAndroid Build Coastguard Worker} 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonexact_ashr_ne_exactdiv 254*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i8 %a, 4 255*9880d681SAndroid Build Coastguard Workerdefine i1 @nonexact_ashr_ne_exactdiv(i8 %a) { 256*9880d681SAndroid Build Coastguard Worker %shr = ashr i8 -80, %a 257*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, -5 258*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 259*9880d681SAndroid Build Coastguard Worker} 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exact_lshr_eq_noexactdiv 262*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 263*9880d681SAndroid Build Coastguard Workerdefine i1 @exact_lshr_eq_noexactdiv(i8 %a) { 264*9880d681SAndroid Build Coastguard Worker %shr = lshr exact i8 80, %a 265*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, 31 266*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 267*9880d681SAndroid Build Coastguard Worker} 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exact_lshr_ne_noexactdiv 270*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 true 271*9880d681SAndroid Build Coastguard Workerdefine i1 @exact_lshr_ne_noexactdiv(i8 %a) { 272*9880d681SAndroid Build Coastguard Worker %shr = lshr exact i8 80, %a 273*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, 31 274*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 275*9880d681SAndroid Build Coastguard Worker} 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonexact_lshr_eq_noexactdiv 278*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 279*9880d681SAndroid Build Coastguard Workerdefine i1 @nonexact_lshr_eq_noexactdiv(i8 %a) { 280*9880d681SAndroid Build Coastguard Worker %shr = lshr i8 80, %a 281*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, 31 282*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 283*9880d681SAndroid Build Coastguard Worker} 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonexact_lshr_ne_noexactdiv 286*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 true 287*9880d681SAndroid Build Coastguard Workerdefine i1 @nonexact_lshr_ne_noexactdiv(i8 %a) { 288*9880d681SAndroid Build Coastguard Worker %shr = lshr i8 80, %a 289*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, 31 290*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 291*9880d681SAndroid Build Coastguard Worker} 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exact_ashr_eq_noexactdiv 294*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 295*9880d681SAndroid Build Coastguard Workerdefine i1 @exact_ashr_eq_noexactdiv(i8 %a) { 296*9880d681SAndroid Build Coastguard Worker %shr = ashr exact i8 -80, %a 297*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, -31 298*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 299*9880d681SAndroid Build Coastguard Worker} 300*9880d681SAndroid Build Coastguard Worker 301*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @exact_ashr_ne_noexactdiv 302*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 true 303*9880d681SAndroid Build Coastguard Workerdefine i1 @exact_ashr_ne_noexactdiv(i8 %a) { 304*9880d681SAndroid Build Coastguard Worker %shr = ashr exact i8 -80, %a 305*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, -31 306*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 307*9880d681SAndroid Build Coastguard Worker} 308*9880d681SAndroid Build Coastguard Worker 309*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonexact_ashr_eq_noexactdiv 310*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 311*9880d681SAndroid Build Coastguard Workerdefine i1 @nonexact_ashr_eq_noexactdiv(i8 %a) { 312*9880d681SAndroid Build Coastguard Worker %shr = ashr i8 -80, %a 313*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, -31 314*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 315*9880d681SAndroid Build Coastguard Worker} 316*9880d681SAndroid Build Coastguard Worker 317*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonexact_ashr_ne_noexactdiv 318*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 true 319*9880d681SAndroid Build Coastguard Workerdefine i1 @nonexact_ashr_ne_noexactdiv(i8 %a) { 320*9880d681SAndroid Build Coastguard Worker %shr = ashr i8 -80, %a 321*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, -31 322*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 323*9880d681SAndroid Build Coastguard Worker} 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonexact_lshr_eq_noexactlog 326*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 327*9880d681SAndroid Build Coastguard Workerdefine i1 @nonexact_lshr_eq_noexactlog(i8 %a) { 328*9880d681SAndroid Build Coastguard Worker %shr = lshr i8 90, %a 329*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, 30 330*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 331*9880d681SAndroid Build Coastguard Worker} 332*9880d681SAndroid Build Coastguard Worker 333*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonexact_lshr_ne_noexactlog 334*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 true 335*9880d681SAndroid Build Coastguard Workerdefine i1 @nonexact_lshr_ne_noexactlog(i8 %a) { 336*9880d681SAndroid Build Coastguard Worker %shr = lshr i8 90, %a 337*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, 30 338*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 339*9880d681SAndroid Build Coastguard Worker} 340*9880d681SAndroid Build Coastguard Worker 341*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonexact_ashr_eq_noexactlog 342*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 343*9880d681SAndroid Build Coastguard Workerdefine i1 @nonexact_ashr_eq_noexactlog(i8 %a) { 344*9880d681SAndroid Build Coastguard Worker %shr = ashr i8 -90, %a 345*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %shr, -30 346*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 347*9880d681SAndroid Build Coastguard Worker} 348*9880d681SAndroid Build Coastguard Worker 349*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonexact_ashr_ne_noexactlog 350*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 true 351*9880d681SAndroid Build Coastguard Workerdefine i1 @nonexact_ashr_ne_noexactlog(i8 %a) { 352*9880d681SAndroid Build Coastguard Worker %shr = ashr i8 -90, %a 353*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8 %shr, -30 354*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 355*9880d681SAndroid Build Coastguard Worker} 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Worker; Don't try to fold the entire body of function @PR20945 into a 358*9880d681SAndroid Build Coastguard Worker; single `ret i1 true` statement. 359*9880d681SAndroid Build Coastguard Worker; If %B is equal to 1, then this function would return false. 360*9880d681SAndroid Build Coastguard Worker; As a consequence, the instruction combiner is not allowed to fold %cmp 361*9880d681SAndroid Build Coastguard Worker; to 'true'. Instead, it should replace %cmp with a simpler comparison 362*9880d681SAndroid Build Coastguard Worker; between %B and 1. 363*9880d681SAndroid Build Coastguard Worker 364*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR20945( 365*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ne i32 %B, 1 366*9880d681SAndroid Build Coastguard Workerdefine i1 @PR20945(i32 %B) { 367*9880d681SAndroid Build Coastguard Worker %shr = ashr i32 -9, %B 368*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %shr, -5 369*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 370*9880d681SAndroid Build Coastguard Worker} 371*9880d681SAndroid Build Coastguard Worker 372*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR21222 373*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 %B, 6 374*9880d681SAndroid Build Coastguard Workerdefine i1 @PR21222(i32 %B) { 375*9880d681SAndroid Build Coastguard Worker %shr = ashr i32 -93, %B 376*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %shr, -2 377*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 378*9880d681SAndroid Build Coastguard Worker} 379*9880d681SAndroid Build Coastguard Worker 380*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR24873( 381*9880d681SAndroid Build Coastguard Worker; CHECK: %[[icmp:.*]] = icmp ugt i64 %V, 61 382*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 %[[icmp]] 383*9880d681SAndroid Build Coastguard Workerdefine i1 @PR24873(i64 %V) { 384*9880d681SAndroid Build Coastguard Worker %ashr = ashr i64 -4611686018427387904, %V 385*9880d681SAndroid Build Coastguard Worker %icmp = icmp eq i64 %ashr, -1 386*9880d681SAndroid Build Coastguard Worker ret i1 %icmp 387*9880d681SAndroid Build Coastguard Worker} 388