346 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4define i1 @wrapping_add_unknown_1(i8 %a) {5; CHECK-LABEL: @wrapping_add_unknown_1(6; CHECK-NEXT: entry:7; CHECK-NEXT: [[SUB:%.*]] = add i8 [[A:%.*]], -18; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[SUB]], 09; CHECK-NEXT: ret i1 [[CMP]]10;11entry:12 %sub = add i8 %a, -113 %cmp = icmp eq i8 %sub, 014 ret i1 %cmp15}16 17define i1 @wrapping_add_known_1(i8 %a) {18; CHECK-LABEL: @wrapping_add_known_1(19; CHECK-NEXT: entry:20; CHECK-NEXT: [[PRE:%.*]] = icmp eq i8 [[A:%.*]], 121; CHECK-NEXT: br i1 [[PRE]], label [[THEN:%.*]], label [[ELSE:%.*]]22; CHECK: then:23; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[A]], -124; CHECK-NEXT: ret i1 true25; CHECK: else:26; CHECK-NEXT: [[SUB_2:%.*]] = add i8 [[A]], -127; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[SUB_2]], 028; CHECK-NEXT: ret i1 [[C_2]]29;30entry:31 %pre = icmp eq i8 %a, 132 br i1 %pre, label %then, label %else33 34then:35 %sub.1 = add i8 %a, -136 %c.1 = icmp eq i8 %sub.1, 037 ret i1 %c.138 39else:40 %sub.2 = add i8 %a, -141 %c.2 = icmp eq i8 %sub.2, 042 ret i1 %c.243}44 45define i1 @wrapping_add_unknown_2(i8 %a) {46; CHECK-LABEL: @wrapping_add_unknown_2(47; CHECK-NEXT: entry:48; CHECK-NEXT: [[PRE:%.*]] = icmp eq i8 [[A:%.*]], 049; CHECK-NEXT: br i1 [[PRE]], label [[THEN:%.*]], label [[ELSE:%.*]]50; CHECK: then:51; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[A]], -152; CHECK-NEXT: [[C_1:%.*]] = icmp eq i8 [[SUB_1]], 053; CHECK-NEXT: ret i1 [[C_1]]54; CHECK: else:55; CHECK-NEXT: [[SUB_2:%.*]] = add i8 [[A]], -156; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[SUB_2]], 057; CHECK-NEXT: ret i1 [[C_2]]58;59entry:60 %pre = icmp eq i8 %a, 061 br i1 %pre, label %then, label %else62 63then:64 %sub.1 = add i8 %a, -165 %c.1 = icmp eq i8 %sub.1, 066 ret i1 %c.167 68else:69 %sub.2 = add i8 %a, -170 %c.2 = icmp eq i8 %sub.2, 071 ret i1 %c.272}73 74; Test from https://github.com/llvm/llvm-project/issues/48253.75define i1 @test_48253_eq_ne(i8 %a, i8 %b) {76; CHECK-LABEL: @test_48253_eq_ne(77; CHECK-NEXT: entry:78; CHECK-NEXT: [[CMP_1:%.*]] = icmp ne i8 [[A:%.*]], [[B:%.*]]79; CHECK-NEXT: [[CMP_2:%.*]] = icmp eq i8 [[B]], 080; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP_1]], [[CMP_2]]81; CHECK-NEXT: br i1 [[OR]], label [[EXIT_1:%.*]], label [[IF_END:%.*]]82; CHECK: if.end:83; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[B]], -184; CHECK-NEXT: [[SUB_2:%.*]] = add i8 [[B]], -285; CHECK-NEXT: [[C_2:%.*]] = icmp ult i8 [[SUB_2]], [[A]]86; CHECK-NEXT: [[XOR_1:%.*]] = xor i1 true, [[C_2]]87; CHECK-NEXT: ret i1 [[XOR_1]]88; CHECK: exit.1:89; CHECK-NEXT: [[SUB_3:%.*]] = add i8 [[B]], -190; CHECK-NEXT: [[C_3:%.*]] = icmp ult i8 [[SUB_3]], [[A]]91; CHECK-NEXT: [[SUB_4:%.*]] = add i8 [[B]], -292; CHECK-NEXT: [[C_4:%.*]] = icmp ult i8 [[SUB_4]], [[A]]93; CHECK-NEXT: [[XOR_2:%.*]] = xor i1 [[C_3]], [[C_4]]94; CHECK-NEXT: ret i1 [[XOR_2]]95;96entry:97 %cmp.1 = icmp ne i8 %a, %b98 %cmp.2 = icmp eq i8 %b, 099 %or = or i1 %cmp.1, %cmp.2100 br i1 %or, label %exit.1, label %if.end101 102if.end:103 %sub.1 = add i8 %b, -1104 %t.1 = icmp ult i8 %sub.1, %a105 %sub.2 = add i8 %b, -2106 %c.2 = icmp ult i8 %sub.2, %a107 %xor.1 = xor i1 %t.1, %c.2108 ret i1 %xor.1109 110exit.1:111 %sub.3 = add i8 %b, -1112 %c.3 = icmp ult i8 %sub.3, %a113 %sub.4 = add i8 %b, -2114 %c.4 = icmp ult i8 %sub.4, %a115 %xor.2 = xor i1 %c.3, %c.4116 ret i1 %xor.2117}118 119define i1 @test_ult(i8 %a, i8 %b) {120; CHECK-LABEL: @test_ult(121; CHECK-NEXT: entry:122; CHECK-NEXT: [[CMP_1:%.*]] = icmp uge i8 [[A:%.*]], 20123; CHECK-NEXT: [[CMP_2:%.*]] = icmp ult i8 [[A]], [[B:%.*]]124; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP_1]], [[CMP_2]]125; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[A]], -1126; CHECK-NEXT: [[SUB_2:%.*]] = add i8 [[A]], -2127; CHECK-NEXT: [[SUB_3:%.*]] = add i8 [[A]], -20128; CHECK-NEXT: [[SUB_4:%.*]] = add i8 [[A]], 21129; CHECK-NEXT: [[ADD_1:%.*]] = add i8 [[A]], 1130; CHECK-NEXT: br i1 [[AND]], label [[IF_END:%.*]], label [[EXIT_1:%.*]]131; CHECK: if.end:132; CHECK-NEXT: [[XOR_1:%.*]] = xor i1 true, true133; CHECK-NEXT: [[XOR_2:%.*]] = xor i1 [[XOR_1]], true134; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[SUB_4]], [[B]]135; CHECK-NEXT: [[XOR_3:%.*]] = xor i1 [[XOR_2]], [[C_1]]136; CHECK-NEXT: [[C_2:%.*]] = icmp ult i8 [[ADD_1]], [[B]]137; CHECK-NEXT: [[XOR_4:%.*]] = xor i1 [[XOR_3]], [[C_2]]138; CHECK-NEXT: ret i1 [[XOR_4]]139; CHECK: exit.1:140; CHECK-NEXT: [[C_3:%.*]] = icmp ult i8 [[SUB_1]], [[B]]141; CHECK-NEXT: [[C_4:%.*]] = icmp ult i8 [[SUB_2]], [[B]]142; CHECK-NEXT: [[XOR_5:%.*]] = xor i1 [[C_3]], [[C_4]]143; CHECK-NEXT: [[C_5:%.*]] = icmp ult i8 [[SUB_3]], [[B]]144; CHECK-NEXT: [[XOR_6:%.*]] = xor i1 [[XOR_5]], [[C_5]]145; CHECK-NEXT: [[C_6:%.*]] = icmp ult i8 [[SUB_4]], [[B]]146; CHECK-NEXT: [[XOR_7:%.*]] = xor i1 [[XOR_6]], [[C_6]]147; CHECK-NEXT: [[C_7:%.*]] = icmp ult i8 [[ADD_1]], [[B]]148; CHECK-NEXT: [[XOR_8:%.*]] = xor i1 [[XOR_7]], [[C_7]]149; CHECK-NEXT: ret i1 [[XOR_8]]150;151entry:152 %cmp.1 = icmp uge i8 %a, 20153 %cmp.2 = icmp ult i8 %a, %b154 %and = and i1 %cmp.1, %cmp.2155 %sub.1 = add i8 %a, -1156 %sub.2 = add i8 %a, -2157 %sub.3 = add i8 %a, -20158 %sub.4 = add i8 %a, 21159 %add.1 = add i8 %a, 1160 br i1 %and, label %if.end, label %exit.1161 162if.end:163 %t.1 = icmp ult i8 %sub.1, %b164 %t.2 = icmp ult i8 %sub.2, %b165 %xor.1 = xor i1 %t.1, %t.2166 167 %t.3 = icmp ult i8 %sub.3, %b168 %xor.2 = xor i1 %xor.1, %t.3169 170 %c.1 = icmp ult i8 %sub.4, %b171 %xor.3 = xor i1 %xor.2, %c.1172 173 %c.2 = icmp ult i8 %add.1, %b174 %xor.4 = xor i1 %xor.3, %c.2175 ret i1 %xor.4176 177exit.1:178 %c.3 = icmp ult i8 %sub.1, %b179 %c.4 = icmp ult i8 %sub.2, %b180 %xor.5 = xor i1 %c.3, %c.4181 182 %c.5 = icmp ult i8 %sub.3, %b183 %xor.6 = xor i1 %xor.5, %c.5184 185 %c.6 = icmp ult i8 %sub.4, %b186 %xor.7 = xor i1 %xor.6, %c.6187 188 %c.7 = icmp ult i8 %add.1, %b189 %xor.8 = xor i1 %xor.7, %c.7190 ret i1 %xor.8191}192 193define i1 @test_slt(i8 %a, i8 %b) {194; CHECK-LABEL: @test_slt(195; CHECK-NEXT: entry:196; CHECK-NEXT: [[CMP_1:%.*]] = icmp sge i8 [[A:%.*]], 20197; CHECK-NEXT: [[CMP_2:%.*]] = icmp slt i8 [[A]], [[B:%.*]]198; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP_1]], [[CMP_2]]199; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[A]], -1200; CHECK-NEXT: [[SUB_2:%.*]] = add i8 [[A]], -2201; CHECK-NEXT: [[SUB_3:%.*]] = add i8 [[A]], -20202; CHECK-NEXT: [[SUB_4:%.*]] = add i8 [[A]], 21203; CHECK-NEXT: [[ADD_1:%.*]] = add i8 [[A]], 1204; CHECK-NEXT: br i1 [[AND]], label [[IF_END:%.*]], label [[EXIT_1:%.*]]205; CHECK: if.end:206; CHECK-NEXT: [[T_1:%.*]] = icmp slt i8 [[SUB_1]], [[B]]207; CHECK-NEXT: [[T_2:%.*]] = icmp slt i8 [[SUB_2]], [[B]]208; CHECK-NEXT: [[XOR_1:%.*]] = xor i1 [[T_1]], [[T_2]]209; CHECK-NEXT: [[T_3:%.*]] = icmp slt i8 [[SUB_3]], [[B]]210; CHECK-NEXT: [[XOR_2:%.*]] = xor i1 [[XOR_1]], [[T_3]]211; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[SUB_4]], [[B]]212; CHECK-NEXT: [[XOR_3:%.*]] = xor i1 [[XOR_2]], [[C_1]]213; CHECK-NEXT: [[C_2:%.*]] = icmp slt i8 [[ADD_1]], [[B]]214; CHECK-NEXT: [[XOR_4:%.*]] = xor i1 [[XOR_3]], [[C_2]]215; CHECK-NEXT: ret i1 [[XOR_4]]216; CHECK: exit.1:217; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[SUB_1]], [[B]]218; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[SUB_2]], [[B]]219; CHECK-NEXT: [[XOR_5:%.*]] = xor i1 [[C_3]], [[C_4]]220; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[SUB_3]], [[B]]221; CHECK-NEXT: [[XOR_6:%.*]] = xor i1 [[XOR_5]], [[C_5]]222; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[SUB_4]], [[B]]223; CHECK-NEXT: [[XOR_7:%.*]] = xor i1 [[XOR_6]], [[C_6]]224; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[ADD_1]], [[B]]225; CHECK-NEXT: [[XOR_8:%.*]] = xor i1 [[XOR_7]], [[C_7]]226; CHECK-NEXT: ret i1 [[XOR_8]]227;228entry:229 %cmp.1 = icmp sge i8 %a, 20230 %cmp.2 = icmp slt i8 %a, %b231 %and = and i1 %cmp.1, %cmp.2232 %sub.1 = add i8 %a, -1233 %sub.2 = add i8 %a, -2234 %sub.3 = add i8 %a, -20235 %sub.4 = add i8 %a, 21236 %add.1 = add i8 %a, 1237 br i1 %and, label %if.end, label %exit.1238 239if.end:240 %t.1 = icmp slt i8 %sub.1, %b241 %t.2 = icmp slt i8 %sub.2, %b242 %xor.1 = xor i1 %t.1, %t.2243 244 %t.3 = icmp slt i8 %sub.3, %b245 %xor.2 = xor i1 %xor.1, %t.3246 247 %c.1 = icmp slt i8 %sub.4, %b248 %xor.3 = xor i1 %xor.2, %c.1249 250 %c.2 = icmp slt i8 %add.1, %b251 %xor.4 = xor i1 %xor.3, %c.2252 ret i1 %xor.4253 254exit.1:255 %c.3 = icmp slt i8 %sub.1, %b256 %c.4 = icmp slt i8 %sub.2, %b257 %xor.5 = xor i1 %c.3, %c.4258 259 %c.5 = icmp slt i8 %sub.3, %b260 %xor.6 = xor i1 %xor.5, %c.5261 262 %c.6 = icmp slt i8 %sub.4, %b263 %xor.7 = xor i1 %xor.6, %c.6264 265 %c.7 = icmp slt i8 %add.1, %b266 %xor.8 = xor i1 %xor.7, %c.7267 ret i1 %xor.8268}269 270define i1 @wrapping_add_known_1_add_nuw(i8 %a) {271; CHECK-LABEL: @wrapping_add_known_1_add_nuw(272; CHECK-NEXT: entry:273; CHECK-NEXT: [[PRE:%.*]] = icmp eq i8 [[A:%.*]], 1274; CHECK-NEXT: call void @llvm.assume(i1 [[PRE]])275; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[A]], -1276; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[SUB_1]], 10277; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, true278; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], false279; CHECK-NEXT: ret i1 [[RES_2]]280;281entry:282 %pre = icmp eq i8 %a, 1283 call void @llvm.assume(i1 %pre)284 %sub.1 = add i8 %a, -1285 %add = add nuw i8 %sub.1, 10286 %t.1 = icmp uge i8 %add, 10287 %t.2 = icmp ule i8 %add, 10288 %res.1 = xor i1 %t.1, %t.2289 %f.1 = icmp ult i8 %add, 10290 %res.2 = xor i1 %res.1, %f.1291 ret i1 %res.2292}293 294define i1 @add_nuw_wrapping_add_known_1(i8 %a) {295; CHECK-LABEL: @add_nuw_wrapping_add_known_1(296; CHECK-NEXT: entry:297; CHECK-NEXT: [[PRE:%.*]] = icmp eq i8 [[A:%.*]], 1298; CHECK-NEXT: call void @llvm.assume(i1 [[PRE]])299; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[A]], 10300; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[ADD]], -1301; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, true302; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], false303; CHECK-NEXT: ret i1 [[RES_2]]304;305entry:306 %pre = icmp eq i8 %a, 1307 call void @llvm.assume(i1 %pre)308 %add = add nuw i8 %a, 10309 %sub.1 = add i8 %add, -1310 %t.1 = icmp uge i8 %sub.1, 10311 %t.2 = icmp ule i8 %sub.1, 10312 %res.1 = xor i1 %t.1, %t.2313 %f.1 = icmp ult i8 %sub.1, 10314 %res.2 = xor i1 %res.1, %f.1315 ret i1 %res.2316}317 318define i1 @add_nuw_wrapping_add_not_known_1(i8 %a) {319; CHECK-LABEL: @add_nuw_wrapping_add_not_known_1(320; CHECK-NEXT: entry:321; CHECK-NEXT: [[PRE:%.*]] = icmp sge i8 [[A:%.*]], -1322; CHECK-NEXT: call void @llvm.assume(i1 [[PRE]])323; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[A]], 10324; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[ADD]], -1325; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[SUB_1]], 10326; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[SUB_1]], 10327; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[T_2]]328; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 [[SUB_1]], 10329; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[F_1]]330; CHECK-NEXT: ret i1 [[RES_2]]331;332entry:333 %pre = icmp sge i8 %a, -1334 call void @llvm.assume(i1 %pre)335 %add = add nuw i8 %a, 10336 %sub.1 = add i8 %add, -1337 %t.1 = icmp uge i8 %sub.1, 10338 %t.2 = icmp ule i8 %sub.1, 10339 %res.1 = xor i1 %t.1, %t.2340 %f.1 = icmp ult i8 %sub.1, 10341 %res.2 = xor i1 %res.1, %f.1342 ret i1 %res.2343}344 345declare void @llvm.assume(i1)346