1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -constraint-elimination -S %s | FileCheck %s 3 4define void @test.not.uge.ult(i8 %start, i8 %low, i8 %high) { 5; CHECK-LABEL: @test.not.uge.ult( 6; CHECK-NEXT: entry: 7; CHECK-NEXT: [[SUB_PTR_I:%.*]] = sub nuw i8 [[START:%.*]], 3 8; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[SUB_PTR_I]], [[HIGH:%.*]] 9; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 10; CHECK: if.then: 11; CHECK-NEXT: ret void 12; CHECK: if.end: 13; CHECK-NEXT: [[T_0:%.*]] = icmp ult i8 [[START]], [[HIGH]] 14; CHECK-NEXT: call void @use(i1 [[T_0]]) 15; CHECK-NEXT: [[START_1:%.*]] = sub nuw i8 [[START]], 1 16; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START_1]], [[HIGH]] 17; CHECK-NEXT: call void @use(i1 [[T_1]]) 18; CHECK-NEXT: [[START_2:%.*]] = sub nuw i8 [[START]], 2 19; CHECK-NEXT: [[T_2:%.*]] = icmp ult i8 [[START_2]], [[HIGH]] 20; CHECK-NEXT: call void @use(i1 [[T_2]]) 21; CHECK-NEXT: [[START_3:%.*]] = sub nuw i8 [[START]], 3 22; CHECK-NEXT: [[T_3:%.*]] = icmp ult i8 [[START_3]], [[HIGH]] 23; CHECK-NEXT: call void @use(i1 true) 24; CHECK-NEXT: [[START_4:%.*]] = sub nuw i8 [[START]], 4 25; CHECK-NEXT: [[C_4:%.*]] = icmp ult i8 [[START_4]], [[HIGH]] 26; CHECK-NEXT: call void @use(i1 true) 27; CHECK-NEXT: ret void 28; 29entry: 30 %sub.ptr.i = sub nuw i8 %start, 3 31 %c.1 = icmp uge i8 %sub.ptr.i, %high 32 br i1 %c.1, label %if.then, label %if.end 33 34if.then: ; preds = %entry 35 ret void 36 37if.end: ; preds = %entry 38 %t.0 = icmp ult i8 %start, %high 39 call void @use(i1 %t.0) 40 %start.1 = sub nuw i8 %start, 1 41 %t.1 = icmp ult i8 %start.1, %high 42 call void @use(i1 %t.1) 43 %start.2 = sub nuw i8 %start, 2 44 %t.2 = icmp ult i8 %start.2, %high 45 call void @use(i1 %t.2) 46 %start.3 = sub nuw i8 %start, 3 47 %t.3 = icmp ult i8 %start.3, %high 48 call void @use(i1 %t.3) 49 %start.4 = sub nuw i8 %start, 4 50 %c.4 = icmp ult i8 %start.4, %high 51 call void @use(i1 %c.4) 52 ret void 53} 54 55define void @test.not.uge.ule(i8 %start, i8 %low, i8 %high) { 56; CHECK-LABEL: @test.not.uge.ule( 57; CHECK-NEXT: entry: 58; CHECK-NEXT: [[SUB_PTR_I:%.*]] = sub nuw i8 [[START:%.*]], 3 59; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[SUB_PTR_I]], [[HIGH:%.*]] 60; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 61; CHECK: if.then: 62; CHECK-NEXT: ret void 63; CHECK: if.end: 64; CHECK-NEXT: [[T_0:%.*]] = icmp ule i8 [[START]], [[HIGH]] 65; CHECK-NEXT: call void @use(i1 [[T_0]]) 66; CHECK-NEXT: [[START_1:%.*]] = sub nuw i8 [[START]], 1 67; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[START_1]], [[HIGH]] 68; CHECK-NEXT: call void @use(i1 [[T_1]]) 69; CHECK-NEXT: [[START_2:%.*]] = sub nuw i8 [[START]], 2 70; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[START_2]], [[HIGH]] 71; CHECK-NEXT: call void @use(i1 true) 72; CHECK-NEXT: [[START_3:%.*]] = sub nuw i8 [[START]], 3 73; CHECK-NEXT: [[T_3:%.*]] = icmp ule i8 [[START_3]], [[HIGH]] 74; CHECK-NEXT: call void @use(i1 true) 75; CHECK-NEXT: [[START_4:%.*]] = sub nuw i8 [[START]], 4 76; CHECK-NEXT: [[T_4:%.*]] = icmp ule i8 [[START_4]], [[HIGH]] 77; CHECK-NEXT: call void @use(i1 true) 78; CHECK-NEXT: [[START_5:%.*]] = sub nuw i8 [[START]], 5 79; CHECK-NEXT: [[C_5:%.*]] = icmp ule i8 [[START_5]], [[HIGH]] 80; CHECK-NEXT: call void @use(i1 true) 81; CHECK-NEXT: ret void 82; 83entry: 84 %sub.ptr.i = sub nuw i8 %start, 3 85 %c.1 = icmp uge i8 %sub.ptr.i, %high 86 br i1 %c.1, label %if.then, label %if.end 87 88if.then: ; preds = %entry 89 ret void 90 91if.end: ; preds = %entry 92 %t.0 = icmp ule i8 %start, %high 93 call void @use(i1 %t.0) 94 %start.1 = sub nuw i8 %start, 1 95 %t.1 = icmp ule i8 %start.1, %high 96 call void @use(i1 %t.1) 97 %start.2 = sub nuw i8 %start, 2 98 %t.2 = icmp ule i8 %start.2, %high 99 call void @use(i1 %t.2) 100 %start.3 = sub nuw i8 %start, 3 101 %t.3 = icmp ule i8 %start.3, %high 102 call void @use(i1 %t.3) 103 %start.4 = sub nuw i8 %start, 4 104 %t.4 = icmp ule i8 %start.4, %high 105 call void @use(i1 %t.4) 106 107 %start.5 = sub nuw i8 %start, 5 108 %c.5 = icmp ule i8 %start.5, %high 109 call void @use(i1 %c.5) 110 111 ret void 112} 113 114define void @test.not.uge.ugt(i8 %start, i8 %low, i8 %high) { 115; CHECK-LABEL: @test.not.uge.ugt( 116; CHECK-NEXT: entry: 117; CHECK-NEXT: [[SUB_PTR_I:%.*]] = sub nuw i8 [[START:%.*]], 3 118; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[SUB_PTR_I]], [[HIGH:%.*]] 119; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 120; CHECK: if.then: 121; CHECK-NEXT: ret void 122; CHECK: if.end: 123; CHECK-NEXT: [[F_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]] 124; CHECK-NEXT: call void @use(i1 [[F_0]]) 125; CHECK-NEXT: [[START_1:%.*]] = sub nuw i8 [[START]], 1 126; CHECK-NEXT: [[F_1:%.*]] = icmp ugt i8 [[START_1]], [[HIGH]] 127; CHECK-NEXT: call void @use(i1 [[F_1]]) 128; CHECK-NEXT: [[START_2:%.*]] = sub nuw i8 [[START]], 2 129; CHECK-NEXT: [[F_2:%.*]] = icmp ugt i8 [[START_2]], [[HIGH]] 130; CHECK-NEXT: call void @use(i1 false) 131; CHECK-NEXT: [[START_3:%.*]] = sub nuw i8 [[START]], 3 132; CHECK-NEXT: [[F_3:%.*]] = icmp ugt i8 [[START_3]], [[HIGH]] 133; CHECK-NEXT: call void @use(i1 false) 134; CHECK-NEXT: [[START_4:%.*]] = sub nuw i8 [[START]], 4 135; CHECK-NEXT: [[F_4:%.*]] = icmp ugt i8 [[START_4]], [[HIGH]] 136; CHECK-NEXT: call void @use(i1 false) 137; CHECK-NEXT: [[START_5:%.*]] = sub nuw i8 [[START]], 5 138; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[START_5]], [[HIGH]] 139; CHECK-NEXT: call void @use(i1 false) 140; CHECK-NEXT: ret void 141; 142entry: 143 %sub.ptr.i = sub nuw i8 %start, 3 144 %c.1 = icmp uge i8 %sub.ptr.i, %high 145 br i1 %c.1, label %if.then, label %if.end 146 147if.then: ; preds = %entry 148 ret void 149 150if.end: ; preds = %entry 151 %f.0 = icmp ugt i8 %start, %high 152 call void @use(i1 %f.0) 153 154 %start.1 = sub nuw i8 %start, 1 155 %f.1 = icmp ugt i8 %start.1, %high 156 call void @use(i1 %f.1) 157 158 %start.2 = sub nuw i8 %start, 2 159 %f.2 = icmp ugt i8 %start.2, %high 160 call void @use(i1 %f.2) 161 162 %start.3 = sub nuw i8 %start, 3 163 %f.3 = icmp ugt i8 %start.3, %high 164 call void @use(i1 %f.3) 165 166 %start.4 = sub nuw i8 %start, 4 167 %f.4 = icmp ugt i8 %start.4, %high 168 call void @use(i1 %f.4) 169 170 %start.5 = sub nuw i8 %start, 5 171 %c.5 = icmp ugt i8 %start.5, %high 172 call void @use(i1 %c.5) 173 174 ret void 175} 176 177define void @test.not.uge.uge(i8 %start, i8 %low, i8 %high) { 178; CHECK-LABEL: @test.not.uge.uge( 179; CHECK-NEXT: entry: 180; CHECK-NEXT: [[SUB_PTR_I:%.*]] = sub nuw i8 [[START:%.*]], 3 181; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[SUB_PTR_I]], [[HIGH:%.*]] 182; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 183; CHECK: if.then: 184; CHECK-NEXT: ret void 185; CHECK: if.end: 186; CHECK-NEXT: [[F_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]] 187; CHECK-NEXT: call void @use(i1 [[F_0]]) 188; CHECK-NEXT: [[START_1:%.*]] = sub nuw i8 [[START]], 1 189; CHECK-NEXT: [[F_1:%.*]] = icmp uge i8 [[START_1]], [[HIGH]] 190; CHECK-NEXT: call void @use(i1 [[F_1]]) 191; CHECK-NEXT: [[START_2:%.*]] = sub nuw i8 [[START]], 2 192; CHECK-NEXT: [[F_2:%.*]] = icmp uge i8 [[START_2]], [[HIGH]] 193; CHECK-NEXT: call void @use(i1 [[F_2]]) 194; CHECK-NEXT: [[START_3:%.*]] = sub nuw i8 [[START]], 3 195; CHECK-NEXT: [[F_3:%.*]] = icmp uge i8 [[START_3]], [[HIGH]] 196; CHECK-NEXT: call void @use(i1 false) 197; CHECK-NEXT: [[START_4:%.*]] = sub nuw i8 [[START]], 4 198; CHECK-NEXT: [[C_4:%.*]] = icmp uge i8 [[START_4]], [[HIGH]] 199; CHECK-NEXT: call void @use(i1 false) 200; CHECK-NEXT: [[START_5:%.*]] = sub nuw i8 [[START]], 5 201; CHECK-NEXT: [[C_5:%.*]] = icmp uge i8 [[START_5]], [[HIGH]] 202; CHECK-NEXT: call void @use(i1 false) 203; CHECK-NEXT: ret void 204; 205entry: 206 %sub.ptr.i = sub nuw i8 %start, 3 207 %c.1 = icmp uge i8 %sub.ptr.i, %high 208 br i1 %c.1, label %if.then, label %if.end 209 210if.then: ; preds = %entry 211 ret void 212 213if.end: ; preds = %entry 214 %f.0 = icmp ugt i8 %start, %high 215 call void @use(i1 %f.0) 216 217 %start.1 = sub nuw i8 %start, 1 218 %f.1 = icmp uge i8 %start.1, %high 219 call void @use(i1 %f.1) 220 221 %start.2 = sub nuw i8 %start, 2 222 %f.2 = icmp uge i8 %start.2, %high 223 call void @use(i1 %f.2) 224 225 %start.3 = sub nuw i8 %start, 3 226 %f.3 = icmp uge i8 %start.3, %high 227 call void @use(i1 %f.3) 228 229 %start.4 = sub nuw i8 %start, 4 230 %c.4 = icmp uge i8 %start.4, %high 231 call void @use(i1 %c.4) 232 233 %start.5 = sub nuw i8 %start, 5 234 %c.5 = icmp uge i8 %start.5, %high 235 call void @use(i1 %c.5) 236 237 ret void 238} 239 240 241declare void @use(i1) 242declare void @llvm.trap() 243