brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.8 KiB · 09dea55 Raw
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