1fb3e2befSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2fb3e2befSFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3fb3e2befSFlorian Hahn 4fb3e2befSFlorian Hahndeclare void @llvm.assume(i1) 5fb3e2befSFlorian Hahn 6fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_1(i8 %start, i8 %high) { 7fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_1( 8fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 9fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nuw i8 [[START:%.*]], 4 10fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 11fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 12fbcf8a8cSFlorian Hahn; CHECK-NEXT: ret i1 true 13fb3e2befSFlorian Hahn; 14fb3e2befSFlorian Hahnentry: 15fb3e2befSFlorian Hahn %start.shl.4 = shl nuw i8 %start, 4 16fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 17fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 18fb3e2befSFlorian Hahn 19fb3e2befSFlorian Hahn %t.1 = icmp ult i8 %start, %high 20fb3e2befSFlorian Hahn ret i1 %t.1 21fb3e2befSFlorian Hahn} 22fb3e2befSFlorian Hahn 23fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_2(i8 %start, i8 %high) { 24fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_2( 25fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 26fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nuw i8 [[START:%.*]], 4 27fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 28fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 29fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2 30fbcf8a8cSFlorian Hahn; CHECK-NEXT: ret i1 true 31fb3e2befSFlorian Hahn; 32fb3e2befSFlorian Hahnentry: 33fb3e2befSFlorian Hahn %start.shl.4 = shl nuw i8 %start, 4 34fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 35fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 36fb3e2befSFlorian Hahn 37fb3e2befSFlorian Hahn %start.shl.2 = shl nuw i8 %start, 2 38fb3e2befSFlorian Hahn %t = icmp ult i8 %start.shl.2, %high 39fb3e2befSFlorian Hahn ret i1 %t 40fb3e2befSFlorian Hahn} 41fb3e2befSFlorian Hahn 42fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_3(i8 %start, i8 %high) { 43fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_3( 44fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 45fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nuw i8 [[START:%.*]], 4 46fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 47fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 48fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2 49fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 50fbcf8a8cSFlorian Hahn; CHECK-NEXT: ret i1 true 51fb3e2befSFlorian Hahn; 52fb3e2befSFlorian Hahnentry: 53fb3e2befSFlorian Hahn %start.shl.4 = shl nuw i8 %start, 4 54fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 55fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 56fb3e2befSFlorian Hahn 57fb3e2befSFlorian Hahn %start.shl.2 = shl nuw i8 %start, 2 58fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 59fb3e2befSFlorian Hahn %t = icmp ule i8 %start.add.1, %start.shl.2 60fb3e2befSFlorian Hahn ret i1 %t 61fb3e2befSFlorian Hahn} 62fb3e2befSFlorian Hahn 63fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_4(i8 %start, i8 %high) { 64fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_4( 65fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 66fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nuw i8 [[START:%.*]], 4 67fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 68fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 69fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2 70fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 71fb3e2befSFlorian Hahn; CHECK-NEXT: [[F:%.*]] = icmp ult i8 [[START_ADD_1]], [[START_SHL_2]] 72fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F]] 73fb3e2befSFlorian Hahn; 74fb3e2befSFlorian Hahnentry: 75fb3e2befSFlorian Hahn %start.shl.4 = shl nuw i8 %start, 4 76fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 77fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 78fb3e2befSFlorian Hahn 79fb3e2befSFlorian Hahn %start.shl.2 = shl nuw i8 %start, 2 80fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 81fb3e2befSFlorian Hahn %f = icmp ult i8 %start.add.1, %start.shl.2 82fb3e2befSFlorian Hahn ret i1 %f 83fb3e2befSFlorian Hahn} 84fb3e2befSFlorian Hahn 85fb3e2befSFlorian Hahn 86fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_5(i8 %start, i8 %high) { 87fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_5( 88fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 89fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nuw i8 [[START:%.*]], 4 90fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 91fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 92fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 93fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] 94fbcf8a8cSFlorian Hahn; CHECK-NEXT: ret i1 true 95fb3e2befSFlorian Hahn; 96fb3e2befSFlorian Hahnentry: 97fb3e2befSFlorian Hahn %start.shl.4 = shl nuw i8 %start, 4 98fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 99fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 100fb3e2befSFlorian Hahn 101fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 102fb3e2befSFlorian Hahn %start.add.2 = add nuw i8 %start.add.1, %start.add.1 103fb3e2befSFlorian Hahn %t.4 = icmp ule i8 %start.add.2, %start.shl.4 104fb3e2befSFlorian Hahn ret i1 %t.4 105fb3e2befSFlorian Hahn} 106fb3e2befSFlorian Hahn 107fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_6(i8 %start, i8 %high) { 108fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_6( 109fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 110fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nuw i8 [[START:%.*]], 4 111fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 112fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 113fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 114fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] 115fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_2:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_SHL_4]] 116fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_2]] 117fb3e2befSFlorian Hahn; 118fb3e2befSFlorian Hahnentry: 119fb3e2befSFlorian Hahn %start.shl.4 = shl nuw i8 %start, 4 120fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 121fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 122fb3e2befSFlorian Hahn 123fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 124fb3e2befSFlorian Hahn %start.add.2 = add nuw i8 %start.add.1, %start.add.1 125fb3e2befSFlorian Hahn %f.2 = icmp ult i8 %start.add.2, %start.shl.4 126fb3e2befSFlorian Hahn ret i1 %f.2 127fb3e2befSFlorian Hahn} 128fb3e2befSFlorian Hahn 129fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_7(i8 %start, i8 %high) { 130fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_7( 131fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 132fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nuw i8 [[START:%.*]], 4 133fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 134fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 135fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2 136fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 137fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] 138fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add nuw i8 [[START_ADD_2]], 1 139fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_3:%.*]] = icmp ule i8 [[START_ADD_2_1]], [[START_SHL_4]] 140fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_3]] 141fb3e2befSFlorian Hahn; 142fb3e2befSFlorian Hahnentry: 143fb3e2befSFlorian Hahn %start.shl.4 = shl nuw i8 %start, 4 144fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 145fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 146fb3e2befSFlorian Hahn 147fb3e2befSFlorian Hahn %start.shl.2 = shl nuw i8 %start, 2 148fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 149fb3e2befSFlorian Hahn %start.add.2 = add nuw i8 %start.add.1, %start.add.1 150fb3e2befSFlorian Hahn %start.add.2.1 = add nuw i8 %start.add.2, 1 151fb3e2befSFlorian Hahn %f.3 = icmp ule i8 %start.add.2.1, %start.shl.4 152fb3e2befSFlorian Hahn ret i1 %f.3 153fb3e2befSFlorian Hahn} 154fb3e2befSFlorian Hahn 155fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_8(i8 %start, i8 %high) { 156fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_8( 157fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 158fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nuw i8 [[START:%.*]], 4 159fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 160fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 161fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2 162fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 163fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] 164fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add nuw i8 [[START_ADD_2]], 1 165fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_3:%.*]] = shl nuw i8 [[START]], 3 166fbcf8a8cSFlorian Hahn; CHECK-NEXT: ret i1 true 167fb3e2befSFlorian Hahn; 168fb3e2befSFlorian Hahnentry: 169fb3e2befSFlorian Hahn %start.shl.4 = shl nuw i8 %start, 4 170fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 171fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 172fb3e2befSFlorian Hahn 173fb3e2befSFlorian Hahn %start.shl.2 = shl nuw i8 %start, 2 174fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 175fb3e2befSFlorian Hahn %start.add.2 = add nuw i8 %start.add.1, %start.add.1 176fb3e2befSFlorian Hahn %start.add.2.1 = add nuw i8 %start.add.2, 1 177fb3e2befSFlorian Hahn %start.shl.3 = shl nuw i8 %start, 3 178fb3e2befSFlorian Hahn %t.5 = icmp ule i8 %start.add.1, %start.shl.3 179fb3e2befSFlorian Hahn ret i1 %t.5 180fb3e2befSFlorian Hahn} 181fb3e2befSFlorian Hahn 182fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_9(i8 %start, i8 %high) { 183fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_9( 184fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 185fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nuw i8 [[START:%.*]], 4 186fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 187fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 188fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2 189fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 190fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] 191fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add nuw i8 [[START_ADD_2]], 1 192fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_3:%.*]] = shl nuw i8 [[START]], 3 193fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_5:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_SHL_3]] 194fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_5]] 195fb3e2befSFlorian Hahn; 196fb3e2befSFlorian Hahnentry: 197fb3e2befSFlorian Hahn %start.shl.4 = shl nuw i8 %start, 4 198fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 199fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 200fb3e2befSFlorian Hahn 201fb3e2befSFlorian Hahn %start.shl.2 = shl nuw i8 %start, 2 202fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 203fb3e2befSFlorian Hahn %start.add.2 = add nuw i8 %start.add.1, %start.add.1 204fb3e2befSFlorian Hahn %start.add.2.1 = add nuw i8 %start.add.2, 1 205fb3e2befSFlorian Hahn %start.shl.3 = shl nuw i8 %start, 3 206fb3e2befSFlorian Hahn %f.5 = icmp ult i8 %start.add.2, %start.shl.3 207fb3e2befSFlorian Hahn ret i1 %f.5 208fb3e2befSFlorian Hahn} 209fb3e2befSFlorian Hahn 210fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_10(i8 %start, i8 %high) { 211fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_10( 212fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 213fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_5:%.*]] = shl nuw i8 [[START:%.*]], 5 214fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult i8 [[START]], [[START_SHL_5]] 215fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 216fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_3:%.*]] = shl nuw i8 [[START]], 3 2177c1b80e3SFlorian Hahn; CHECK-NEXT: ret i1 true 218fb3e2befSFlorian Hahn; 219fb3e2befSFlorian Hahnentry: 220fb3e2befSFlorian Hahn %start.shl.5 = shl nuw i8 %start, 5 221fb3e2befSFlorian Hahn %c.0 = icmp ult i8 %start, %start.shl.5 222fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.0) 223fb3e2befSFlorian Hahn 224fb3e2befSFlorian Hahn %start.shl.3 = shl nuw i8 %start, 3 225fb3e2befSFlorian Hahn %t.1 = icmp ule i8 %start.shl.3, %start.shl.5 226fb3e2befSFlorian Hahn ret i1 %t.1 227fb3e2befSFlorian Hahn} 228fb3e2befSFlorian Hahn 229fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_11(i8 %start, i8 %high) { 230fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_11( 231fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 232fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_5:%.*]] = shl nuw i8 [[START:%.*]], 5 233fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult i8 [[START]], [[START_SHL_5]] 234fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 235fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_3:%.*]] = shl nuw i8 [[START]], 3 2367c1b80e3SFlorian Hahn; CHECK-NEXT: ret i1 false 237fb3e2befSFlorian Hahn; 238fb3e2befSFlorian Hahnentry: 239fb3e2befSFlorian Hahn %start.shl.5 = shl nuw i8 %start, 5 240fb3e2befSFlorian Hahn %c.0 = icmp ult i8 %start, %start.shl.5 241fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.0) 242fb3e2befSFlorian Hahn 243fb3e2befSFlorian Hahn %start.shl.3 = shl nuw i8 %start, 3 244fb3e2befSFlorian Hahn %c.1 = icmp ule i8 %start.shl.5, %start.shl.3 245fb3e2befSFlorian Hahn ret i1 %c.1 246fb3e2befSFlorian Hahn} 247fb3e2befSFlorian Hahn 248fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_12(i8 %start) { 249fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_12( 250fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 251fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_3:%.*]] = shl nuw i8 [[START:%.*]], 3 252fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START]], [[START_SHL_3]] 253fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 254fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_5:%.*]] = shl nuw i8 [[START]], 5 2557c1b80e3SFlorian Hahn; CHECK-NEXT: ret i1 true 256fb3e2befSFlorian Hahn; 257fb3e2befSFlorian Hahnentry: 258fb3e2befSFlorian Hahn %start.shl.3 = shl nuw i8 %start, 3 259fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start, %start.shl.3 260fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 261fb3e2befSFlorian Hahn 262fb3e2befSFlorian Hahn %start.shl.5 = shl nuw i8 %start, 5 263fb3e2befSFlorian Hahn %t.1 = icmp ule i8 %start.shl.3, %start.shl.5 264fb3e2befSFlorian Hahn ret i1 %t.1 265fb3e2befSFlorian Hahn} 266fb3e2befSFlorian Hahn 267fb3e2befSFlorian Hahndefine i1 @test_shl_const_nuw_unsigned_13(i8 %start) { 268fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nuw_unsigned_13( 269fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 270fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_3:%.*]] = shl i8 [[START:%.*]], 3 271fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START]], [[START_SHL_3]] 272fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 273fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_5:%.*]] = shl i8 [[START]], 5 274fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[START_SHL_5]], [[START_SHL_3]] 275fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_1]] 276fb3e2befSFlorian Hahn; 277fb3e2befSFlorian Hahnentry: 278fb3e2befSFlorian Hahn %start.shl.3 = shl i8 %start, 3 279fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start, %start.shl.3 280fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 281fb3e2befSFlorian Hahn 282fb3e2befSFlorian Hahn %start.shl.5 = shl i8 %start, 5 283fb3e2befSFlorian Hahn %f.1 = icmp ule i8 %start.shl.5, %start.shl.3 284fb3e2befSFlorian Hahn ret i1 %f.1 285fb3e2befSFlorian Hahn} 286fb3e2befSFlorian Hahn 287fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nuw_unsigned_1(i8 %start, i8 %high) { 288fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nuw_unsigned_1( 289fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 290fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3 291fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nuw i8 [[ADD]], 4 292fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 293fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 294fbcf8a8cSFlorian Hahn; CHECK-NEXT: ret i1 true 295fb3e2befSFlorian Hahn; 296fb3e2befSFlorian Hahnentry: 297fb3e2befSFlorian Hahn %add = add nuw i8 %start, 3 298fb3e2befSFlorian Hahn %start.shl.4 = shl nuw i8 %add, 4 299fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 300fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 301fb3e2befSFlorian Hahn 302fb3e2befSFlorian Hahn %t.1 = icmp ult i8 %start, %high 303fb3e2befSFlorian Hahn ret i1 %t.1 304fb3e2befSFlorian Hahn} 305fb3e2befSFlorian Hahn 306fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nuw_unsigned_2(i8 %start, i8 %high) { 307fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nuw_unsigned_2( 308fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 309fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3 310fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nuw i8 [[ADD]], 4 311fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 312fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 313fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2 314fbcf8a8cSFlorian Hahn; CHECK-NEXT: ret i1 true 315fb3e2befSFlorian Hahn; 316fb3e2befSFlorian Hahnentry: 317fb3e2befSFlorian Hahn %add = add nuw i8 %start, 3 318fb3e2befSFlorian Hahn %start.shl.4 = shl nuw i8 %add, 4 319fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 320fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 321fb3e2befSFlorian Hahn 322fb3e2befSFlorian Hahn %start.shl.2 = shl nuw i8 %start, 2 323fb3e2befSFlorian Hahn %t.2 = icmp ult i8 %start.shl.2, %high 324fb3e2befSFlorian Hahn ret i1 %t.2 325fb3e2befSFlorian Hahn} 326fb3e2befSFlorian Hahn 327fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nuw_unsigned_3(i8 %start, i8 %high) { 328fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nuw_unsigned_3( 329fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 330fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3 331fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nuw i8 [[ADD]], 4 332fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 333fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 334fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 335fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] 336fbcf8a8cSFlorian Hahn; CHECK-NEXT: ret i1 true 337fb3e2befSFlorian Hahn; 338fb3e2befSFlorian Hahnentry: 339fb3e2befSFlorian Hahn %add = add nuw i8 %start, 3 340fb3e2befSFlorian Hahn %start.shl.4 = shl nuw i8 %add, 4 341fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 342fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 343fb3e2befSFlorian Hahn 344fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 345fb3e2befSFlorian Hahn %start.add.2 = add nuw i8 %start.add.1, %start.add.1 346fb3e2befSFlorian Hahn %t.3 = icmp ule i8 %start.add.2, %start.shl.4 347fb3e2befSFlorian Hahn ret i1 %t.3 348fb3e2befSFlorian Hahn} 349fb3e2befSFlorian Hahn 350fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nuw_unsigned_4(i8 %start, i8 %high) { 351fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nuw_unsigned_4( 352fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 353fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3 354fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nuw i8 [[ADD]], 4 355fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 356fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 357fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2 358fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 359fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] 360fbcf8a8cSFlorian Hahn; CHECK-NEXT: ret i1 true 361fb3e2befSFlorian Hahn; 362fb3e2befSFlorian Hahnentry: 363fb3e2befSFlorian Hahn %add = add nuw i8 %start, 3 364fb3e2befSFlorian Hahn %start.shl.4 = shl nuw i8 %add, 4 365fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 366fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 367fb3e2befSFlorian Hahn 368fb3e2befSFlorian Hahn %start.shl.2 = shl nuw i8 %start, 2 369fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 370fb3e2befSFlorian Hahn %start.add.2 = add nuw i8 %start.add.1, %start.add.1 371fb3e2befSFlorian Hahn %t.4 = icmp ult i8 %start.add.2, %start.shl.4 372fb3e2befSFlorian Hahn ret i1 %t.4 373fb3e2befSFlorian Hahn} 374fb3e2befSFlorian Hahn 375fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nuw_unsigned_5(i8 %start, i8 %high) { 376fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nuw_unsigned_5( 377fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 378fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3 379fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nuw i8 [[ADD]], 4 380fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 381fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 382fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 383fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] 384fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_12:%.*]] = add nuw i8 [[START_ADD_2]], 12 385fbcf8a8cSFlorian Hahn; CHECK-NEXT: ret i1 true 386fb3e2befSFlorian Hahn; 387fb3e2befSFlorian Hahnentry: 388fb3e2befSFlorian Hahn %add = add nuw i8 %start, 3 389fb3e2befSFlorian Hahn %start.shl.4 = shl nuw i8 %add, 4 390fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 391fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 392fb3e2befSFlorian Hahn 393fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 394fb3e2befSFlorian Hahn %start.add.2 = add nuw i8 %start.add.1, %start.add.1 395fb3e2befSFlorian Hahn %start.add.2.12 = add nuw i8 %start.add.2, 12 396fb3e2befSFlorian Hahn %t.5 = icmp ule i8 %start.add.2.12, %start.shl.4 397fb3e2befSFlorian Hahn ret i1 %t.5 398fb3e2befSFlorian Hahn} 399fb3e2befSFlorian Hahn 400fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nuw_unsigned_6(i8 %start, i8 %high) { 401fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nuw_unsigned_6( 402fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 403fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3 404fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nuw i8 [[ADD]], 4 405fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 406fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 407fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 408fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] 409fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_13:%.*]] = add nuw i8 [[START_ADD_2]], 13 410fbcf8a8cSFlorian Hahn; CHECK-NEXT: ret i1 true 411fb3e2befSFlorian Hahn; 412fb3e2befSFlorian Hahnentry: 413fb3e2befSFlorian Hahn %add = add nuw i8 %start, 3 414fb3e2befSFlorian Hahn %start.shl.4 = shl nuw i8 %add, 4 415fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 416fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 417fb3e2befSFlorian Hahn 418fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 419fb3e2befSFlorian Hahn %start.add.2 = add nuw i8 %start.add.1, %start.add.1 420fb3e2befSFlorian Hahn %start.add.2.13 = add nuw i8 %start.add.2, 13 421fb3e2befSFlorian Hahn %f.1 = icmp ule i8 %start.add.2.13, %start.shl.4 422fb3e2befSFlorian Hahn ret i1 %f.1 423fb3e2befSFlorian Hahn} 424fb3e2befSFlorian Hahn 425fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_1(i8 %start, i8 %high) { 426fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_1( 427fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 428fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nsw i8 [[START:%.*]], 4 429fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 430fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 431fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]] 432fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_1]] 433fb3e2befSFlorian Hahn; 434fb3e2befSFlorian Hahnentry: 435fb3e2befSFlorian Hahn %start.shl.4 = shl nsw i8 %start, 4 436fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 437fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 438fb3e2befSFlorian Hahn 439fb3e2befSFlorian Hahn %t.1 = icmp ult i8 %start, %high 440fb3e2befSFlorian Hahn ret i1 %t.1 441fb3e2befSFlorian Hahn} 442fb3e2befSFlorian Hahn 443fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_2(i8 %start, i8 %high) { 444fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_2( 445fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 446fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nsw i8 [[START:%.*]], 4 447fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 448fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 449fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nsw i8 [[START]], 2 450fb3e2befSFlorian Hahn; CHECK-NEXT: [[T:%.*]] = icmp ult i8 [[START_SHL_2]], [[HIGH]] 451fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T]] 452fb3e2befSFlorian Hahn; 453fb3e2befSFlorian Hahnentry: 454fb3e2befSFlorian Hahn %start.shl.4 = shl nsw i8 %start, 4 455fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 456fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 457fb3e2befSFlorian Hahn 458fb3e2befSFlorian Hahn %start.shl.2 = shl nsw i8 %start, 2 459fb3e2befSFlorian Hahn %t = icmp ult i8 %start.shl.2, %high 460fb3e2befSFlorian Hahn ret i1 %t 461fb3e2befSFlorian Hahn} 462fb3e2befSFlorian Hahn 463fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_3(i8 %start, i8 %high) { 464fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_3( 465fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 466fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nsw i8 [[START:%.*]], 4 467fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 468fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 469fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nsw i8 [[START]], 2 470fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 471fb3e2befSFlorian Hahn; CHECK-NEXT: [[T:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_SHL_2]] 472fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T]] 473fb3e2befSFlorian Hahn; 474fb3e2befSFlorian Hahnentry: 475fb3e2befSFlorian Hahn %start.shl.4 = shl nsw i8 %start, 4 476fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 477fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 478fb3e2befSFlorian Hahn 479fb3e2befSFlorian Hahn %start.shl.2 = shl nsw i8 %start, 2 480fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 481fb3e2befSFlorian Hahn %t = icmp ule i8 %start.add.1, %start.shl.2 482fb3e2befSFlorian Hahn ret i1 %t 483fb3e2befSFlorian Hahn} 484fb3e2befSFlorian Hahn 485fb3e2befSFlorian Hahn 486fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_4(i8 %start, i8 %high) { 487fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_4( 488fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 489fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nsw i8 [[START:%.*]], 4 490fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 491fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 492fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nsw i8 [[START]], 2 493fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 494fb3e2befSFlorian Hahn; CHECK-NEXT: [[F:%.*]] = icmp ult i8 [[START_ADD_1]], [[START_SHL_2]] 495fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F]] 496fb3e2befSFlorian Hahn; 497fb3e2befSFlorian Hahnentry: 498fb3e2befSFlorian Hahn %start.shl.4 = shl nsw i8 %start, 4 499fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 500fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 501fb3e2befSFlorian Hahn 502fb3e2befSFlorian Hahn %start.shl.2 = shl nsw i8 %start, 2 503fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 504fb3e2befSFlorian Hahn %f = icmp ult i8 %start.add.1, %start.shl.2 505fb3e2befSFlorian Hahn ret i1 %f 506fb3e2befSFlorian Hahn} 507fb3e2befSFlorian Hahn 508fb3e2befSFlorian Hahn 509fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_5(i8 %start, i8 %high) { 510fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_5( 511fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 512fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nsw i8 [[START:%.*]], 4 513fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 514fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 515fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 516fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]] 517fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_4:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_SHL_4]] 518fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_4]] 519fb3e2befSFlorian Hahn; 520fb3e2befSFlorian Hahnentry: 521fb3e2befSFlorian Hahn %start.shl.4 = shl nsw i8 %start, 4 522fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 523fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 524fb3e2befSFlorian Hahn 525fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 526fb3e2befSFlorian Hahn %start.add.2 = add nsw i8 %start.add.1, %start.add.1 527fb3e2befSFlorian Hahn %t.4 = icmp ule i8 %start.add.2, %start.shl.4 528fb3e2befSFlorian Hahn ret i1 %t.4 529fb3e2befSFlorian Hahn} 530fb3e2befSFlorian Hahn 531fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_6(i8 %start, i8 %high) { 532fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_6( 533fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 534fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nsw i8 [[START:%.*]], 4 535fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 536fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 537fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 538fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]] 539fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_2:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_SHL_4]] 540fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_2]] 541fb3e2befSFlorian Hahn; 542fb3e2befSFlorian Hahnentry: 543fb3e2befSFlorian Hahn %start.shl.4 = shl nsw i8 %start, 4 544fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 545fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 546fb3e2befSFlorian Hahn 547fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 548fb3e2befSFlorian Hahn %start.add.2 = add nsw i8 %start.add.1, %start.add.1 549fb3e2befSFlorian Hahn %f.2 = icmp ult i8 %start.add.2, %start.shl.4 550fb3e2befSFlorian Hahn ret i1 %f.2 551fb3e2befSFlorian Hahn} 552fb3e2befSFlorian Hahn 553fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_7(i8 %start, i8 %high) { 554fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_7( 555fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 556fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nsw i8 [[START:%.*]], 4 557fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 558fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 559fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nsw i8 [[START]], 2 560fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 561fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]] 562fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add nsw i8 [[START_ADD_2]], 1 563fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_3:%.*]] = icmp ule i8 [[START_ADD_2_1]], [[START_SHL_4]] 564fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_3]] 565fb3e2befSFlorian Hahn; 566fb3e2befSFlorian Hahnentry: 567fb3e2befSFlorian Hahn %start.shl.4 = shl nsw i8 %start, 4 568fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 569fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 570fb3e2befSFlorian Hahn 571fb3e2befSFlorian Hahn %start.shl.2 = shl nsw i8 %start, 2 572fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 573fb3e2befSFlorian Hahn %start.add.2 = add nsw i8 %start.add.1, %start.add.1 574fb3e2befSFlorian Hahn %start.add.2.1 = add nsw i8 %start.add.2, 1 575fb3e2befSFlorian Hahn %f.3 = icmp ule i8 %start.add.2.1, %start.shl.4 576fb3e2befSFlorian Hahn ret i1 %f.3 577fb3e2befSFlorian Hahn} 578fb3e2befSFlorian Hahn 579fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_8(i8 %start, i8 %high) { 580fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_8( 581fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 582fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nsw i8 [[START:%.*]], 4 583fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 584fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 585fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nsw i8 [[START]], 2 586fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 587fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]] 588fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add nsw i8 [[START_ADD_2]], 1 589fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_3:%.*]] = shl nsw i8 [[START]], 3 590fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_5:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_SHL_3]] 591fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_5]] 592fb3e2befSFlorian Hahn; 593fb3e2befSFlorian Hahnentry: 594fb3e2befSFlorian Hahn %start.shl.4 = shl nsw i8 %start, 4 595fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 596fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 597fb3e2befSFlorian Hahn 598fb3e2befSFlorian Hahn %start.shl.2 = shl nsw i8 %start, 2 599fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 600fb3e2befSFlorian Hahn %start.add.2 = add nsw i8 %start.add.1, %start.add.1 601fb3e2befSFlorian Hahn %start.add.2.1 = add nsw i8 %start.add.2, 1 602fb3e2befSFlorian Hahn %start.shl.3 = shl nsw i8 %start, 3 603fb3e2befSFlorian Hahn %t.5 = icmp ule i8 %start.add.1, %start.shl.3 604fb3e2befSFlorian Hahn ret i1 %t.5 605fb3e2befSFlorian Hahn} 606fb3e2befSFlorian Hahn 607fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_9(i8 %start, i8 %high) { 608fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_9( 609fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 610fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nsw i8 [[START:%.*]], 4 611fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 612fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 613fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nsw i8 [[START]], 2 614fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 615fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]] 616fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add nsw i8 [[START_ADD_2]], 1 617fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_3:%.*]] = shl nsw i8 [[START]], 3 618fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_5:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_SHL_3]] 619fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_5]] 620fb3e2befSFlorian Hahn; 621fb3e2befSFlorian Hahnentry: 622fb3e2befSFlorian Hahn %start.shl.4 = shl nsw i8 %start, 4 623fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 624fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 625fb3e2befSFlorian Hahn 626fb3e2befSFlorian Hahn %start.shl.2 = shl nsw i8 %start, 2 627fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 628fb3e2befSFlorian Hahn %start.add.2 = add nsw i8 %start.add.1, %start.add.1 629fb3e2befSFlorian Hahn %start.add.2.1 = add nsw i8 %start.add.2, 1 630fb3e2befSFlorian Hahn %start.shl.3 = shl nsw i8 %start, 3 631fb3e2befSFlorian Hahn %f.5 = icmp ult i8 %start.add.2, %start.shl.3 632fb3e2befSFlorian Hahn ret i1 %f.5 633fb3e2befSFlorian Hahn} 634fb3e2befSFlorian Hahn 635fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_10(i8 %start, i8 %high) { 636fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_10( 637fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 638fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_5:%.*]] = shl nsw i8 [[START:%.*]], 5 639fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult i8 [[START]], [[START_SHL_5]] 640fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 641fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_3:%.*]] = shl nsw i8 [[START]], 3 642fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[START_SHL_3]], [[START_SHL_5]] 643fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_1]] 644fb3e2befSFlorian Hahn; 645fb3e2befSFlorian Hahnentry: 646fb3e2befSFlorian Hahn %start.shl.5 = shl nsw i8 %start, 5 647fb3e2befSFlorian Hahn %c.0 = icmp ult i8 %start, %start.shl.5 648fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.0) 649fb3e2befSFlorian Hahn 650fb3e2befSFlorian Hahn %start.shl.3 = shl nsw i8 %start, 3 651fb3e2befSFlorian Hahn %t.1 = icmp ule i8 %start.shl.3, %start.shl.5 652fb3e2befSFlorian Hahn ret i1 %t.1 653fb3e2befSFlorian Hahn} 654fb3e2befSFlorian Hahn 655fb3e2befSFlorian Hahndefine i1 @test_shl_const_nsw_unsigned_11(i8 %start, i8 %high) { 656fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_nsw_unsigned_11( 657fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 658fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_5:%.*]] = shl nsw i8 [[START:%.*]], 5 659fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult i8 [[START]], [[START_SHL_5]] 660fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 661fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_3:%.*]] = shl nsw i8 [[START]], 3 662fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[START_SHL_5]], [[START_SHL_3]] 663fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[C_1]] 664fb3e2befSFlorian Hahn; 665fb3e2befSFlorian Hahnentry: 666fb3e2befSFlorian Hahn %start.shl.5 = shl nsw i8 %start, 5 667fb3e2befSFlorian Hahn %c.0 = icmp ult i8 %start, %start.shl.5 668fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.0) 669fb3e2befSFlorian Hahn 670fb3e2befSFlorian Hahn %start.shl.3 = shl nsw i8 %start, 3 671fb3e2befSFlorian Hahn %c.1 = icmp ule i8 %start.shl.5, %start.shl.3 672fb3e2befSFlorian Hahn ret i1 %c.1 673fb3e2befSFlorian Hahn} 674fb3e2befSFlorian Hahn 675fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nsw_unsigned_1(i8 %start, i8 %high) { 676fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nsw_unsigned_1( 677fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 678fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3 679fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nsw i8 [[ADD]], 4 680fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 681fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 682fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]] 683fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_1]] 684fb3e2befSFlorian Hahn; 685fb3e2befSFlorian Hahnentry: 686fb3e2befSFlorian Hahn %add = add nsw i8 %start, 3 687fb3e2befSFlorian Hahn %start.shl.4 = shl nsw i8 %add, 4 688fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 689fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 690fb3e2befSFlorian Hahn 691fb3e2befSFlorian Hahn %t.1 = icmp ult i8 %start, %high 692fb3e2befSFlorian Hahn ret i1 %t.1 693fb3e2befSFlorian Hahn} 694fb3e2befSFlorian Hahn 695fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nsw_unsigned_2(i8 %start, i8 %high) { 696fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nsw_unsigned_2( 697fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 698fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3 699fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nsw i8 [[ADD]], 4 700fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 701fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 702fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nsw i8 [[START]], 2 703fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_2:%.*]] = icmp ult i8 [[START_SHL_2]], [[HIGH]] 704fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_2]] 705fb3e2befSFlorian Hahn; 706fb3e2befSFlorian Hahnentry: 707fb3e2befSFlorian Hahn %add = add nsw i8 %start, 3 708fb3e2befSFlorian Hahn %start.shl.4 = shl nsw i8 %add, 4 709fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 710fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 711fb3e2befSFlorian Hahn 712fb3e2befSFlorian Hahn %start.shl.2 = shl nsw i8 %start, 2 713fb3e2befSFlorian Hahn %t.2 = icmp ult i8 %start.shl.2, %high 714fb3e2befSFlorian Hahn ret i1 %t.2 715fb3e2befSFlorian Hahn} 716fb3e2befSFlorian Hahn 717fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nsw_unsigned_3(i8 %start, i8 %high) { 718fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nsw_unsigned_3( 719fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 720fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3 721fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nsw i8 [[ADD]], 4 722fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 723fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 724fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 725fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]] 726fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_3:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_SHL_4]] 727fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_3]] 728fb3e2befSFlorian Hahn; 729fb3e2befSFlorian Hahnentry: 730fb3e2befSFlorian Hahn %add = add nsw i8 %start, 3 731fb3e2befSFlorian Hahn %start.shl.4 = shl nsw i8 %add, 4 732fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 733fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 734fb3e2befSFlorian Hahn 735fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 736fb3e2befSFlorian Hahn %start.add.2 = add nsw i8 %start.add.1, %start.add.1 737fb3e2befSFlorian Hahn %t.3 = icmp ule i8 %start.add.2, %start.shl.4 738fb3e2befSFlorian Hahn ret i1 %t.3 739fb3e2befSFlorian Hahn} 740fb3e2befSFlorian Hahn 741fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nsw_unsigned_4(i8 %start, i8 %high) { 742fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nsw_unsigned_4( 743fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 744fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3 745fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nsw i8 [[ADD]], 4 746fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 747fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 748fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nsw i8 [[START]], 2 749fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 750fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]] 751fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_4:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_SHL_4]] 752fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_4]] 753fb3e2befSFlorian Hahn; 754fb3e2befSFlorian Hahnentry: 755fb3e2befSFlorian Hahn %add = add nsw i8 %start, 3 756fb3e2befSFlorian Hahn %start.shl.4 = shl nsw i8 %add, 4 757fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 758fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 759fb3e2befSFlorian Hahn 760fb3e2befSFlorian Hahn %start.shl.2 = shl nsw i8 %start, 2 761fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 762fb3e2befSFlorian Hahn %start.add.2 = add nsw i8 %start.add.1, %start.add.1 763fb3e2befSFlorian Hahn %t.4 = icmp ult i8 %start.add.2, %start.shl.4 764fb3e2befSFlorian Hahn ret i1 %t.4 765fb3e2befSFlorian Hahn} 766fb3e2befSFlorian Hahn 767fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nsw_unsigned_5(i8 %start, i8 %high) { 768fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nsw_unsigned_5( 769fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 770fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3 771fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nsw i8 [[ADD]], 4 772fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 773fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 774fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 775fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]] 776fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_12:%.*]] = add nsw i8 [[START_ADD_2]], 12 777fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_5:%.*]] = icmp ule i8 [[START_ADD_2_12]], [[START_SHL_4]] 778fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_5]] 779fb3e2befSFlorian Hahn; 780fb3e2befSFlorian Hahnentry: 781fb3e2befSFlorian Hahn %add = add nsw i8 %start, 3 782fb3e2befSFlorian Hahn %start.shl.4 = shl nsw i8 %add, 4 783fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 784fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 785fb3e2befSFlorian Hahn 786fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 787fb3e2befSFlorian Hahn %start.add.2 = add nsw i8 %start.add.1, %start.add.1 788fb3e2befSFlorian Hahn %start.add.2.12 = add nsw i8 %start.add.2, 12 789fb3e2befSFlorian Hahn %t.5 = icmp ule i8 %start.add.2.12, %start.shl.4 790fb3e2befSFlorian Hahn ret i1 %t.5 791fb3e2befSFlorian Hahn} 792fb3e2befSFlorian Hahn 793fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_nsw_unsigned_6(i8 %start, i8 %high) { 794fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_nsw_unsigned_6( 795fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 796fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3 797fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nsw i8 [[ADD]], 4 798fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 799fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 800fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 801fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]] 802fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_13:%.*]] = add nsw i8 [[START_ADD_2]], 13 803fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[START_ADD_2_13]], [[START_SHL_4]] 804fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_1]] 805fb3e2befSFlorian Hahn; 806fb3e2befSFlorian Hahnentry: 807fb3e2befSFlorian Hahn %add = add nsw i8 %start, 3 808fb3e2befSFlorian Hahn %start.shl.4 = shl nsw i8 %add, 4 809fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 810fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 811fb3e2befSFlorian Hahn 812fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 813fb3e2befSFlorian Hahn %start.add.2 = add nsw i8 %start.add.1, %start.add.1 814fb3e2befSFlorian Hahn %start.add.2.13 = add nsw i8 %start.add.2, 13 815fb3e2befSFlorian Hahn %f.1 = icmp ule i8 %start.add.2.13, %start.shl.4 816fb3e2befSFlorian Hahn ret i1 %f.1 817fb3e2befSFlorian Hahn} 818fb3e2befSFlorian Hahn 819fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_1(i8 %start, i8 %high) { 820fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_1( 821fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 822fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl i8 [[START:%.*]], 4 823fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 824fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 825fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]] 826fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_1]] 827fb3e2befSFlorian Hahn; 828fb3e2befSFlorian Hahnentry: 829fb3e2befSFlorian Hahn %start.shl.4 = shl i8 %start, 4 830fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 831fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 832fb3e2befSFlorian Hahn 833fb3e2befSFlorian Hahn %t.1 = icmp ult i8 %start, %high 834fb3e2befSFlorian Hahn ret i1 %t.1 835fb3e2befSFlorian Hahn} 836fb3e2befSFlorian Hahn 837fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_2(i8 %start, i8 %high) { 838fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_2( 839fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 840fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl i8 [[START:%.*]], 4 841fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 842fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 843fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl i8 [[START]], 2 844fb3e2befSFlorian Hahn; CHECK-NEXT: [[T:%.*]] = icmp ult i8 [[START_SHL_2]], [[HIGH]] 845fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T]] 846fb3e2befSFlorian Hahn; 847fb3e2befSFlorian Hahnentry: 848fb3e2befSFlorian Hahn %start.shl.4 = shl i8 %start, 4 849fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 850fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 851fb3e2befSFlorian Hahn 852fb3e2befSFlorian Hahn %start.shl.2 = shl i8 %start, 2 853fb3e2befSFlorian Hahn %t = icmp ult i8 %start.shl.2, %high 854fb3e2befSFlorian Hahn ret i1 %t 855fb3e2befSFlorian Hahn} 856fb3e2befSFlorian Hahn 857fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_3(i8 %start, i8 %high) { 858fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_3( 859fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 860fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl i8 [[START:%.*]], 4 861fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 862fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 863fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl i8 [[START]], 2 864fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 865fb3e2befSFlorian Hahn; CHECK-NEXT: [[T:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_SHL_2]] 866fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T]] 867fb3e2befSFlorian Hahn; 868fb3e2befSFlorian Hahnentry: 869fb3e2befSFlorian Hahn %start.shl.4 = shl i8 %start, 4 870fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 871fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 872fb3e2befSFlorian Hahn 873fb3e2befSFlorian Hahn %start.shl.2 = shl i8 %start, 2 874fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 875fb3e2befSFlorian Hahn %t = icmp ule i8 %start.add.1, %start.shl.2 876fb3e2befSFlorian Hahn ret i1 %t 877fb3e2befSFlorian Hahn} 878fb3e2befSFlorian Hahn 879fb3e2befSFlorian Hahn 880fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_4(i8 %start, i8 %high) { 881fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_4( 882fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 883fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl i8 [[START:%.*]], 4 884fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 885fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 886fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl i8 [[START]], 2 887fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 888fb3e2befSFlorian Hahn; CHECK-NEXT: [[F:%.*]] = icmp ult i8 [[START_ADD_1]], [[START_SHL_2]] 889fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F]] 890fb3e2befSFlorian Hahn; 891fb3e2befSFlorian Hahnentry: 892fb3e2befSFlorian Hahn %start.shl.4 = shl i8 %start, 4 893fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 894fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 895fb3e2befSFlorian Hahn 896fb3e2befSFlorian Hahn %start.shl.2 = shl i8 %start, 2 897fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 898fb3e2befSFlorian Hahn %f = icmp ult i8 %start.add.1, %start.shl.2 899fb3e2befSFlorian Hahn ret i1 %f 900fb3e2befSFlorian Hahn} 901fb3e2befSFlorian Hahn 902fb3e2befSFlorian Hahn 903fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_5(i8 %start, i8 %high) { 904fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_5( 905fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 906fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl i8 [[START:%.*]], 4 907fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 908fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 909fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 910fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]] 911fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_4:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_SHL_4]] 912fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_4]] 913fb3e2befSFlorian Hahn; 914fb3e2befSFlorian Hahnentry: 915fb3e2befSFlorian Hahn %start.shl.4 = shl i8 %start, 4 916fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 917fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 918fb3e2befSFlorian Hahn 919fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 920fb3e2befSFlorian Hahn %start.add.2 = add i8 %start.add.1, %start.add.1 921fb3e2befSFlorian Hahn %t.4 = icmp ule i8 %start.add.2, %start.shl.4 922fb3e2befSFlorian Hahn ret i1 %t.4 923fb3e2befSFlorian Hahn} 924fb3e2befSFlorian Hahn 925fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_6(i8 %start, i8 %high) { 926fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_6( 927fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 928fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl i8 [[START:%.*]], 4 929fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 930fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 931fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 932fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]] 933fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_2:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_SHL_4]] 934fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_2]] 935fb3e2befSFlorian Hahn; 936fb3e2befSFlorian Hahnentry: 937fb3e2befSFlorian Hahn %start.shl.4 = shl i8 %start, 4 938fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 939fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 940fb3e2befSFlorian Hahn 941fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 942fb3e2befSFlorian Hahn %start.add.2 = add i8 %start.add.1, %start.add.1 943fb3e2befSFlorian Hahn %f.2 = icmp ult i8 %start.add.2, %start.shl.4 944fb3e2befSFlorian Hahn ret i1 %f.2 945fb3e2befSFlorian Hahn} 946fb3e2befSFlorian Hahn 947fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_7(i8 %start, i8 %high) { 948fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_7( 949fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 950fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl i8 [[START:%.*]], 4 951fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 952fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 953fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl i8 [[START]], 2 954fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 955fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]] 956fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add i8 [[START_ADD_2]], 1 957fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_3:%.*]] = icmp ule i8 [[START_ADD_2_1]], [[START_SHL_4]] 958fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_3]] 959fb3e2befSFlorian Hahn; 960fb3e2befSFlorian Hahnentry: 961fb3e2befSFlorian Hahn %start.shl.4 = shl i8 %start, 4 962fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 963fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 964fb3e2befSFlorian Hahn 965fb3e2befSFlorian Hahn %start.shl.2 = shl i8 %start, 2 966fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 967fb3e2befSFlorian Hahn %start.add.2 = add i8 %start.add.1, %start.add.1 968fb3e2befSFlorian Hahn %start.add.2.1 = add i8 %start.add.2, 1 969fb3e2befSFlorian Hahn %f.3 = icmp ule i8 %start.add.2.1, %start.shl.4 970fb3e2befSFlorian Hahn ret i1 %f.3 971fb3e2befSFlorian Hahn} 972fb3e2befSFlorian Hahn 973fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_8(i8 %start, i8 %high) { 974fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_8( 975fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 976fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl i8 [[START:%.*]], 4 977fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 978fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 979fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl i8 [[START]], 2 980fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 981fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]] 982fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add i8 [[START_ADD_2]], 1 983fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_3:%.*]] = shl i8 [[START]], 3 984fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_5:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_SHL_3]] 985fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_5]] 986fb3e2befSFlorian Hahn; 987fb3e2befSFlorian Hahnentry: 988fb3e2befSFlorian Hahn %start.shl.4 = shl i8 %start, 4 989fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 990fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 991fb3e2befSFlorian Hahn 992fb3e2befSFlorian Hahn %start.shl.2 = shl i8 %start, 2 993fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 994fb3e2befSFlorian Hahn %start.add.2 = add i8 %start.add.1, %start.add.1 995fb3e2befSFlorian Hahn %start.add.2.1 = add i8 %start.add.2, 1 996fb3e2befSFlorian Hahn %start.shl.3 = shl i8 %start, 3 997fb3e2befSFlorian Hahn %t.5 = icmp ule i8 %start.add.1, %start.shl.3 998fb3e2befSFlorian Hahn ret i1 %t.5 999fb3e2befSFlorian Hahn} 1000fb3e2befSFlorian Hahn 1001fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_9(i8 %start, i8 %high) { 1002fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_9( 1003fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1004fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl i8 [[START:%.*]], 4 1005fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 1006fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1007fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl i8 [[START]], 2 1008fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 1009fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]] 1010fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add i8 [[START_ADD_2]], 1 1011fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_3:%.*]] = shl i8 [[START]], 3 1012fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_5:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_SHL_3]] 1013fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_5]] 1014fb3e2befSFlorian Hahn; 1015fb3e2befSFlorian Hahnentry: 1016fb3e2befSFlorian Hahn %start.shl.4 = shl i8 %start, 4 1017fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 1018fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1019fb3e2befSFlorian Hahn 1020fb3e2befSFlorian Hahn %start.shl.2 = shl i8 %start, 2 1021fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 1022fb3e2befSFlorian Hahn %start.add.2 = add i8 %start.add.1, %start.add.1 1023fb3e2befSFlorian Hahn %start.add.2.1 = add i8 %start.add.2, 1 1024fb3e2befSFlorian Hahn %start.shl.3 = shl i8 %start, 3 1025fb3e2befSFlorian Hahn %f.5 = icmp ult i8 %start.add.2, %start.shl.3 1026fb3e2befSFlorian Hahn ret i1 %f.5 1027fb3e2befSFlorian Hahn} 1028fb3e2befSFlorian Hahn 1029fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_10(i8 %start, i8 %high) { 1030fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_10( 1031fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1032fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_5:%.*]] = shl i8 [[START:%.*]], 5 1033fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult i8 [[START]], [[START_SHL_5]] 1034fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 1035fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_3:%.*]] = shl i8 [[START]], 3 1036fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[START_SHL_3]], [[START_SHL_5]] 1037fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_1]] 1038fb3e2befSFlorian Hahn; 1039fb3e2befSFlorian Hahnentry: 1040fb3e2befSFlorian Hahn %start.shl.5 = shl i8 %start, 5 1041fb3e2befSFlorian Hahn %c.0 = icmp ult i8 %start, %start.shl.5 1042fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.0) 1043fb3e2befSFlorian Hahn 1044fb3e2befSFlorian Hahn %start.shl.3 = shl i8 %start, 3 1045fb3e2befSFlorian Hahn %t.1 = icmp ule i8 %start.shl.3, %start.shl.5 1046fb3e2befSFlorian Hahn ret i1 %t.1 1047fb3e2befSFlorian Hahn} 1048fb3e2befSFlorian Hahn 1049fb3e2befSFlorian Hahndefine i1 @test_shl_const_no_nuw_unsigned_11(i8 %start, i8 %high) { 1050fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_const_no_nuw_unsigned_11( 1051fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1052fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_5:%.*]] = shl i8 [[START:%.*]], 5 1053fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult i8 [[START]], [[START_SHL_5]] 1054fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 1055fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_3:%.*]] = shl i8 [[START]], 3 1056fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[START_SHL_5]], [[START_SHL_3]] 1057fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[C_1]] 1058fb3e2befSFlorian Hahn; 1059fb3e2befSFlorian Hahnentry: 1060fb3e2befSFlorian Hahn %start.shl.5 = shl i8 %start, 5 1061fb3e2befSFlorian Hahn %c.0 = icmp ult i8 %start, %start.shl.5 1062fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.0) 1063fb3e2befSFlorian Hahn 1064fb3e2befSFlorian Hahn %start.shl.3 = shl i8 %start, 3 1065fb3e2befSFlorian Hahn %c.1 = icmp ule i8 %start.shl.5, %start.shl.3 1066fb3e2befSFlorian Hahn ret i1 %c.1 1067fb3e2befSFlorian Hahn} 1068fb3e2befSFlorian Hahn 1069fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_no_nuw_unsigned_1(i8 %start, i8 %high) { 1070fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_no_nuw_unsigned_1( 1071fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1072fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add i8 [[START:%.*]], 3 1073fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl i8 [[ADD]], 4 1074fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 1075fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1076fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]] 1077fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_1]] 1078fb3e2befSFlorian Hahn; 1079fb3e2befSFlorian Hahnentry: 1080fb3e2befSFlorian Hahn %add = add i8 %start, 3 1081fb3e2befSFlorian Hahn %start.shl.4 = shl i8 %add, 4 1082fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 1083fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1084fb3e2befSFlorian Hahn 1085fb3e2befSFlorian Hahn %t.1 = icmp ult i8 %start, %high 1086fb3e2befSFlorian Hahn ret i1 %t.1 1087fb3e2befSFlorian Hahn} 1088fb3e2befSFlorian Hahn 1089fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_no_nuw_unsigned_2(i8 %start, i8 %high) { 1090fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_no_nuw_unsigned_2( 1091fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1092fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add i8 [[START:%.*]], 3 1093fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl i8 [[ADD]], 4 1094fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 1095fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1096fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl i8 [[START]], 2 1097fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_2:%.*]] = icmp ult i8 [[START_SHL_2]], [[HIGH]] 1098fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_2]] 1099fb3e2befSFlorian Hahn; 1100fb3e2befSFlorian Hahnentry: 1101fb3e2befSFlorian Hahn %add = add i8 %start, 3 1102fb3e2befSFlorian Hahn %start.shl.4 = shl i8 %add, 4 1103fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 1104fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1105fb3e2befSFlorian Hahn 1106fb3e2befSFlorian Hahn %start.shl.2 = shl i8 %start, 2 1107fb3e2befSFlorian Hahn %t.2 = icmp ult i8 %start.shl.2, %high 1108fb3e2befSFlorian Hahn ret i1 %t.2 1109fb3e2befSFlorian Hahn} 1110fb3e2befSFlorian Hahn 1111fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_no_nuw_unsigned_3(i8 %start, i8 %high) { 1112fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_no_nuw_unsigned_3( 1113fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1114fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add i8 [[START:%.*]], 3 1115fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl i8 [[ADD]], 4 1116fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 1117fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1118fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 1119fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]] 1120fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_3:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_SHL_4]] 1121fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_3]] 1122fb3e2befSFlorian Hahn; 1123fb3e2befSFlorian Hahnentry: 1124fb3e2befSFlorian Hahn %add = add i8 %start, 3 1125fb3e2befSFlorian Hahn %start.shl.4 = shl i8 %add, 4 1126fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 1127fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1128fb3e2befSFlorian Hahn 1129fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 1130fb3e2befSFlorian Hahn %start.add.2 = add i8 %start.add.1, %start.add.1 1131fb3e2befSFlorian Hahn %t.3 = icmp ule i8 %start.add.2, %start.shl.4 1132fb3e2befSFlorian Hahn ret i1 %t.3 1133fb3e2befSFlorian Hahn} 1134fb3e2befSFlorian Hahn 1135fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_no_nuw_unsigned_4(i8 %start, i8 %high) { 1136fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_no_nuw_unsigned_4( 1137fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1138fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add i8 [[START:%.*]], 3 1139fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl i8 [[ADD]], 4 1140fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 1141fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1142fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_2:%.*]] = shl i8 [[START]], 2 1143fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 1144fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]] 1145fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_4:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_SHL_4]] 1146fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_4]] 1147fb3e2befSFlorian Hahn; 1148fb3e2befSFlorian Hahnentry: 1149fb3e2befSFlorian Hahn %add = add i8 %start, 3 1150fb3e2befSFlorian Hahn %start.shl.4 = shl i8 %add, 4 1151fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 1152fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1153fb3e2befSFlorian Hahn 1154fb3e2befSFlorian Hahn %start.shl.2 = shl i8 %start, 2 1155fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 1156fb3e2befSFlorian Hahn %start.add.2 = add i8 %start.add.1, %start.add.1 1157fb3e2befSFlorian Hahn %t.4 = icmp ult i8 %start.add.2, %start.shl.4 1158fb3e2befSFlorian Hahn ret i1 %t.4 1159fb3e2befSFlorian Hahn} 1160fb3e2befSFlorian Hahn 1161fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_no_nuw_unsigned_5(i8 %start, i8 %high) { 1162fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_no_nuw_unsigned_5( 1163fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1164fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add i8 [[START:%.*]], 3 1165fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl i8 [[ADD]], 4 1166fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 1167fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1168fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 1169fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]] 1170fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_12:%.*]] = add i8 [[START_ADD_2]], 12 1171fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_5:%.*]] = icmp ule i8 [[START_ADD_2_12]], [[START_SHL_4]] 1172fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_5]] 1173fb3e2befSFlorian Hahn; 1174fb3e2befSFlorian Hahnentry: 1175fb3e2befSFlorian Hahn %add = add i8 %start, 3 1176fb3e2befSFlorian Hahn %start.shl.4 = shl i8 %add, 4 1177fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 1178fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1179fb3e2befSFlorian Hahn 1180fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 1181fb3e2befSFlorian Hahn %start.add.2 = add i8 %start.add.1, %start.add.1 1182fb3e2befSFlorian Hahn %start.add.2.12 = add i8 %start.add.2, 12 1183fb3e2befSFlorian Hahn %t.5 = icmp ule i8 %start.add.2.12, %start.shl.4 1184fb3e2befSFlorian Hahn ret i1 %t.5 1185fb3e2befSFlorian Hahn} 1186fb3e2befSFlorian Hahn 1187fb3e2befSFlorian Hahndefine i1 @test_shl_add_const_no_nuw_unsigned_6(i8 %start, i8 %high) { 1188fb3e2befSFlorian Hahn; CHECK-LABEL: @test_shl_add_const_no_nuw_unsigned_6( 1189fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1190fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add i8 [[START:%.*]], 3 1191fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_SHL_4:%.*]] = shl i8 [[ADD]], 4 1192fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] 1193fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1194fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 1195fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]] 1196fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_13:%.*]] = add i8 [[START_ADD_2]], 13 1197fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[START_ADD_2_13]], [[START_SHL_4]] 1198fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_1]] 1199fb3e2befSFlorian Hahn; 1200fb3e2befSFlorian Hahnentry: 1201fb3e2befSFlorian Hahn %add = add i8 %start, 3 1202fb3e2befSFlorian Hahn %start.shl.4 = shl i8 %add, 4 1203fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.shl.4, %high 1204fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1205fb3e2befSFlorian Hahn 1206fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 1207fb3e2befSFlorian Hahn %start.add.2 = add i8 %start.add.1, %start.add.1 1208fb3e2befSFlorian Hahn %start.add.2.13 = add i8 %start.add.2, 13 1209fb3e2befSFlorian Hahn %f.1 = icmp ule i8 %start.add.2.13, %start.shl.4 1210fb3e2befSFlorian Hahn ret i1 %f.1 1211fb3e2befSFlorian Hahn} 12127faa8c6eSZain Jaffal 12137faa8c6eSZain Jaffaldefine i1 @shl_overflow(i64 %start) { 12147faa8c6eSZain Jaffal; CHECK-LABEL: @shl_overflow( 12157faa8c6eSZain Jaffal; CHECK-NEXT: entry: 12167faa8c6eSZain Jaffal; CHECK-NEXT: [[PRE_COND:%.*]] = icmp ugt i64 [[START:%.*]], 0 12177faa8c6eSZain Jaffal; CHECK-NEXT: br i1 [[PRE_COND]], label [[MAIN:%.*]], label [[EXIT:%.*]] 12187faa8c6eSZain Jaffal; CHECK: main: 12197faa8c6eSZain Jaffal; CHECK-NEXT: [[TMP0:%.*]] = shl nuw nsw i64 [[START]], -1 12207faa8c6eSZain Jaffal; CHECK-NEXT: [[TMP1:%.*]] = icmp uge i64 [[TMP0]], [[START]] 12217faa8c6eSZain Jaffal; CHECK-NEXT: ret i1 [[TMP1]] 12227faa8c6eSZain Jaffal; CHECK: exit: 12237faa8c6eSZain Jaffal; CHECK-NEXT: ret i1 false 12247faa8c6eSZain Jaffal; 12257faa8c6eSZain Jaffalentry: 12267faa8c6eSZain Jaffal %pre.cond = icmp ugt i64 %start, 0 12277faa8c6eSZain Jaffal br i1 %pre.cond, label %main, label %exit 12287faa8c6eSZain Jaffal 12297faa8c6eSZain Jaffalmain: 12307faa8c6eSZain Jaffal %0 = shl nuw nsw i64 %start, -1 12317faa8c6eSZain Jaffal %1 = icmp uge i64 %0, %start 12327faa8c6eSZain Jaffal ret i1 %1 12337faa8c6eSZain Jaffal 12347faa8c6eSZain Jaffalexit: 12357faa8c6eSZain Jaffal ret i1 0 12367faa8c6eSZain Jaffal} 12377faa8c6eSZain Jaffal 12387faa8c6eSZain Jaffal 12397faa8c6eSZain Jaffaldefine i1 @shl_overflow_2() { 12407faa8c6eSZain Jaffal; CHECK-LABEL: @shl_overflow_2( 12417faa8c6eSZain Jaffal; CHECK-NEXT: entry: 12427faa8c6eSZain Jaffal; CHECK-NEXT: [[SHL_UB:%.*]] = shl nuw nsw i256 0, 64 12437faa8c6eSZain Jaffal; CHECK-NEXT: [[SHL_CMP:%.*]] = icmp uge i256 [[SHL_UB]], 0 12447faa8c6eSZain Jaffal; CHECK-NEXT: ret i1 [[SHL_CMP]] 12457faa8c6eSZain Jaffal; 12467faa8c6eSZain Jaffalentry: 12477faa8c6eSZain Jaffal %shl.ub = shl nuw nsw i256 0, 64 12487faa8c6eSZain Jaffal %shl.cmp = icmp uge i256 %shl.ub, 0 12497faa8c6eSZain Jaffal ret i1 %shl.cmp 12507faa8c6eSZain Jaffal} 12517faa8c6eSZain Jaffal 12527faa8c6eSZain Jaffaldefine i1 @shl_overflow_3() { 12537faa8c6eSZain Jaffal; CHECK-LABEL: @shl_overflow_3( 12547faa8c6eSZain Jaffal; CHECK-NEXT: entry: 12557faa8c6eSZain Jaffal; CHECK-NEXT: [[SHL_UB:%.*]] = shl nuw nsw i256 0, 65 12567faa8c6eSZain Jaffal; CHECK-NEXT: [[SHL_CMP:%.*]] = icmp uge i256 [[SHL_UB]], 0 12577faa8c6eSZain Jaffal; CHECK-NEXT: ret i1 [[SHL_CMP]] 12587faa8c6eSZain Jaffal; 12597faa8c6eSZain Jaffalentry: 12607faa8c6eSZain Jaffal %shl.ub = shl nuw nsw i256 0, 65 12617faa8c6eSZain Jaffal %shl.cmp = icmp uge i256 %shl.ub, 0 12627faa8c6eSZain Jaffal ret i1 %shl.cmp 12637faa8c6eSZain Jaffal} 12642cf632a3SVitaly Buka 12652cf632a3SVitaly Bukadefine i1 @shl_55() { 12662cf632a3SVitaly Buka; CHECK-LABEL: @shl_55( 12672cf632a3SVitaly Buka; CHECK-NEXT: entry: 12682cf632a3SVitaly Buka; CHECK-NEXT: [[SHL_UB:%.*]] = shl nuw nsw i256 1, 55 12691d43096eSNikita Popov; CHECK-NEXT: [[SHL_CMP:%.*]] = icmp uge i256 [[SHL_UB]], 1 12701d43096eSNikita Popov; CHECK-NEXT: ret i1 [[SHL_CMP]] 12712cf632a3SVitaly Buka; 12722cf632a3SVitaly Bukaentry: 12732cf632a3SVitaly Buka %shl.ub = shl nuw nsw i256 1, 55 12742cf632a3SVitaly Buka %shl.cmp = icmp uge i256 %shl.ub, 1 12752cf632a3SVitaly Buka ret i1 %shl.cmp 12762cf632a3SVitaly Buka} 1277db34a947SNikita Popov 1278db34a947SNikita Popovdefine i1 @shl_nsw_x8_slt_x7(i8 %start, i8 %high) { 1279db34a947SNikita Popov; CHECK-LABEL: @shl_nsw_x8_slt_x7( 1280db34a947SNikita Popov; CHECK-NEXT: [[C_0:%.*]] = icmp sge i8 [[HIGH:%.*]], 0 1281db34a947SNikita Popov; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 1282db34a947SNikita Popov; CHECK-NEXT: [[START_SHL_3:%.*]] = shl nsw i8 [[START:%.*]], 3 1283db34a947SNikita Popov; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[START_SHL_3]], [[HIGH]] 1284db34a947SNikita Popov; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1285db34a947SNikita Popov; CHECK-NEXT: [[START_MUL_7:%.*]] = mul nsw i8 [[START]], 7 1286*71f56e49SNikita Popov; CHECK-NEXT: ret i1 true 1287db34a947SNikita Popov; 1288db34a947SNikita Popov %c.0 = icmp sge i8 %high, 0 1289db34a947SNikita Popov call void @llvm.assume(i1 %c.0) 1290db34a947SNikita Popov 1291db34a947SNikita Popov %start.shl.3 = shl nsw i8 %start, 3 1292db34a947SNikita Popov %c.1 = icmp slt i8 %start.shl.3, %high 1293db34a947SNikita Popov call void @llvm.assume(i1 %c.1) 1294db34a947SNikita Popov 1295db34a947SNikita Popov %start.mul.7 = mul nsw i8 %start, 7 1296db34a947SNikita Popov %t.1 = icmp slt i8 %start.mul.7, %high 1297db34a947SNikita Popov ret i1 %t.1 1298db34a947SNikita Popov} 1299db34a947SNikita Popov 1300db34a947SNikita Popovdefine i1 @shl_nsw_x8_not_slt_x9(i8 %start, i8 %high) { 1301db34a947SNikita Popov; CHECK-LABEL: @shl_nsw_x8_not_slt_x9( 1302db34a947SNikita Popov; CHECK-NEXT: [[C_0:%.*]] = icmp sge i8 [[HIGH:%.*]], 0 1303db34a947SNikita Popov; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 1304db34a947SNikita Popov; CHECK-NEXT: [[START_SHL_3:%.*]] = shl nsw i8 [[START:%.*]], 3 1305db34a947SNikita Popov; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[START_SHL_3]], [[HIGH]] 1306db34a947SNikita Popov; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1307db34a947SNikita Popov; CHECK-NEXT: [[START_MUL_9:%.*]] = mul nsw i8 [[START]], 9 1308db34a947SNikita Popov; CHECK-NEXT: [[T_1:%.*]] = icmp slt i8 [[START_MUL_9]], [[HIGH]] 1309db34a947SNikita Popov; CHECK-NEXT: ret i1 [[T_1]] 1310db34a947SNikita Popov; 1311db34a947SNikita Popov %c.0 = icmp sge i8 %high, 0 1312db34a947SNikita Popov call void @llvm.assume(i1 %c.0) 1313db34a947SNikita Popov 1314db34a947SNikita Popov %start.shl.3 = shl nsw i8 %start, 3 1315db34a947SNikita Popov %c.1 = icmp slt i8 %start.shl.3, %high 1316db34a947SNikita Popov call void @llvm.assume(i1 %c.1) 1317db34a947SNikita Popov 1318db34a947SNikita Popov %start.mul.9 = mul nsw i8 %start, 9 1319db34a947SNikita Popov %t.1 = icmp slt i8 %start.mul.9, %high 1320db34a947SNikita Popov ret i1 %t.1 1321db34a947SNikita Popov} 1322db34a947SNikita Popov 1323db34a947SNikita Popovdefine i1 @shl_nsw_sign_implication(i8 %x) { 1324db34a947SNikita Popov; CHECK-LABEL: @shl_nsw_sign_implication( 1325db34a947SNikita Popov; CHECK-NEXT: [[SHL:%.*]] = shl nsw i8 [[X:%.*]], 2 1326db34a947SNikita Popov; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 [[X]], 0 1327db34a947SNikita Popov; CHECK-NEXT: br i1 [[CMP1]], label [[IF:%.*]], label [[ELSE:%.*]] 1328db34a947SNikita Popov; CHECK: if: 1329*71f56e49SNikita Popov; CHECK-NEXT: ret i1 true 1330db34a947SNikita Popov; CHECK: else: 1331*71f56e49SNikita Popov; CHECK-NEXT: ret i1 true 1332db34a947SNikita Popov; 1333db34a947SNikita Popov %shl = shl nsw i8 %x, 2 1334db34a947SNikita Popov %cmp1 = icmp slt i8 %x, 0 1335db34a947SNikita Popov br i1 %cmp1, label %if, label %else 1336db34a947SNikita Popov 1337db34a947SNikita Popovif: 1338db34a947SNikita Popov %cmp2 = icmp slt i8 %shl, 0 1339db34a947SNikita Popov ret i1 %cmp2 1340db34a947SNikita Popov 1341db34a947SNikita Popovelse: 1342db34a947SNikita Popov %cmp3 = icmp sge i8 %shl, 0 1343db34a947SNikita Popov ret i1 %cmp3 1344db34a947SNikita Popov} 1345db34a947SNikita Popov 1346db34a947SNikita Popovdefine i1 @shl_nsw_by_bw_minus_1(i64 %x) { 1347db34a947SNikita Popov; CHECK-LABEL: @shl_nsw_by_bw_minus_1( 1348db34a947SNikita Popov; CHECK-NEXT: [[X_SHL:%.*]] = shl nsw i64 [[X:%.*]], 63 1349db34a947SNikita Popov; CHECK-NEXT: [[C_1:%.*]] = icmp slt i64 [[X_SHL]], 0 1350db34a947SNikita Popov; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1351db34a947SNikita Popov; CHECK-NEXT: [[T_1:%.*]] = icmp slt i64 [[X]], 0 1352db34a947SNikita Popov; CHECK-NEXT: ret i1 [[T_1]] 1353db34a947SNikita Popov; 1354db34a947SNikita Popov %x.shl = shl nsw i64 %x, 63 1355db34a947SNikita Popov %c.1 = icmp slt i64 %x.shl, 0 1356db34a947SNikita Popov call void @llvm.assume(i1 %c.1) 1357db34a947SNikita Popov 1358db34a947SNikita Popov %t.1 = icmp slt i64 %x, 0 1359db34a947SNikita Popov ret i1 %t.1 1360db34a947SNikita Popov} 1361*71f56e49SNikita Popov 1362*71f56e49SNikita Popov; Shift returns poison in this case, just make sure we don't crash. 1363*71f56e49SNikita Popovdefine i1 @shl_nsw_by_bw(i64 %x) { 1364*71f56e49SNikita Popov; CHECK-LABEL: @shl_nsw_by_bw( 1365*71f56e49SNikita Popov; CHECK-NEXT: [[X_SHL:%.*]] = shl nsw i64 [[X:%.*]], 64 1366*71f56e49SNikita Popov; CHECK-NEXT: [[C_1:%.*]] = icmp slt i64 [[X_SHL]], 0 1367*71f56e49SNikita Popov; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1368*71f56e49SNikita Popov; CHECK-NEXT: [[T_1:%.*]] = icmp slt i64 [[X]], 0 1369*71f56e49SNikita Popov; CHECK-NEXT: ret i1 [[T_1]] 1370*71f56e49SNikita Popov; 1371*71f56e49SNikita Popov %x.shl = shl nsw i64 %x, 64 1372*71f56e49SNikita Popov %c.1 = icmp slt i64 %x.shl, 0 1373*71f56e49SNikita Popov call void @llvm.assume(i1 %c.1) 1374*71f56e49SNikita Popov 1375*71f56e49SNikita Popov %t.1 = icmp slt i64 %x, 0 1376*71f56e49SNikita Popov ret i1 %t.1 1377*71f56e49SNikita Popov} 1378*71f56e49SNikita Popov 1379*71f56e49SNikita Popov; Shift returns poison in this case, just make sure we don't crash. 1380*71f56e49SNikita Popovdefine i1 @shl_nsw_by_bw_plus_1(i64 %x) { 1381*71f56e49SNikita Popov; CHECK-LABEL: @shl_nsw_by_bw_plus_1( 1382*71f56e49SNikita Popov; CHECK-NEXT: [[X_SHL:%.*]] = shl nsw i64 [[X:%.*]], 65 1383*71f56e49SNikita Popov; CHECK-NEXT: [[C_1:%.*]] = icmp slt i64 [[X_SHL]], 0 1384*71f56e49SNikita Popov; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1385*71f56e49SNikita Popov; CHECK-NEXT: [[T_1:%.*]] = icmp slt i64 [[X]], 0 1386*71f56e49SNikita Popov; CHECK-NEXT: ret i1 [[T_1]] 1387*71f56e49SNikita Popov; 1388*71f56e49SNikita Popov %x.shl = shl nsw i64 %x, 65 1389*71f56e49SNikita Popov %c.1 = icmp slt i64 %x.shl, 0 1390*71f56e49SNikita Popov call void @llvm.assume(i1 %c.1) 1391*71f56e49SNikita Popov 1392*71f56e49SNikita Popov %t.1 = icmp slt i64 %x, 0 1393*71f56e49SNikita Popov ret i1 %t.1 1394*71f56e49SNikita Popov} 1395