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