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_mul_const_nuw_unsigned_1(i8 %start, i8 %high) { 7fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_1( 8fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 9fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4 10fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 11fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 12*fbcf8a8cSFlorian Hahn; CHECK-NEXT: ret i1 true 13fb3e2befSFlorian Hahn; 14fb3e2befSFlorian Hahnentry: 15fb3e2befSFlorian Hahn %start.mul.4 = mul nuw i8 %start, 4 16fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.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_mul_const_nuw_unsigned_2(i8 %start, i8 %high) { 24fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_2( 25fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 26fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4 27fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 28fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 29fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2 30*fbcf8a8cSFlorian Hahn; CHECK-NEXT: ret i1 true 31fb3e2befSFlorian Hahn; 32fb3e2befSFlorian Hahnentry: 33fb3e2befSFlorian Hahn %start.mul.4 = mul nuw i8 %start, 4 34fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 35fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 36fb3e2befSFlorian Hahn 37fb3e2befSFlorian Hahn %start.mul.2 = mul nuw i8 %start, 2 38fb3e2befSFlorian Hahn %t = icmp ult i8 %start.mul.2, %high 39fb3e2befSFlorian Hahn ret i1 %t 40fb3e2befSFlorian Hahn} 41fb3e2befSFlorian Hahn 42fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_3(i8 %start, i8 %high) { 43fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_3( 44fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 45fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4 46fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 47fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 48fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2 49fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 507c1b80e3SFlorian Hahn; CHECK-NEXT: ret i1 true 51fb3e2befSFlorian Hahn; 52fb3e2befSFlorian Hahnentry: 53fb3e2befSFlorian Hahn %start.mul.4 = mul nuw i8 %start, 4 54fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 55fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 56fb3e2befSFlorian Hahn 57fb3e2befSFlorian Hahn %start.mul.2 = mul nuw i8 %start, 2 58fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 59fb3e2befSFlorian Hahn %t = icmp ule i8 %start.add.1, %start.mul.2 60fb3e2befSFlorian Hahn ret i1 %t 61fb3e2befSFlorian Hahn} 62fb3e2befSFlorian Hahn 63fb3e2befSFlorian Hahn 64fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_4(i8 %start, i8 %high) { 65fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_4( 66fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 67fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4 68fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 69fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 70fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2 71fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 727c1b80e3SFlorian Hahn; CHECK-NEXT: ret i1 false 73fb3e2befSFlorian Hahn; 74fb3e2befSFlorian Hahnentry: 75fb3e2befSFlorian Hahn %start.mul.4 = mul nuw i8 %start, 4 76fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 77fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 78fb3e2befSFlorian Hahn 79fb3e2befSFlorian Hahn %start.mul.2 = mul nuw i8 %start, 2 80fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 81fb3e2befSFlorian Hahn %f = icmp ult i8 %start.add.1, %start.mul.2 82fb3e2befSFlorian Hahn ret i1 %f 83fb3e2befSFlorian Hahn} 84fb3e2befSFlorian Hahn 85fb3e2befSFlorian Hahn 86fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_5(i8 %start, i8 %high) { 87fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_5( 88fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 89fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4 90fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_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]] 947c1b80e3SFlorian Hahn; CHECK-NEXT: ret i1 true 95fb3e2befSFlorian Hahn; 96fb3e2befSFlorian Hahnentry: 97fb3e2befSFlorian Hahn %start.mul.4 = mul nuw i8 %start, 4 98fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.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.mul.4 104fb3e2befSFlorian Hahn ret i1 %t.4 105fb3e2befSFlorian Hahn} 106fb3e2befSFlorian Hahn 107fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_6(i8 %start, i8 %high) { 108fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_6( 109fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 110fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4 111fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_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]] 1157c1b80e3SFlorian Hahn; CHECK-NEXT: ret i1 false 116fb3e2befSFlorian Hahn; 117fb3e2befSFlorian Hahnentry: 118fb3e2befSFlorian Hahn %start.mul.4 = mul nuw i8 %start, 4 119fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 120fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 121fb3e2befSFlorian Hahn 122fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 123fb3e2befSFlorian Hahn %start.add.2 = add nuw i8 %start.add.1, %start.add.1 124fb3e2befSFlorian Hahn %f.2 = icmp ult i8 %start.add.2, %start.mul.4 125fb3e2befSFlorian Hahn ret i1 %f.2 126fb3e2befSFlorian Hahn} 127fb3e2befSFlorian Hahn 128fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_7(i8 %start, i8 %high) { 129fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_7( 130fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 131fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4 132fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 133fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 134fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2 135fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 136fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] 137fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add nuw i8 [[START_ADD_2]], 1 1387c1b80e3SFlorian Hahn; CHECK-NEXT: ret i1 false 139fb3e2befSFlorian Hahn; 140fb3e2befSFlorian Hahnentry: 141fb3e2befSFlorian Hahn %start.mul.4 = mul nuw i8 %start, 4 142fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 143fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 144fb3e2befSFlorian Hahn 145fb3e2befSFlorian Hahn %start.mul.2 = mul nuw i8 %start, 2 146fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 147fb3e2befSFlorian Hahn %start.add.2 = add nuw i8 %start.add.1, %start.add.1 148fb3e2befSFlorian Hahn %start.add.2.1 = add nuw i8 %start.add.2, 1 149fb3e2befSFlorian Hahn %f.3 = icmp ule i8 %start.add.2.1, %start.mul.4 150fb3e2befSFlorian Hahn ret i1 %f.3 151fb3e2befSFlorian Hahn} 152fb3e2befSFlorian Hahn 153fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_8(i8 %start, i8 %high) { 154fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_8( 155fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 156fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4 157fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 158fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 159fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2 160fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 161fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] 162fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add nuw i8 [[START_ADD_2]], 1 163fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nuw i8 [[START]], 3 164*fbcf8a8cSFlorian Hahn; CHECK-NEXT: ret i1 true 165fb3e2befSFlorian Hahn; 166fb3e2befSFlorian Hahnentry: 167fb3e2befSFlorian Hahn %start.mul.4 = mul nuw i8 %start, 4 168fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 169fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 170fb3e2befSFlorian Hahn 171fb3e2befSFlorian Hahn %start.mul.2 = mul nuw i8 %start, 2 172fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 173fb3e2befSFlorian Hahn %start.add.2 = add nuw i8 %start.add.1, %start.add.1 174fb3e2befSFlorian Hahn %start.add.2.1 = add nuw i8 %start.add.2, 1 175fb3e2befSFlorian Hahn %start.mul.3 = mul nuw i8 %start, 3 176fb3e2befSFlorian Hahn %t.5 = icmp ule i8 %start.add.1, %start.mul.3 177fb3e2befSFlorian Hahn ret i1 %t.5 178fb3e2befSFlorian Hahn} 179fb3e2befSFlorian Hahn 180fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_9(i8 %start, i8 %high) { 181fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_9( 182fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 183fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4 184fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 185fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 186fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2 187fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 188fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] 189fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add nuw i8 [[START_ADD_2]], 1 190fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nuw i8 [[START]], 3 191*fbcf8a8cSFlorian Hahn; CHECK-NEXT: ret i1 false 192fb3e2befSFlorian Hahn; 193fb3e2befSFlorian Hahnentry: 194fb3e2befSFlorian Hahn %start.mul.4 = mul nuw i8 %start, 4 195fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 196fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 197fb3e2befSFlorian Hahn 198fb3e2befSFlorian Hahn %start.mul.2 = mul nuw i8 %start, 2 199fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 200fb3e2befSFlorian Hahn %start.add.2 = add nuw i8 %start.add.1, %start.add.1 201fb3e2befSFlorian Hahn %start.add.2.1 = add nuw i8 %start.add.2, 1 202fb3e2befSFlorian Hahn %start.mul.3 = mul nuw i8 %start, 3 203fb3e2befSFlorian Hahn %f.5 = icmp ult i8 %start.add.2, %start.mul.3 204fb3e2befSFlorian Hahn ret i1 %f.5 205fb3e2befSFlorian Hahn} 206fb3e2befSFlorian Hahn 207fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_10(i8 %start, i8 %high) { 208fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_10( 209fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 210fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_5:%.*]] = mul nuw i8 [[START:%.*]], 5 211fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]] 212fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 213fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nuw i8 [[START]], 3 2147c1b80e3SFlorian Hahn; CHECK-NEXT: ret i1 true 215fb3e2befSFlorian Hahn; 216fb3e2befSFlorian Hahnentry: 217fb3e2befSFlorian Hahn %start.mul.5 = mul nuw i8 %start, 5 218fb3e2befSFlorian Hahn %c.0 = icmp ult i8 %start, %start.mul.5 219fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.0) 220fb3e2befSFlorian Hahn 221fb3e2befSFlorian Hahn %start.mul.3 = mul nuw i8 %start, 3 222fb3e2befSFlorian Hahn %t.1 = icmp ule i8 %start.mul.3, %start.mul.5 223fb3e2befSFlorian Hahn ret i1 %t.1 224fb3e2befSFlorian Hahn} 225fb3e2befSFlorian Hahn 226fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_11(i8 %start, i8 %high) { 227fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_11( 228fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 229fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_5:%.*]] = mul nuw i8 [[START:%.*]], 5 230fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]] 231fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 232fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nuw i8 [[START]], 3 2337c1b80e3SFlorian Hahn; CHECK-NEXT: ret i1 false 234fb3e2befSFlorian Hahn; 235fb3e2befSFlorian Hahnentry: 236fb3e2befSFlorian Hahn %start.mul.5 = mul nuw i8 %start, 5 237fb3e2befSFlorian Hahn %c.0 = icmp ult i8 %start, %start.mul.5 238fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.0) 239fb3e2befSFlorian Hahn 240fb3e2befSFlorian Hahn %start.mul.3 = mul nuw i8 %start, 3 241fb3e2befSFlorian Hahn %c.1 = icmp ule i8 %start.mul.5, %start.mul.3 242fb3e2befSFlorian Hahn ret i1 %c.1 243fb3e2befSFlorian Hahn} 244fb3e2befSFlorian Hahn 245fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_12(i8 %start) { 246fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_12( 247fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 248fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nuw i8 [[START:%.*]], 3 249fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START]], [[START_MUL_3]] 250fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 251fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_5:%.*]] = mul nuw i8 [[START]], 5 2527c1b80e3SFlorian Hahn; CHECK-NEXT: ret i1 true 253fb3e2befSFlorian Hahn; 254fb3e2befSFlorian Hahnentry: 255fb3e2befSFlorian Hahn %start.mul.3 = mul nuw i8 %start, 3 256fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start, %start.mul.3 257fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 258fb3e2befSFlorian Hahn 259fb3e2befSFlorian Hahn %start.mul.5 = mul nuw i8 %start, 5 260fb3e2befSFlorian Hahn %t.1 = icmp ule i8 %start.mul.3, %start.mul.5 261fb3e2befSFlorian Hahn ret i1 %t.1 262fb3e2befSFlorian Hahn} 263fb3e2befSFlorian Hahn 264fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_13(i8 %start) { 265fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_13( 266fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 267fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nuw i8 [[START:%.*]], 3 268fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START]], [[START_MUL_3]] 269fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 270fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_5:%.*]] = mul nuw i8 [[START]], 5 2717c1b80e3SFlorian Hahn; CHECK-NEXT: ret i1 false 272fb3e2befSFlorian Hahn; 273fb3e2befSFlorian Hahnentry: 274fb3e2befSFlorian Hahn %start.mul.3 = mul nuw i8 %start, 3 275fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start, %start.mul.3 276fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 277fb3e2befSFlorian Hahn 278fb3e2befSFlorian Hahn %start.mul.5 = mul nuw i8 %start, 5 279fb3e2befSFlorian Hahn %f.1 = icmp ule i8 %start.mul.5, %start.mul.3 280fb3e2befSFlorian Hahn ret i1 %f.1 281fb3e2befSFlorian Hahn} 282fb3e2befSFlorian Hahn 283fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_14(i8 %start) { 284fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_14( 285fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 286fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_5:%.*]] = mul nuw i8 [[START:%.*]], -5 287fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]] 288fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 289fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nuw i8 [[START]], -3 290fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[START_MUL_3]], [[START_MUL_5]] 291fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_1]] 292fb3e2befSFlorian Hahn; 293fb3e2befSFlorian Hahnentry: 294fb3e2befSFlorian Hahn %start.mul.5 = mul nuw i8 %start, -5 295fb3e2befSFlorian Hahn %c.0 = icmp ult i8 %start, %start.mul.5 296fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.0) 297fb3e2befSFlorian Hahn 298fb3e2befSFlorian Hahn %start.mul.3 = mul nuw i8 %start, -3 299fb3e2befSFlorian Hahn %t.1 = icmp ule i8 %start.mul.3, %start.mul.5 300fb3e2befSFlorian Hahn ret i1 %t.1 301fb3e2befSFlorian Hahn} 302fb3e2befSFlorian Hahn 303fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_unsigned_15(i8 %start) { 304fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_unsigned_15( 305fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 306fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_5:%.*]] = mul nuw i8 [[START:%.*]], -5 307fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]] 308fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 309fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nuw i8 [[START]], -3 310fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[START_MUL_5]], [[START_MUL_3]] 311fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[C_1]] 312fb3e2befSFlorian Hahn; 313fb3e2befSFlorian Hahnentry: 314fb3e2befSFlorian Hahn %start.mul.5 = mul nuw i8 %start, -5 315fb3e2befSFlorian Hahn %c.0 = icmp ult i8 %start, %start.mul.5 316fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.0) 317fb3e2befSFlorian Hahn 318fb3e2befSFlorian Hahn %start.mul.3 = mul nuw i8 %start, -3 319fb3e2befSFlorian Hahn %c.1 = icmp ule i8 %start.mul.5, %start.mul.3 320fb3e2befSFlorian Hahn ret i1 %c.1 321fb3e2befSFlorian Hahn} 322fb3e2befSFlorian Hahn 323fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_nsw_unsigned_16(i8 %start) { 324fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_nsw_unsigned_16( 325fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 326fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_5:%.*]] = mul nuw nsw i8 [[START:%.*]], -5 327fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]] 328fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 329fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nuw nsw i8 [[START]], -3 330fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[START_MUL_3]], [[START_MUL_5]] 331fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_1]] 332fb3e2befSFlorian Hahn; 333fb3e2befSFlorian Hahnentry: 334fb3e2befSFlorian Hahn %start.mul.5 = mul nuw nsw i8 %start, -5 335fb3e2befSFlorian Hahn %c.0 = icmp ult i8 %start, %start.mul.5 336fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.0) 337fb3e2befSFlorian Hahn 338fb3e2befSFlorian Hahn %start.mul.3 = mul nuw nsw i8 %start, -3 339fb3e2befSFlorian Hahn %t.1 = icmp ule i8 %start.mul.3, %start.mul.5 340fb3e2befSFlorian Hahn ret i1 %t.1 341fb3e2befSFlorian Hahn} 342fb3e2befSFlorian Hahn 343fb3e2befSFlorian Hahndefine i1 @test_mul_const_nuw_nsw_unsigned_17(i8 %start) { 344fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nuw_nsw_unsigned_17( 345fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 346fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_5:%.*]] = mul nuw nsw i8 [[START:%.*]], -5 347fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]] 348fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 349fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nuw nsw i8 [[START]], -3 350fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[START_MUL_5]], [[START_MUL_3]] 351fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[C_1]] 352fb3e2befSFlorian Hahn; 353fb3e2befSFlorian Hahnentry: 354fb3e2befSFlorian Hahn %start.mul.5 = mul nuw nsw i8 %start, -5 355fb3e2befSFlorian Hahn %c.0 = icmp ult i8 %start, %start.mul.5 356fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.0) 357fb3e2befSFlorian Hahn 358fb3e2befSFlorian Hahn %start.mul.3 = mul nuw nsw i8 %start, -3 359fb3e2befSFlorian Hahn %c.1 = icmp ule i8 %start.mul.5, %start.mul.3 360fb3e2befSFlorian Hahn ret i1 %c.1 361fb3e2befSFlorian Hahn} 362fb3e2befSFlorian Hahn 363fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nuw_unsigned_1(i8 %start, i8 %high) { 364fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nuw_unsigned_1( 365fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 366fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3 367fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nuw i8 [[ADD]], 4 368fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 369fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 370*fbcf8a8cSFlorian Hahn; CHECK-NEXT: ret i1 true 371fb3e2befSFlorian Hahn; 372fb3e2befSFlorian Hahnentry: 373fb3e2befSFlorian Hahn %add = add nuw i8 %start, 3 374fb3e2befSFlorian Hahn %start.mul.4 = mul nuw i8 %add, 4 375fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 376fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 377fb3e2befSFlorian Hahn 378fb3e2befSFlorian Hahn %t.1 = icmp ult i8 %start, %high 379fb3e2befSFlorian Hahn ret i1 %t.1 380fb3e2befSFlorian Hahn} 381fb3e2befSFlorian Hahn 382fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nuw_unsigned_2(i8 %start, i8 %high) { 383fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nuw_unsigned_2( 384fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 385fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3 386fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nuw i8 [[ADD]], 4 387fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 388fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 389fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2 390*fbcf8a8cSFlorian Hahn; CHECK-NEXT: ret i1 true 391fb3e2befSFlorian Hahn; 392fb3e2befSFlorian Hahnentry: 393fb3e2befSFlorian Hahn %add = add nuw i8 %start, 3 394fb3e2befSFlorian Hahn %start.mul.4 = mul nuw i8 %add, 4 395fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 396fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 397fb3e2befSFlorian Hahn 398fb3e2befSFlorian Hahn %start.mul.2 = mul nuw i8 %start, 2 399fb3e2befSFlorian Hahn %t.2 = icmp ult i8 %start.mul.2, %high 400fb3e2befSFlorian Hahn ret i1 %t.2 401fb3e2befSFlorian Hahn} 402fb3e2befSFlorian Hahn 403fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nuw_unsigned_3(i8 %start, i8 %high) { 404fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nuw_unsigned_3( 405fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 406fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3 407fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nuw i8 [[ADD]], 4 408fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 409fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 410fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 411fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] 4127c1b80e3SFlorian Hahn; CHECK-NEXT: ret i1 true 413fb3e2befSFlorian Hahn; 414fb3e2befSFlorian Hahnentry: 415fb3e2befSFlorian Hahn %add = add nuw i8 %start, 3 416fb3e2befSFlorian Hahn %start.mul.4 = mul nuw i8 %add, 4 417fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 418fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 419fb3e2befSFlorian Hahn 420fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 421fb3e2befSFlorian Hahn %start.add.2 = add nuw i8 %start.add.1, %start.add.1 422fb3e2befSFlorian Hahn %t.3 = icmp ule i8 %start.add.2, %start.mul.4 423fb3e2befSFlorian Hahn ret i1 %t.3 424fb3e2befSFlorian Hahn} 425fb3e2befSFlorian Hahn 426fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nuw_unsigned_4(i8 %start, i8 %high) { 427fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nuw_unsigned_4( 428fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 429fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3 430fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nuw i8 [[ADD]], 4 431fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 432fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 433fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2 434fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 435fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] 4367c1b80e3SFlorian Hahn; CHECK-NEXT: ret i1 true 437fb3e2befSFlorian Hahn; 438fb3e2befSFlorian Hahnentry: 439fb3e2befSFlorian Hahn %add = add nuw i8 %start, 3 440fb3e2befSFlorian Hahn %start.mul.4 = mul nuw i8 %add, 4 441fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 442fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 443fb3e2befSFlorian Hahn 444fb3e2befSFlorian Hahn %start.mul.2 = mul nuw i8 %start, 2 445fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 446fb3e2befSFlorian Hahn %start.add.2 = add nuw i8 %start.add.1, %start.add.1 447fb3e2befSFlorian Hahn %t.4 = icmp ult i8 %start.add.2, %start.mul.4 448fb3e2befSFlorian Hahn ret i1 %t.4 449fb3e2befSFlorian Hahn} 450fb3e2befSFlorian Hahn 451fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nuw_unsigned_5(i8 %start, i8 %high) { 452fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nuw_unsigned_5( 453fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 454fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3 455fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nuw i8 [[ADD]], 4 456fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 457fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 458fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 459fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] 460fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_12:%.*]] = add nuw i8 [[START_ADD_2]], 12 4617c1b80e3SFlorian Hahn; CHECK-NEXT: ret i1 true 462fb3e2befSFlorian Hahn; 463fb3e2befSFlorian Hahnentry: 464fb3e2befSFlorian Hahn %add = add nuw i8 %start, 3 465fb3e2befSFlorian Hahn %start.mul.4 = mul nuw i8 %add, 4 466fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 467fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 468fb3e2befSFlorian Hahn 469fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 470fb3e2befSFlorian Hahn %start.add.2 = add nuw i8 %start.add.1, %start.add.1 471fb3e2befSFlorian Hahn %start.add.2.12 = add nuw i8 %start.add.2, 12 472fb3e2befSFlorian Hahn %t.5 = icmp ule i8 %start.add.2.12, %start.mul.4 473fb3e2befSFlorian Hahn ret i1 %t.5 474fb3e2befSFlorian Hahn} 475fb3e2befSFlorian Hahn 476fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nuw_unsigned_6(i8 %start, i8 %high) { 477fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nuw_unsigned_6( 478fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 479fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[START:%.*]], 3 480fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nuw i8 [[ADD]], 4 481fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 482fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 483fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] 484fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] 485fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_13:%.*]] = add nuw i8 [[START_ADD_2]], 13 4867c1b80e3SFlorian Hahn; CHECK-NEXT: ret i1 false 487fb3e2befSFlorian Hahn; 488fb3e2befSFlorian Hahnentry: 489fb3e2befSFlorian Hahn %add = add nuw i8 %start, 3 490fb3e2befSFlorian Hahn %start.mul.4 = mul nuw i8 %add, 4 491fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 492fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 493fb3e2befSFlorian Hahn 494fb3e2befSFlorian Hahn %start.add.1 = add nuw i8 %start, %start 495fb3e2befSFlorian Hahn %start.add.2 = add nuw i8 %start.add.1, %start.add.1 496fb3e2befSFlorian Hahn %start.add.2.13 = add nuw i8 %start.add.2, 13 497fb3e2befSFlorian Hahn %f.1 = icmp ule i8 %start.add.2.13, %start.mul.4 498fb3e2befSFlorian Hahn ret i1 %f.1 499fb3e2befSFlorian Hahn} 500fb3e2befSFlorian Hahn 501fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_1(i8 %start, i8 %high) { 502fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_1( 503fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 504fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nsw i8 [[START:%.*]], 4 505fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 506fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 507fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]] 508fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_1]] 509fb3e2befSFlorian Hahn; 510fb3e2befSFlorian Hahnentry: 511fb3e2befSFlorian Hahn %start.mul.4 = mul nsw i8 %start, 4 512fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 513fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 514fb3e2befSFlorian Hahn 515fb3e2befSFlorian Hahn %t.1 = icmp ult i8 %start, %high 516fb3e2befSFlorian Hahn ret i1 %t.1 517fb3e2befSFlorian Hahn} 518fb3e2befSFlorian Hahn 519fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_2(i8 %start, i8 %high) { 520fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_2( 521fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 522fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nsw i8 [[START:%.*]], 4 523fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 524fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 525fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nsw i8 [[START]], 2 526fb3e2befSFlorian Hahn; CHECK-NEXT: [[T:%.*]] = icmp ult i8 [[START_MUL_2]], [[HIGH]] 527fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T]] 528fb3e2befSFlorian Hahn; 529fb3e2befSFlorian Hahnentry: 530fb3e2befSFlorian Hahn %start.mul.4 = mul nsw i8 %start, 4 531fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 532fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 533fb3e2befSFlorian Hahn 534fb3e2befSFlorian Hahn %start.mul.2 = mul nsw i8 %start, 2 535fb3e2befSFlorian Hahn %t = icmp ult i8 %start.mul.2, %high 536fb3e2befSFlorian Hahn ret i1 %t 537fb3e2befSFlorian Hahn} 538fb3e2befSFlorian Hahn 539fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_3(i8 %start, i8 %high) { 540fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_3( 541fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 542fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nsw i8 [[START:%.*]], 4 543fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 544fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 545fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nsw i8 [[START]], 2 546fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 547fb3e2befSFlorian Hahn; CHECK-NEXT: [[T:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_MUL_2]] 548fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T]] 549fb3e2befSFlorian Hahn; 550fb3e2befSFlorian Hahnentry: 551fb3e2befSFlorian Hahn %start.mul.4 = mul nsw i8 %start, 4 552fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 553fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 554fb3e2befSFlorian Hahn 555fb3e2befSFlorian Hahn %start.mul.2 = mul nsw i8 %start, 2 556fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 557fb3e2befSFlorian Hahn %t = icmp ule i8 %start.add.1, %start.mul.2 558fb3e2befSFlorian Hahn ret i1 %t 559fb3e2befSFlorian Hahn} 560fb3e2befSFlorian Hahn 561fb3e2befSFlorian Hahn 562fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_4(i8 %start, i8 %high) { 563fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_4( 564fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 565fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nsw i8 [[START:%.*]], 4 566fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 567fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 568fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nsw i8 [[START]], 2 569fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 570fb3e2befSFlorian Hahn; CHECK-NEXT: [[F:%.*]] = icmp ult i8 [[START_ADD_1]], [[START_MUL_2]] 571fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F]] 572fb3e2befSFlorian Hahn; 573fb3e2befSFlorian Hahnentry: 574fb3e2befSFlorian Hahn %start.mul.4 = mul nsw i8 %start, 4 575fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 576fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 577fb3e2befSFlorian Hahn 578fb3e2befSFlorian Hahn %start.mul.2 = mul nsw i8 %start, 2 579fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 580fb3e2befSFlorian Hahn %f = icmp ult i8 %start.add.1, %start.mul.2 581fb3e2befSFlorian Hahn ret i1 %f 582fb3e2befSFlorian Hahn} 583fb3e2befSFlorian Hahn 584fb3e2befSFlorian Hahn 585fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_5(i8 %start, i8 %high) { 586fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_5( 587fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 588fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nsw i8 [[START:%.*]], 4 589fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 590fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 591fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 592fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]] 593fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_4:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_MUL_4]] 594fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_4]] 595fb3e2befSFlorian Hahn; 596fb3e2befSFlorian Hahnentry: 597fb3e2befSFlorian Hahn %start.mul.4 = mul nsw i8 %start, 4 598fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 599fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 600fb3e2befSFlorian Hahn 601fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 602fb3e2befSFlorian Hahn %start.add.2 = add nsw i8 %start.add.1, %start.add.1 603fb3e2befSFlorian Hahn %t.4 = icmp ule i8 %start.add.2, %start.mul.4 604fb3e2befSFlorian Hahn ret i1 %t.4 605fb3e2befSFlorian Hahn} 606fb3e2befSFlorian Hahn 607fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_6(i8 %start, i8 %high) { 608fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_6( 609fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 610fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nsw i8 [[START:%.*]], 4 611fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 612fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 613fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 614fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]] 615fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_2:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_MUL_4]] 616fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_2]] 617fb3e2befSFlorian Hahn; 618fb3e2befSFlorian Hahnentry: 619fb3e2befSFlorian Hahn %start.mul.4 = mul nsw i8 %start, 4 620fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 621fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 622fb3e2befSFlorian Hahn 623fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 624fb3e2befSFlorian Hahn %start.add.2 = add nsw i8 %start.add.1, %start.add.1 625fb3e2befSFlorian Hahn %f.2 = icmp ult i8 %start.add.2, %start.mul.4 626fb3e2befSFlorian Hahn ret i1 %f.2 627fb3e2befSFlorian Hahn} 628fb3e2befSFlorian Hahn 629fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_7(i8 %start, i8 %high) { 630fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_7( 631fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 632fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nsw i8 [[START:%.*]], 4 633fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 634fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 635fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nsw i8 [[START]], 2 636fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 637fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]] 638fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add nsw i8 [[START_ADD_2]], 1 639fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_3:%.*]] = icmp ule i8 [[START_ADD_2_1]], [[START_MUL_4]] 640fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_3]] 641fb3e2befSFlorian Hahn; 642fb3e2befSFlorian Hahnentry: 643fb3e2befSFlorian Hahn %start.mul.4 = mul nsw i8 %start, 4 644fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 645fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 646fb3e2befSFlorian Hahn 647fb3e2befSFlorian Hahn %start.mul.2 = mul nsw i8 %start, 2 648fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 649fb3e2befSFlorian Hahn %start.add.2 = add nsw i8 %start.add.1, %start.add.1 650fb3e2befSFlorian Hahn %start.add.2.1 = add nsw i8 %start.add.2, 1 651fb3e2befSFlorian Hahn %f.3 = icmp ule i8 %start.add.2.1, %start.mul.4 652fb3e2befSFlorian Hahn ret i1 %f.3 653fb3e2befSFlorian Hahn} 654fb3e2befSFlorian Hahn 655fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_8(i8 %start, i8 %high) { 656fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_8( 657fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 658fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nsw i8 [[START:%.*]], 4 659fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 660fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 661fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nsw i8 [[START]], 2 662fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 663fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]] 664fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add nsw i8 [[START_ADD_2]], 1 665fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nsw i8 [[START]], 3 666fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_5:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_MUL_3]] 667fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_5]] 668fb3e2befSFlorian Hahn; 669fb3e2befSFlorian Hahnentry: 670fb3e2befSFlorian Hahn %start.mul.4 = mul nsw i8 %start, 4 671fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 672fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 673fb3e2befSFlorian Hahn 674fb3e2befSFlorian Hahn %start.mul.2 = mul nsw i8 %start, 2 675fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 676fb3e2befSFlorian Hahn %start.add.2 = add nsw i8 %start.add.1, %start.add.1 677fb3e2befSFlorian Hahn %start.add.2.1 = add nsw i8 %start.add.2, 1 678fb3e2befSFlorian Hahn %start.mul.3 = mul nsw i8 %start, 3 679fb3e2befSFlorian Hahn %t.5 = icmp ule i8 %start.add.1, %start.mul.3 680fb3e2befSFlorian Hahn ret i1 %t.5 681fb3e2befSFlorian Hahn} 682fb3e2befSFlorian Hahn 683fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_9(i8 %start, i8 %high) { 684fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_9( 685fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 686fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nsw i8 [[START:%.*]], 4 687fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 688fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 689fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nsw i8 [[START]], 2 690fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 691fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]] 692fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add nsw i8 [[START_ADD_2]], 1 693fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nsw i8 [[START]], 3 694fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_5:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_MUL_3]] 695fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_5]] 696fb3e2befSFlorian Hahn; 697fb3e2befSFlorian Hahnentry: 698fb3e2befSFlorian Hahn %start.mul.4 = mul nsw i8 %start, 4 699fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 700fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 701fb3e2befSFlorian Hahn 702fb3e2befSFlorian Hahn %start.mul.2 = mul nsw i8 %start, 2 703fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 704fb3e2befSFlorian Hahn %start.add.2 = add nsw i8 %start.add.1, %start.add.1 705fb3e2befSFlorian Hahn %start.add.2.1 = add nsw i8 %start.add.2, 1 706fb3e2befSFlorian Hahn %start.mul.3 = mul nsw i8 %start, 3 707fb3e2befSFlorian Hahn %f.5 = icmp ult i8 %start.add.2, %start.mul.3 708fb3e2befSFlorian Hahn ret i1 %f.5 709fb3e2befSFlorian Hahn} 710fb3e2befSFlorian Hahn 711fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_10(i8 %start, i8 %high) { 712fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_10( 713fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 714fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_5:%.*]] = mul nsw i8 [[START:%.*]], 5 715fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]] 716fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 717fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nsw i8 [[START]], 3 718fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[START_MUL_3]], [[START_MUL_5]] 719fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_1]] 720fb3e2befSFlorian Hahn; 721fb3e2befSFlorian Hahnentry: 722fb3e2befSFlorian Hahn %start.mul.5 = mul nsw i8 %start, 5 723fb3e2befSFlorian Hahn %c.0 = icmp ult i8 %start, %start.mul.5 724fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.0) 725fb3e2befSFlorian Hahn 726fb3e2befSFlorian Hahn %start.mul.3 = mul nsw i8 %start, 3 727fb3e2befSFlorian Hahn %t.1 = icmp ule i8 %start.mul.3, %start.mul.5 728fb3e2befSFlorian Hahn ret i1 %t.1 729fb3e2befSFlorian Hahn} 730fb3e2befSFlorian Hahn 731fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_11(i8 %start, i8 %high) { 732fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_11( 733fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 734fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_5:%.*]] = mul nsw i8 [[START:%.*]], 5 735fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]] 736fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 737fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nsw i8 [[START]], 3 738fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[START_MUL_5]], [[START_MUL_3]] 739fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[C_1]] 740fb3e2befSFlorian Hahn; 741fb3e2befSFlorian Hahnentry: 742fb3e2befSFlorian Hahn %start.mul.5 = mul nsw i8 %start, 5 743fb3e2befSFlorian Hahn %c.0 = icmp ult i8 %start, %start.mul.5 744fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.0) 745fb3e2befSFlorian Hahn 746fb3e2befSFlorian Hahn %start.mul.3 = mul nsw i8 %start, 3 747fb3e2befSFlorian Hahn %c.1 = icmp ule i8 %start.mul.5, %start.mul.3 748fb3e2befSFlorian Hahn ret i1 %c.1 749fb3e2befSFlorian Hahn} 750fb3e2befSFlorian Hahn 751fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_12(i8 %start) { 752fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_12( 753fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 754fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_5:%.*]] = mul nsw i8 [[START:%.*]], -5 755fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]] 756fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 757fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nsw i8 [[START]], -3 758fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[START_MUL_3]], [[START_MUL_5]] 759fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_1]] 760fb3e2befSFlorian Hahn; 761fb3e2befSFlorian Hahnentry: 762fb3e2befSFlorian Hahn %start.mul.5 = mul nsw i8 %start, -5 763fb3e2befSFlorian Hahn %c.0 = icmp ult i8 %start, %start.mul.5 764fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.0) 765fb3e2befSFlorian Hahn 766fb3e2befSFlorian Hahn %start.mul.3 = mul nsw i8 %start, -3 767fb3e2befSFlorian Hahn %t.1 = icmp ule i8 %start.mul.3, %start.mul.5 768fb3e2befSFlorian Hahn ret i1 %t.1 769fb3e2befSFlorian Hahn} 770fb3e2befSFlorian Hahn 771fb3e2befSFlorian Hahndefine i1 @test_mul_const_nsw_unsigned_13(i8 %start) { 772fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_nsw_unsigned_13( 773fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 774fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_5:%.*]] = mul nsw i8 [[START:%.*]], -5 775fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]] 776fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 777fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nsw i8 [[START]], -3 778fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[START_MUL_5]], [[START_MUL_3]] 779fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[C_1]] 780fb3e2befSFlorian Hahn; 781fb3e2befSFlorian Hahnentry: 782fb3e2befSFlorian Hahn %start.mul.5 = mul nsw i8 %start, -5 783fb3e2befSFlorian Hahn %c.0 = icmp ult i8 %start, %start.mul.5 784fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.0) 785fb3e2befSFlorian Hahn 786fb3e2befSFlorian Hahn %start.mul.3 = mul nsw i8 %start, -3 787fb3e2befSFlorian Hahn %c.1 = icmp ule i8 %start.mul.5, %start.mul.3 788fb3e2befSFlorian Hahn ret i1 %c.1 789fb3e2befSFlorian Hahn} 790fb3e2befSFlorian Hahn 791fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nsw_unsigned_1(i8 %start, i8 %high) { 792fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nsw_unsigned_1( 793fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 794fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3 795fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nsw i8 [[ADD]], 4 796fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 797fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 798fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]] 799fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_1]] 800fb3e2befSFlorian Hahn; 801fb3e2befSFlorian Hahnentry: 802fb3e2befSFlorian Hahn %add = add nsw i8 %start, 3 803fb3e2befSFlorian Hahn %start.mul.4 = mul nsw i8 %add, 4 804fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 805fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 806fb3e2befSFlorian Hahn 807fb3e2befSFlorian Hahn %t.1 = icmp ult i8 %start, %high 808fb3e2befSFlorian Hahn ret i1 %t.1 809fb3e2befSFlorian Hahn} 810fb3e2befSFlorian Hahn 811fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nsw_unsigned_2(i8 %start, i8 %high) { 812fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nsw_unsigned_2( 813fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 814fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3 815fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nsw i8 [[ADD]], 4 816fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 817fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 818fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nsw i8 [[START]], 2 819fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_2:%.*]] = icmp ult i8 [[START_MUL_2]], [[HIGH]] 820fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_2]] 821fb3e2befSFlorian Hahn; 822fb3e2befSFlorian Hahnentry: 823fb3e2befSFlorian Hahn %add = add nsw i8 %start, 3 824fb3e2befSFlorian Hahn %start.mul.4 = mul nsw i8 %add, 4 825fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 826fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 827fb3e2befSFlorian Hahn 828fb3e2befSFlorian Hahn %start.mul.2 = mul nsw i8 %start, 2 829fb3e2befSFlorian Hahn %t.2 = icmp ult i8 %start.mul.2, %high 830fb3e2befSFlorian Hahn ret i1 %t.2 831fb3e2befSFlorian Hahn} 832fb3e2befSFlorian Hahn 833fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nsw_unsigned_3(i8 %start, i8 %high) { 834fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nsw_unsigned_3( 835fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 836fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3 837fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nsw i8 [[ADD]], 4 838fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 839fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 840fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 841fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]] 842fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_3:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_MUL_4]] 843fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_3]] 844fb3e2befSFlorian Hahn; 845fb3e2befSFlorian Hahnentry: 846fb3e2befSFlorian Hahn %add = add nsw i8 %start, 3 847fb3e2befSFlorian Hahn %start.mul.4 = mul nsw i8 %add, 4 848fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 849fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 850fb3e2befSFlorian Hahn 851fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 852fb3e2befSFlorian Hahn %start.add.2 = add nsw i8 %start.add.1, %start.add.1 853fb3e2befSFlorian Hahn %t.3 = icmp ule i8 %start.add.2, %start.mul.4 854fb3e2befSFlorian Hahn ret i1 %t.3 855fb3e2befSFlorian Hahn} 856fb3e2befSFlorian Hahn 857fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nsw_unsigned_4(i8 %start, i8 %high) { 858fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nsw_unsigned_4( 859fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 860fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3 861fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nsw i8 [[ADD]], 4 862fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 863fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 864fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nsw i8 [[START]], 2 865fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 866fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]] 867fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_4:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_MUL_4]] 868fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_4]] 869fb3e2befSFlorian Hahn; 870fb3e2befSFlorian Hahnentry: 871fb3e2befSFlorian Hahn %add = add nsw i8 %start, 3 872fb3e2befSFlorian Hahn %start.mul.4 = mul nsw i8 %add, 4 873fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 874fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 875fb3e2befSFlorian Hahn 876fb3e2befSFlorian Hahn %start.mul.2 = mul nsw i8 %start, 2 877fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 878fb3e2befSFlorian Hahn %start.add.2 = add nsw i8 %start.add.1, %start.add.1 879fb3e2befSFlorian Hahn %t.4 = icmp ult i8 %start.add.2, %start.mul.4 880fb3e2befSFlorian Hahn ret i1 %t.4 881fb3e2befSFlorian Hahn} 882fb3e2befSFlorian Hahn 883fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nsw_unsigned_5(i8 %start, i8 %high) { 884fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nsw_unsigned_5( 885fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 886fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3 887fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nsw i8 [[ADD]], 4 888fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 889fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 890fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 891fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]] 892fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_12:%.*]] = add nsw i8 [[START_ADD_2]], 12 893fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_5:%.*]] = icmp ule i8 [[START_ADD_2_12]], [[START_MUL_4]] 894fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_5]] 895fb3e2befSFlorian Hahn; 896fb3e2befSFlorian Hahnentry: 897fb3e2befSFlorian Hahn %add = add nsw i8 %start, 3 898fb3e2befSFlorian Hahn %start.mul.4 = mul nsw i8 %add, 4 899fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 900fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 901fb3e2befSFlorian Hahn 902fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 903fb3e2befSFlorian Hahn %start.add.2 = add nsw i8 %start.add.1, %start.add.1 904fb3e2befSFlorian Hahn %start.add.2.12 = add nsw i8 %start.add.2, 12 905fb3e2befSFlorian Hahn %t.5 = icmp ule i8 %start.add.2.12, %start.mul.4 906fb3e2befSFlorian Hahn ret i1 %t.5 907fb3e2befSFlorian Hahn} 908fb3e2befSFlorian Hahn 909fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_nsw_unsigned_6(i8 %start, i8 %high) { 910fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_nsw_unsigned_6( 911fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 912fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3 913fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nsw i8 [[ADD]], 4 914fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 915fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 916fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add nsw i8 [[START]], [[START]] 917fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add nsw i8 [[START_ADD_1]], [[START_ADD_1]] 918fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_13:%.*]] = add nsw i8 [[START_ADD_2]], 13 919fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[START_ADD_2_13]], [[START_MUL_4]] 920fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_1]] 921fb3e2befSFlorian Hahn; 922fb3e2befSFlorian Hahnentry: 923fb3e2befSFlorian Hahn %add = add nsw i8 %start, 3 924fb3e2befSFlorian Hahn %start.mul.4 = mul nsw i8 %add, 4 925fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 926fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 927fb3e2befSFlorian Hahn 928fb3e2befSFlorian Hahn %start.add.1 = add nsw i8 %start, %start 929fb3e2befSFlorian Hahn %start.add.2 = add nsw i8 %start.add.1, %start.add.1 930fb3e2befSFlorian Hahn %start.add.2.13 = add nsw i8 %start.add.2, 13 931fb3e2befSFlorian Hahn %f.1 = icmp ule i8 %start.add.2.13, %start.mul.4 932fb3e2befSFlorian Hahn ret i1 %f.1 933fb3e2befSFlorian Hahn} 934fb3e2befSFlorian Hahn 935fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_1(i8 %start, i8 %high) { 936fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_1( 937fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 938fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul i8 [[START:%.*]], 4 939fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 940fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 941fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]] 942fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_1]] 943fb3e2befSFlorian Hahn; 944fb3e2befSFlorian Hahnentry: 945fb3e2befSFlorian Hahn %start.mul.4 = mul i8 %start, 4 946fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 947fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 948fb3e2befSFlorian Hahn 949fb3e2befSFlorian Hahn %t.1 = icmp ult i8 %start, %high 950fb3e2befSFlorian Hahn ret i1 %t.1 951fb3e2befSFlorian Hahn} 952fb3e2befSFlorian Hahn 953fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_2(i8 %start, i8 %high) { 954fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_2( 955fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 956fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul i8 [[START:%.*]], 4 957fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 958fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 959fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul i8 [[START]], 2 960fb3e2befSFlorian Hahn; CHECK-NEXT: [[T:%.*]] = icmp ult i8 [[START_MUL_2]], [[HIGH]] 961fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T]] 962fb3e2befSFlorian Hahn; 963fb3e2befSFlorian Hahnentry: 964fb3e2befSFlorian Hahn %start.mul.4 = mul i8 %start, 4 965fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 966fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 967fb3e2befSFlorian Hahn 968fb3e2befSFlorian Hahn %start.mul.2 = mul i8 %start, 2 969fb3e2befSFlorian Hahn %t = icmp ult i8 %start.mul.2, %high 970fb3e2befSFlorian Hahn ret i1 %t 971fb3e2befSFlorian Hahn} 972fb3e2befSFlorian Hahn 973fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_3(i8 %start, i8 %high) { 974fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_3( 975fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 976fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul i8 [[START:%.*]], 4 977fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 978fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 979fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul i8 [[START]], 2 980fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 981fb3e2befSFlorian Hahn; CHECK-NEXT: [[T:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_MUL_2]] 982fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T]] 983fb3e2befSFlorian Hahn; 984fb3e2befSFlorian Hahnentry: 985fb3e2befSFlorian Hahn %start.mul.4 = mul i8 %start, 4 986fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 987fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 988fb3e2befSFlorian Hahn 989fb3e2befSFlorian Hahn %start.mul.2 = mul i8 %start, 2 990fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 991fb3e2befSFlorian Hahn %t = icmp ule i8 %start.add.1, %start.mul.2 992fb3e2befSFlorian Hahn ret i1 %t 993fb3e2befSFlorian Hahn} 994fb3e2befSFlorian Hahn 995fb3e2befSFlorian Hahn 996fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_4(i8 %start, i8 %high) { 997fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_4( 998fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 999fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul i8 [[START:%.*]], 4 1000fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 1001fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1002fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul i8 [[START]], 2 1003fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 1004fb3e2befSFlorian Hahn; CHECK-NEXT: [[F:%.*]] = icmp ult i8 [[START_ADD_1]], [[START_MUL_2]] 1005fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F]] 1006fb3e2befSFlorian Hahn; 1007fb3e2befSFlorian Hahnentry: 1008fb3e2befSFlorian Hahn %start.mul.4 = mul i8 %start, 4 1009fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 1010fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1011fb3e2befSFlorian Hahn 1012fb3e2befSFlorian Hahn %start.mul.2 = mul i8 %start, 2 1013fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 1014fb3e2befSFlorian Hahn %f = icmp ult i8 %start.add.1, %start.mul.2 1015fb3e2befSFlorian Hahn ret i1 %f 1016fb3e2befSFlorian Hahn} 1017fb3e2befSFlorian Hahn 1018fb3e2befSFlorian Hahn 1019fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_5(i8 %start, i8 %high) { 1020fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_5( 1021fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1022fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul i8 [[START:%.*]], 4 1023fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 1024fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1025fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 1026fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]] 1027fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_4:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_MUL_4]] 1028fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_4]] 1029fb3e2befSFlorian Hahn; 1030fb3e2befSFlorian Hahnentry: 1031fb3e2befSFlorian Hahn %start.mul.4 = mul i8 %start, 4 1032fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 1033fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1034fb3e2befSFlorian Hahn 1035fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 1036fb3e2befSFlorian Hahn %start.add.2 = add i8 %start.add.1, %start.add.1 1037fb3e2befSFlorian Hahn %t.4 = icmp ule i8 %start.add.2, %start.mul.4 1038fb3e2befSFlorian Hahn ret i1 %t.4 1039fb3e2befSFlorian Hahn} 1040fb3e2befSFlorian Hahn 1041fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_6(i8 %start, i8 %high) { 1042fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_6( 1043fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1044fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul i8 [[START:%.*]], 4 1045fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 1046fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1047fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 1048fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]] 1049fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_2:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_MUL_4]] 1050fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_2]] 1051fb3e2befSFlorian Hahn; 1052fb3e2befSFlorian Hahnentry: 1053fb3e2befSFlorian Hahn %start.mul.4 = mul i8 %start, 4 1054fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 1055fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1056fb3e2befSFlorian Hahn 1057fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 1058fb3e2befSFlorian Hahn %start.add.2 = add i8 %start.add.1, %start.add.1 1059fb3e2befSFlorian Hahn %f.2 = icmp ult i8 %start.add.2, %start.mul.4 1060fb3e2befSFlorian Hahn ret i1 %f.2 1061fb3e2befSFlorian Hahn} 1062fb3e2befSFlorian Hahn 1063fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_7(i8 %start, i8 %high) { 1064fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_7( 1065fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1066fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul i8 [[START:%.*]], 4 1067fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 1068fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1069fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul i8 [[START]], 2 1070fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 1071fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]] 1072fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add i8 [[START_ADD_2]], 1 1073fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_3:%.*]] = icmp ule i8 [[START_ADD_2_1]], [[START_MUL_4]] 1074fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_3]] 1075fb3e2befSFlorian Hahn; 1076fb3e2befSFlorian Hahnentry: 1077fb3e2befSFlorian Hahn %start.mul.4 = mul i8 %start, 4 1078fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 1079fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1080fb3e2befSFlorian Hahn 1081fb3e2befSFlorian Hahn %start.mul.2 = mul i8 %start, 2 1082fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 1083fb3e2befSFlorian Hahn %start.add.2 = add i8 %start.add.1, %start.add.1 1084fb3e2befSFlorian Hahn %start.add.2.1 = add i8 %start.add.2, 1 1085fb3e2befSFlorian Hahn %f.3 = icmp ule i8 %start.add.2.1, %start.mul.4 1086fb3e2befSFlorian Hahn ret i1 %f.3 1087fb3e2befSFlorian Hahn} 1088fb3e2befSFlorian Hahn 1089fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_8(i8 %start, i8 %high) { 1090fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_8( 1091fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1092fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul i8 [[START:%.*]], 4 1093fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 1094fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1095fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul i8 [[START]], 2 1096fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 1097fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]] 1098fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add i8 [[START_ADD_2]], 1 1099fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul i8 [[START]], 3 1100fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_5:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_MUL_3]] 1101fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_5]] 1102fb3e2befSFlorian Hahn; 1103fb3e2befSFlorian Hahnentry: 1104fb3e2befSFlorian Hahn %start.mul.4 = mul i8 %start, 4 1105fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 1106fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1107fb3e2befSFlorian Hahn 1108fb3e2befSFlorian Hahn %start.mul.2 = mul i8 %start, 2 1109fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 1110fb3e2befSFlorian Hahn %start.add.2 = add i8 %start.add.1, %start.add.1 1111fb3e2befSFlorian Hahn %start.add.2.1 = add i8 %start.add.2, 1 1112fb3e2befSFlorian Hahn %start.mul.3 = mul i8 %start, 3 1113fb3e2befSFlorian Hahn %t.5 = icmp ule i8 %start.add.1, %start.mul.3 1114fb3e2befSFlorian Hahn ret i1 %t.5 1115fb3e2befSFlorian Hahn} 1116fb3e2befSFlorian Hahn 1117fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_9(i8 %start, i8 %high) { 1118fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_9( 1119fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1120fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul i8 [[START:%.*]], 4 1121fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 1122fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1123fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul i8 [[START]], 2 1124fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 1125fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]] 1126fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add i8 [[START_ADD_2]], 1 1127fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul i8 [[START]], 3 1128fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_5:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_MUL_3]] 1129fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_5]] 1130fb3e2befSFlorian Hahn; 1131fb3e2befSFlorian Hahnentry: 1132fb3e2befSFlorian Hahn %start.mul.4 = mul i8 %start, 4 1133fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 1134fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1135fb3e2befSFlorian Hahn 1136fb3e2befSFlorian Hahn %start.mul.2 = mul i8 %start, 2 1137fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 1138fb3e2befSFlorian Hahn %start.add.2 = add i8 %start.add.1, %start.add.1 1139fb3e2befSFlorian Hahn %start.add.2.1 = add i8 %start.add.2, 1 1140fb3e2befSFlorian Hahn %start.mul.3 = mul i8 %start, 3 1141fb3e2befSFlorian Hahn %f.5 = icmp ult i8 %start.add.2, %start.mul.3 1142fb3e2befSFlorian Hahn ret i1 %f.5 1143fb3e2befSFlorian Hahn} 1144fb3e2befSFlorian Hahn 1145fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_10(i8 %start, i8 %high) { 1146fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_10( 1147fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1148fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_5:%.*]] = mul i8 [[START:%.*]], 5 1149fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]] 1150fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 1151fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul i8 [[START]], 3 1152fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[START_MUL_3]], [[START_MUL_5]] 1153fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_1]] 1154fb3e2befSFlorian Hahn; 1155fb3e2befSFlorian Hahnentry: 1156fb3e2befSFlorian Hahn %start.mul.5 = mul i8 %start, 5 1157fb3e2befSFlorian Hahn %c.0 = icmp ult i8 %start, %start.mul.5 1158fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.0) 1159fb3e2befSFlorian Hahn 1160fb3e2befSFlorian Hahn %start.mul.3 = mul i8 %start, 3 1161fb3e2befSFlorian Hahn %t.1 = icmp ule i8 %start.mul.3, %start.mul.5 1162fb3e2befSFlorian Hahn ret i1 %t.1 1163fb3e2befSFlorian Hahn} 1164fb3e2befSFlorian Hahn 1165fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_11(i8 %start, i8 %high) { 1166fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_11( 1167fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1168fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_5:%.*]] = mul i8 [[START:%.*]], 5 1169fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp ult i8 [[START]], [[START_MUL_5]] 1170fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_0]]) 1171fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul i8 [[START]], 3 1172fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[START_MUL_5]], [[START_MUL_3]] 1173fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[C_1]] 1174fb3e2befSFlorian Hahn; 1175fb3e2befSFlorian Hahnentry: 1176fb3e2befSFlorian Hahn %start.mul.5 = mul i8 %start, 5 1177fb3e2befSFlorian Hahn %c.0 = icmp ult i8 %start, %start.mul.5 1178fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.0) 1179fb3e2befSFlorian Hahn 1180fb3e2befSFlorian Hahn %start.mul.3 = mul i8 %start, 3 1181fb3e2befSFlorian Hahn %c.1 = icmp ule i8 %start.mul.5, %start.mul.3 1182fb3e2befSFlorian Hahn ret i1 %c.1 1183fb3e2befSFlorian Hahn} 1184fb3e2befSFlorian Hahn 1185fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_12(i8 %start) { 1186fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_12( 1187fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1188fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul i8 [[START:%.*]], 3 1189fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START]], [[START_MUL_3]] 1190fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1191fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_5:%.*]] = mul i8 [[START]], 5 1192fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[START_MUL_3]], [[START_MUL_5]] 1193fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_1]] 1194fb3e2befSFlorian Hahn; 1195fb3e2befSFlorian Hahnentry: 1196fb3e2befSFlorian Hahn %start.mul.3 = mul i8 %start, 3 1197fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start, %start.mul.3 1198fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1199fb3e2befSFlorian Hahn 1200fb3e2befSFlorian Hahn %start.mul.5 = mul i8 %start, 5 1201fb3e2befSFlorian Hahn %t.1 = icmp ule i8 %start.mul.3, %start.mul.5 1202fb3e2befSFlorian Hahn ret i1 %t.1 1203fb3e2befSFlorian Hahn} 1204fb3e2befSFlorian Hahn 1205fb3e2befSFlorian Hahndefine i1 @test_mul_const_no_nuw_unsigned_13(i8 %start) { 1206fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_const_no_nuw_unsigned_13( 1207fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1208fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_3:%.*]] = mul i8 [[START:%.*]], 3 1209fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START]], [[START_MUL_3]] 1210fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1211fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_5:%.*]] = mul i8 [[START]], 5 1212fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[START_MUL_5]], [[START_MUL_3]] 1213fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_1]] 1214fb3e2befSFlorian Hahn; 1215fb3e2befSFlorian Hahnentry: 1216fb3e2befSFlorian Hahn %start.mul.3 = mul i8 %start, 3 1217fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start, %start.mul.3 1218fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1219fb3e2befSFlorian Hahn 1220fb3e2befSFlorian Hahn %start.mul.5 = mul i8 %start, 5 1221fb3e2befSFlorian Hahn %f.1 = icmp ule i8 %start.mul.5, %start.mul.3 1222fb3e2befSFlorian Hahn ret i1 %f.1 1223fb3e2befSFlorian Hahn} 1224fb3e2befSFlorian Hahn 1225fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_no_nuw_unsigned_1(i8 %start, i8 %high) { 1226fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_no_nuw_unsigned_1( 1227fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1228fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add i8 [[START:%.*]], 3 1229fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul i8 [[ADD]], 4 1230fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 1231fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1232fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]] 1233fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_1]] 1234fb3e2befSFlorian Hahn; 1235fb3e2befSFlorian Hahnentry: 1236fb3e2befSFlorian Hahn %add = add i8 %start, 3 1237fb3e2befSFlorian Hahn %start.mul.4 = mul i8 %add, 4 1238fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 1239fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1240fb3e2befSFlorian Hahn 1241fb3e2befSFlorian Hahn %t.1 = icmp ult i8 %start, %high 1242fb3e2befSFlorian Hahn ret i1 %t.1 1243fb3e2befSFlorian Hahn} 1244fb3e2befSFlorian Hahn 1245fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_no_nuw_unsigned_2(i8 %start, i8 %high) { 1246fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_no_nuw_unsigned_2( 1247fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1248fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add i8 [[START:%.*]], 3 1249fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul i8 [[ADD]], 4 1250fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 1251fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1252fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul i8 [[START]], 2 1253fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_2:%.*]] = icmp ult i8 [[START_MUL_2]], [[HIGH]] 1254fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_2]] 1255fb3e2befSFlorian Hahn; 1256fb3e2befSFlorian Hahnentry: 1257fb3e2befSFlorian Hahn %add = add i8 %start, 3 1258fb3e2befSFlorian Hahn %start.mul.4 = mul i8 %add, 4 1259fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 1260fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1261fb3e2befSFlorian Hahn 1262fb3e2befSFlorian Hahn %start.mul.2 = mul i8 %start, 2 1263fb3e2befSFlorian Hahn %t.2 = icmp ult i8 %start.mul.2, %high 1264fb3e2befSFlorian Hahn ret i1 %t.2 1265fb3e2befSFlorian Hahn} 1266fb3e2befSFlorian Hahn 1267fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_no_nuw_unsigned_3(i8 %start, i8 %high) { 1268fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_no_nuw_unsigned_3( 1269fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1270fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add i8 [[START:%.*]], 3 1271fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul i8 [[ADD]], 4 1272fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 1273fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1274fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 1275fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]] 1276fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_3:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_MUL_4]] 1277fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_3]] 1278fb3e2befSFlorian Hahn; 1279fb3e2befSFlorian Hahnentry: 1280fb3e2befSFlorian Hahn %add = add i8 %start, 3 1281fb3e2befSFlorian Hahn %start.mul.4 = mul i8 %add, 4 1282fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 1283fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1284fb3e2befSFlorian Hahn 1285fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 1286fb3e2befSFlorian Hahn %start.add.2 = add i8 %start.add.1, %start.add.1 1287fb3e2befSFlorian Hahn %t.3 = icmp ule i8 %start.add.2, %start.mul.4 1288fb3e2befSFlorian Hahn ret i1 %t.3 1289fb3e2befSFlorian Hahn} 1290fb3e2befSFlorian Hahn 1291fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_no_nuw_unsigned_4(i8 %start, i8 %high) { 1292fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_no_nuw_unsigned_4( 1293fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1294fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add i8 [[START:%.*]], 3 1295fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul i8 [[ADD]], 4 1296fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 1297fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1298fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_2:%.*]] = mul i8 [[START]], 2 1299fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 1300fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]] 1301fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_4:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_MUL_4]] 1302fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_4]] 1303fb3e2befSFlorian Hahn; 1304fb3e2befSFlorian Hahnentry: 1305fb3e2befSFlorian Hahn %add = add i8 %start, 3 1306fb3e2befSFlorian Hahn %start.mul.4 = mul i8 %add, 4 1307fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 1308fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1309fb3e2befSFlorian Hahn 1310fb3e2befSFlorian Hahn %start.mul.2 = mul i8 %start, 2 1311fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 1312fb3e2befSFlorian Hahn %start.add.2 = add i8 %start.add.1, %start.add.1 1313fb3e2befSFlorian Hahn %t.4 = icmp ult i8 %start.add.2, %start.mul.4 1314fb3e2befSFlorian Hahn ret i1 %t.4 1315fb3e2befSFlorian Hahn} 1316fb3e2befSFlorian Hahn 1317fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_no_nuw_unsigned_5(i8 %start, i8 %high) { 1318fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_no_nuw_unsigned_5( 1319fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1320fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add i8 [[START:%.*]], 3 1321fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul i8 [[ADD]], 4 1322fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 1323fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1324fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 1325fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]] 1326fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_12:%.*]] = add i8 [[START_ADD_2]], 12 1327fb3e2befSFlorian Hahn; CHECK-NEXT: [[T_5:%.*]] = icmp ule i8 [[START_ADD_2_12]], [[START_MUL_4]] 1328fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[T_5]] 1329fb3e2befSFlorian Hahn; 1330fb3e2befSFlorian Hahnentry: 1331fb3e2befSFlorian Hahn %add = add i8 %start, 3 1332fb3e2befSFlorian Hahn %start.mul.4 = mul i8 %add, 4 1333fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 1334fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1335fb3e2befSFlorian Hahn 1336fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 1337fb3e2befSFlorian Hahn %start.add.2 = add i8 %start.add.1, %start.add.1 1338fb3e2befSFlorian Hahn %start.add.2.12 = add i8 %start.add.2, 12 1339fb3e2befSFlorian Hahn %t.5 = icmp ule i8 %start.add.2.12, %start.mul.4 1340fb3e2befSFlorian Hahn ret i1 %t.5 1341fb3e2befSFlorian Hahn} 1342fb3e2befSFlorian Hahn 1343fb3e2befSFlorian Hahndefine i1 @test_mul_add_const_no_nuw_unsigned_6(i8 %start, i8 %high) { 1344fb3e2befSFlorian Hahn; CHECK-LABEL: @test_mul_add_const_no_nuw_unsigned_6( 1345fb3e2befSFlorian Hahn; CHECK-NEXT: entry: 1346fb3e2befSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add i8 [[START:%.*]], 3 1347fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_MUL_4:%.*]] = mul i8 [[ADD]], 4 1348fb3e2befSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] 1349fb3e2befSFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 1350fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_1:%.*]] = add i8 [[START]], [[START]] 1351fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2:%.*]] = add i8 [[START_ADD_1]], [[START_ADD_1]] 1352fb3e2befSFlorian Hahn; CHECK-NEXT: [[START_ADD_2_13:%.*]] = add i8 [[START_ADD_2]], 13 1353fb3e2befSFlorian Hahn; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[START_ADD_2_13]], [[START_MUL_4]] 1354fb3e2befSFlorian Hahn; CHECK-NEXT: ret i1 [[F_1]] 1355fb3e2befSFlorian Hahn; 1356fb3e2befSFlorian Hahnentry: 1357fb3e2befSFlorian Hahn %add = add i8 %start, 3 1358fb3e2befSFlorian Hahn %start.mul.4 = mul i8 %add, 4 1359fb3e2befSFlorian Hahn %c.1 = icmp ult i8 %start.mul.4, %high 1360fb3e2befSFlorian Hahn call void @llvm.assume(i1 %c.1) 1361fb3e2befSFlorian Hahn 1362fb3e2befSFlorian Hahn %start.add.1 = add i8 %start, %start 1363fb3e2befSFlorian Hahn %start.add.2 = add i8 %start.add.1, %start.add.1 1364fb3e2befSFlorian Hahn %start.add.2.13 = add i8 %start.add.2, 13 1365fb3e2befSFlorian Hahn %f.1 = icmp ule i8 %start.add.2.13, %start.mul.4 1366fb3e2befSFlorian Hahn ret i1 %f.1 1367fb3e2befSFlorian Hahn} 1368fb3e2befSFlorian Hahn 1369