1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3 4declare void @use(i1) 5 6define void @test_1_variable_constraint(i8 %x, i8 %y, i8 %z) { 7; CHECK-LABEL: @test_1_variable_constraint( 8; CHECK-NEXT: entry: 9; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]] 10; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[BB2:%.*]] 11; CHECK: bb1: 12; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[X]], [[Y]] 13; CHECK-NEXT: call void @use(i1 true) 14; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[X]], 10 15; CHECK-NEXT: call void @use(i1 [[C_2]]) 16; CHECK-NEXT: [[C_3:%.*]] = icmp ule i8 [[Y]], [[X]] 17; CHECK-NEXT: call void @use(i1 [[C_3]]) 18; CHECK-NEXT: [[C_4:%.*]] = icmp ule i8 10, [[X]] 19; CHECK-NEXT: call void @use(i1 [[C_4]]) 20; CHECK-NEXT: ret void 21; CHECK: bb2: 22; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[Y]], [[X]] 23; CHECK-NEXT: call void @use(i1 true) 24; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[X]], [[Y]] 25; CHECK-NEXT: call void @use(i1 false) 26; CHECK-NEXT: [[C_5:%.*]] = icmp ule i8 [[X]], 10 27; CHECK-NEXT: call void @use(i1 [[C_5]]) 28; CHECK-NEXT: [[C_6:%.*]] = icmp ule i8 10, [[X]] 29; CHECK-NEXT: call void @use(i1 [[C_6]]) 30; CHECK-NEXT: ret void 31; 32entry: 33 %c.1 = icmp ule i8 %x, %y 34 br i1 %c.1, label %bb1, label %bb2 35 36bb1: 37 %t.1 = icmp ule i8 %x, %y 38 call void @use(i1 %t.1) 39 %c.2 = icmp ule i8 %x, 10 40 call void @use(i1 %c.2) 41 %c.3 = icmp ule i8 %y, %x 42 call void @use(i1 %c.3) 43 %c.4 = icmp ule i8 10, %x 44 call void @use(i1 %c.4) 45 ret void 46 47bb2: 48 %t.2 = icmp ule i8 %y, %x 49 call void @use(i1 %t.2) 50 %f.1 = icmp ule i8 %x, %y 51 call void @use(i1 %f.1) 52 %c.5 = icmp ule i8 %x, 10 53 call void @use(i1 %c.5) 54 %c.6 = icmp ule i8 10, %x 55 call void @use(i1 %c.6) 56 ret void 57} 58 59define void @test_1_constant_constraint(i8 %x) { 60; CHECK-LABEL: @test_1_constant_constraint( 61; CHECK-NEXT: entry: 62; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10 63; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[BB2:%.*]] 64; CHECK: bb1: 65; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[X]], 10 66; CHECK-NEXT: call void @use(i1 true) 67; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[X]], 11 68; CHECK-NEXT: call void @use(i1 true) 69; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[X]], 9 70; CHECK-NEXT: call void @use(i1 [[C_2]]) 71; CHECK-NEXT: [[C_4:%.*]] = icmp ule i8 10, [[X]] 72; CHECK-NEXT: call void @use(i1 [[C_4]]) 73; CHECK-NEXT: ret void 74; CHECK: bb2: 75; CHECK-NEXT: [[T_3:%.*]] = icmp ule i8 10, [[X]] 76; CHECK-NEXT: call void @use(i1 true) 77; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[X]], 9 78; CHECK-NEXT: call void @use(i1 false) 79; CHECK-NEXT: [[F_1_1:%.*]] = icmp ule i8 [[X]], 10 80; CHECK-NEXT: call void @use(i1 false) 81; CHECK-NEXT: [[C_5:%.*]] = icmp ule i8 [[X]], 11 82; CHECK-NEXT: call void @use(i1 [[C_5]]) 83; CHECK-NEXT: [[C_6:%.*]] = icmp ule i8 12, [[X]] 84; CHECK-NEXT: call void @use(i1 [[C_6]]) 85; CHECK-NEXT: ret void 86; 87entry: 88 %c.1 = icmp ule i8 %x, 10 89 br i1 %c.1, label %bb1, label %bb2 90 91bb1: 92 %t.1 = icmp ule i8 %x, 10 93 call void @use(i1 %t.1) 94 %t.2 = icmp ule i8 %x, 11 95 call void @use(i1 %t.2) 96 %c.2 = icmp ule i8 %x, 9 97 call void @use(i1 %c.2) 98 %c.4 = icmp ule i8 10, %x 99 call void @use(i1 %c.4) 100 ret void 101 102bb2: 103 %t.3 = icmp ule i8 10, %x 104 call void @use(i1 %t.3) 105 %f.1 = icmp ule i8 %x, 9 106 call void @use(i1 %f.1) 107 108 109 %f.1.1 = icmp ule i8 %x, 10 110 call void @use(i1 %f.1.1) 111 %c.5 = icmp ule i8 %x, 11 112 call void @use(i1 %c.5) 113 %c.6 = icmp ule i8 12, %x 114 call void @use(i1 %c.6) 115 ret void 116} 117 118 119define i8 @test1(i8 %x, i8 %y, i8 %z) { 120; CHECK-LABEL: @test1( 121; CHECK-NEXT: entry: 122; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]] 123; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[EXIT:%.*]] 124; CHECK: bb1: 125; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[Y]], [[Z:%.*]] 126; CHECK-NEXT: br i1 [[C_2]], label [[BB2:%.*]], label [[EXIT]] 127; CHECK: bb2: 128; CHECK-NEXT: [[C_3:%.*]] = icmp ule i8 [[X]], [[Z]] 129; CHECK-NEXT: br i1 true, label [[BB3:%.*]], label [[EXIT]] 130; CHECK: bb3: 131; CHECK-NEXT: ret i8 10 132; CHECK: exit: 133; CHECK-NEXT: ret i8 20 134; 135entry: 136 %c.1 = icmp ule i8 %x, %y 137 br i1 %c.1, label %bb1, label %exit 138 139bb1: 140 %c.2 = icmp ule i8 %y, %z 141 br i1 %c.2, label %bb2, label %exit 142 143bb2: 144 %c.3 = icmp ule i8 %x, %z 145 br i1 %c.3, label %bb3, label %exit 146 147bb3: 148 ret i8 10 149 150exit: 151 ret i8 20 152} 153 154 155define i8 @test2(i8 %x, i8 %y, i8 %z, i8 %a) { 156; CHECK-LABEL: @test2( 157; CHECK-NEXT: entry: 158; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]] 159; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[EXIT:%.*]] 160; CHECK: bb1: 161; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[Y]], [[Z:%.*]] 162; CHECK-NEXT: br i1 [[C_2]], label [[BB2:%.*]], label [[EXIT]] 163; CHECK: bb2: 164; CHECK-NEXT: [[C_3:%.*]] = icmp ule i8 [[X]], [[A:%.*]] 165; CHECK-NEXT: br i1 [[C_3]], label [[BB3:%.*]], label [[EXIT]] 166; CHECK: bb3: 167; CHECK-NEXT: ret i8 10 168; CHECK: exit: 169; CHECK-NEXT: ret i8 20 170; 171entry: 172 %c.1 = icmp ule i8 %x, %y 173 br i1 %c.1, label %bb1, label %exit 174 175bb1: 176 %c.2 = icmp ule i8 %y, %z 177 br i1 %c.2, label %bb2, label %exit 178 179bb2: 180 %c.3 = icmp ule i8 %x, %a 181 br i1 %c.3, label %bb3, label %exit 182 183bb3: 184 ret i8 10 185 186exit: 187 ret i8 20 188} 189 190 191define i8 @test3(i8 %x, i8 %y) { 192; CHECK-LABEL: @test3( 193; CHECK-NEXT: entry: 194; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10 195; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[EXIT:%.*]] 196; CHECK: bb1: 197; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[Y:%.*]], 20 198; CHECK-NEXT: br i1 [[C_2]], label [[BB2:%.*]], label [[EXIT]] 199; CHECK: bb2: 200; CHECK-NEXT: ret i8 10 201; CHECK: exit: 202; CHECK-NEXT: ret i8 20 203; 204entry: 205 %c.1 = icmp ule i8 %x, 10 206 br i1 %c.1, label %bb1, label %exit 207 208bb1: 209 %c.2 = icmp ule i8 %y, 20 210 br i1 %c.2, label %bb2, label %exit 211 212bb2: 213 ret i8 10 214 215exit: 216 ret i8 20 217} 218 219define i8 @test4(i8 %x, i8 %y, i8 %z) { 220; CHECK-LABEL: @test4( 221; CHECK-NEXT: entry: 222; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]] 223; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[EXIT:%.*]] 224; CHECK: bb1: 225; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[Y]], [[Z:%.*]] 226; CHECK-NEXT: br i1 [[C_2]], label [[BB2:%.*]], label [[EXIT]] 227; CHECK: bb2: 228; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[X]], [[Z]] 229; CHECK-NEXT: call void @use(i1 true) 230; CHECK-NEXT: [[U_1:%.*]] = icmp eq i8 [[X]], [[Z]] 231; CHECK-NEXT: call void @use(i1 [[U_1]]) 232; CHECK-NEXT: ret i8 10 233; CHECK: exit: 234; CHECK-NEXT: ret i8 20 235; 236entry: 237 %c.1 = icmp ule i8 %x, %y 238 br i1 %c.1, label %bb1, label %exit 239 240bb1: 241 %c.2 = icmp ule i8 %y, %z 242 br i1 %c.2, label %bb2, label %exit 243 244bb2: 245 %t.1 = icmp ule i8 %x, %z 246 call void @use(i1 %t.1) 247 %u.1 = icmp eq i8 %x, %z 248 call void @use(i1 %u.1) 249 ret i8 10 250 251 252exit: 253 ret i8 20 254} 255