1e10b0ea3SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2e10b0ea3SFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3e10b0ea3SFlorian Hahn 4e10b0ea3SFlorian Hahndeclare void @may_unwind() 5e10b0ea3SFlorian Hahn 60cb35306SFlorian Hahndefine i1 @test_switch_in_block_with_assume(i8 %x) { 7e10b0ea3SFlorian Hahn; CHECK-LABEL: @test_switch_in_block_with_assume( 8e10b0ea3SFlorian Hahn; CHECK-NEXT: entry: 9e10b0ea3SFlorian Hahn; CHECK-NEXT: call void @may_unwind() 100cb35306SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[X:%.*]], 10 11e10b0ea3SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) 120cb35306SFlorian Hahn; CHECK-NEXT: switch i8 0, label [[EXIT_1:%.*]] [ 130cb35306SFlorian Hahn; CHECK-NEXT: i8 1, label [[EXIT_2:%.*]] 14e10b0ea3SFlorian Hahn; CHECK-NEXT: ] 15e10b0ea3SFlorian Hahn; CHECK: exit.1: 160cb35306SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ult i8 [[X]], 9 17e10b0ea3SFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, [[C_2]] 18e10b0ea3SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_1]] 19e10b0ea3SFlorian Hahn; CHECK: exit.2: 200cb35306SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp ult i8 [[X]], 9 21e10b0ea3SFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = xor i1 true, [[C_3]] 22e10b0ea3SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_2]] 23e10b0ea3SFlorian Hahn; 24e10b0ea3SFlorian Hahnentry: 25e10b0ea3SFlorian Hahn call void @may_unwind() 260cb35306SFlorian Hahn %c.1 = icmp ult i8 %x, 10 27e10b0ea3SFlorian Hahn call void @llvm.assume(i1 %c.1) 280cb35306SFlorian Hahn switch i8 0, label %exit.1 [ 290cb35306SFlorian Hahn i8 1, label %exit.2 30e10b0ea3SFlorian Hahn ] 31e10b0ea3SFlorian Hahn 32e10b0ea3SFlorian Hahnexit.1: 330cb35306SFlorian Hahn %t.1 = icmp ult i8 %x, 10 340cb35306SFlorian Hahn %c.2 = icmp ult i8 %x, 9 35e10b0ea3SFlorian Hahn %res.1 = xor i1 %t.1, %c.2 36e10b0ea3SFlorian Hahn ret i1 %res.1 37e10b0ea3SFlorian Hahn 38e10b0ea3SFlorian Hahnexit.2: 390cb35306SFlorian Hahn %t.2 = icmp ult i8 %x, 10 400cb35306SFlorian Hahn %c.3 = icmp ult i8 %x, 9 41e10b0ea3SFlorian Hahn %res.2 = xor i1 %t.2, %c.3 42e10b0ea3SFlorian Hahn ret i1 %res.2 43e10b0ea3SFlorian Hahn} 44e10b0ea3SFlorian Hahn 45e10b0ea3SFlorian Hahndeclare void @llvm.assume(i1) 462d14317aSFlorian Hahn 470cb35306SFlorian Hahndefine i1 @simplify_based_on_switch(i8 %x) { 482d14317aSFlorian Hahn; CHECK-LABEL: @simplify_based_on_switch( 492d14317aSFlorian Hahn; CHECK-NEXT: entry: 500cb35306SFlorian Hahn; CHECK-NEXT: switch i8 [[X:%.*]], label [[EXIT_1:%.*]] [ 510cb35306SFlorian Hahn; CHECK-NEXT: i8 6, label [[EXIT_2:%.*]] 520cb35306SFlorian Hahn; CHECK-NEXT: i8 10, label [[EXIT_3:%.*]] 532d14317aSFlorian Hahn; CHECK-NEXT: ] 542d14317aSFlorian Hahn; CHECK: exit.1: 550cb35306SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[X]], 7 560cb35306SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ult i8 [[X]], 6 572d14317aSFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]] 582d14317aSFlorian Hahn; CHECK-NEXT: ret i1 [[RES_1]] 592d14317aSFlorian Hahn; CHECK: exit.2: 60*39d7f700SFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = xor i1 true, false 612d14317aSFlorian Hahn; CHECK-NEXT: ret i1 [[RES_2]] 622d14317aSFlorian Hahn; CHECK: exit.3: 63*39d7f700SFlorian Hahn; CHECK-NEXT: [[RES_3:%.*]] = xor i1 true, false 642d14317aSFlorian Hahn; CHECK-NEXT: ret i1 [[RES_3]] 652d14317aSFlorian Hahn; 662d14317aSFlorian Hahnentry: 670cb35306SFlorian Hahn switch i8 %x, label %exit.1 [ 680cb35306SFlorian Hahn i8 6, label %exit.2 690cb35306SFlorian Hahn i8 10, label %exit.3 702d14317aSFlorian Hahn ] 712d14317aSFlorian Hahn 722d14317aSFlorian Hahnexit.1: 730cb35306SFlorian Hahn %c.1 = icmp ult i8 %x, 7 740cb35306SFlorian Hahn %c.2 = icmp ult i8 %x, 6 752d14317aSFlorian Hahn %res.1 = xor i1 %c.1, %c.2 762d14317aSFlorian Hahn ret i1 %res.1 772d14317aSFlorian Hahn 782d14317aSFlorian Hahnexit.2: 790cb35306SFlorian Hahn %t.1 = icmp ult i8 %x, 7 800cb35306SFlorian Hahn %f.1 = icmp ult i8 %x, 6 812d14317aSFlorian Hahn %res.2 = xor i1 %t.1, %f.1 822d14317aSFlorian Hahn ret i1 %res.2 832d14317aSFlorian Hahn 842d14317aSFlorian Hahnexit.3: 850cb35306SFlorian Hahn %t.2 = icmp ult i8 %x, 11 860cb35306SFlorian Hahn %f.2 = icmp ult i8 %x, 10 872d14317aSFlorian Hahn %res.3 = xor i1 %t.2, %f.2 882d14317aSFlorian Hahn ret i1 %res.3 892d14317aSFlorian Hahn} 902d14317aSFlorian Hahn 910cb35306SFlorian Hahndefine i1 @simplify_based_on_switch_successor_branches(i8 %x) { 922d14317aSFlorian Hahn; CHECK-LABEL: @simplify_based_on_switch_successor_branches( 932d14317aSFlorian Hahn; CHECK-NEXT: entry: 940cb35306SFlorian Hahn; CHECK-NEXT: switch i8 [[X:%.*]], label [[EXIT_1:%.*]] [ 950cb35306SFlorian Hahn; CHECK-NEXT: i8 6, label [[EXIT_2:%.*]] 960cb35306SFlorian Hahn; CHECK-NEXT: i8 10, label [[EXIT_3:%.*]] 972d14317aSFlorian Hahn; CHECK-NEXT: ] 982d14317aSFlorian Hahn; CHECK: exit.1: 990cb35306SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[X]], 7 1000cb35306SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ult i8 [[X]], 6 1012d14317aSFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]] 1022d14317aSFlorian Hahn; CHECK-NEXT: ret i1 [[RES_1]] 1032d14317aSFlorian Hahn; CHECK: exit.2: 104*39d7f700SFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = xor i1 true, false 1052d14317aSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[RES_2]]) 1062d14317aSFlorian Hahn; CHECK-NEXT: br label [[EXIT_3]] 1072d14317aSFlorian Hahn; CHECK: exit.3: 1080cb35306SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp ult i8 [[X]], 11 1090cb35306SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp ult i8 [[X]], 10 1102d14317aSFlorian Hahn; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[C_3]], [[C_4]] 1112d14317aSFlorian Hahn; CHECK-NEXT: ret i1 [[RES_3]] 1122d14317aSFlorian Hahn; 1132d14317aSFlorian Hahnentry: 1140cb35306SFlorian Hahn switch i8 %x, label %exit.1 [ 1150cb35306SFlorian Hahn i8 6, label %exit.2 1160cb35306SFlorian Hahn i8 10, label %exit.3 1172d14317aSFlorian Hahn ] 1182d14317aSFlorian Hahn 1192d14317aSFlorian Hahnexit.1: 1200cb35306SFlorian Hahn %c.1 = icmp ult i8 %x, 7 1210cb35306SFlorian Hahn %c.2 = icmp ult i8 %x, 6 1222d14317aSFlorian Hahn %res.1 = xor i1 %c.1, %c.2 1232d14317aSFlorian Hahn ret i1 %res.1 1242d14317aSFlorian Hahn 1252d14317aSFlorian Hahnexit.2: 1260cb35306SFlorian Hahn %t.1 = icmp ult i8 %x, 7 1270cb35306SFlorian Hahn %f.1 = icmp ult i8 %x, 6 1282d14317aSFlorian Hahn %res.2 = xor i1 %t.1, %f.1 1292d14317aSFlorian Hahn call void @use(i1 %res.2) 1302d14317aSFlorian Hahn br label %exit.3 1312d14317aSFlorian Hahn 1322d14317aSFlorian Hahnexit.3: 1330cb35306SFlorian Hahn %c.3 = icmp ult i8 %x, 11 1340cb35306SFlorian Hahn %c.4 = icmp ult i8 %x, 10 1352d14317aSFlorian Hahn %res.3 = xor i1 %c.3, %c.4 1362d14317aSFlorian Hahn ret i1 %res.3 1372d14317aSFlorian Hahn} 1382d14317aSFlorian Hahn 1390cb35306SFlorian Hahndefine i1 @switch_same_destination_for_different_cases(i8 %x) { 1400cb35306SFlorian Hahn; CHECK-LABEL: @switch_same_destination_for_different_cases( 1410cb35306SFlorian Hahn; CHECK-NEXT: entry: 1420cb35306SFlorian Hahn; CHECK-NEXT: switch i8 [[X:%.*]], label [[EXIT_1:%.*]] [ 1430cb35306SFlorian Hahn; CHECK-NEXT: i8 6, label [[EXIT_2:%.*]] 1440cb35306SFlorian Hahn; CHECK-NEXT: i8 10, label [[EXIT_2]] 1450cb35306SFlorian Hahn; CHECK-NEXT: ] 1460cb35306SFlorian Hahn; CHECK: exit.1: 1470cb35306SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[X]], 7 1480cb35306SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ult i8 [[X]], 6 1490cb35306SFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]] 1500cb35306SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_1]] 1510cb35306SFlorian Hahn; CHECK: exit.2: 1520cb35306SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp ult i8 [[X]], 7 1530cb35306SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 1540cb35306SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp ult i8 [[X]], 6 1550cb35306SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 1560cb35306SFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp ult i8 [[X]], 11 1570cb35306SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 1580cb35306SFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp ult i8 [[X]], 10 1590cb35306SFlorian Hahn; CHECK-NEXT: ret i1 [[C_6]] 1600cb35306SFlorian Hahn; 1610cb35306SFlorian Hahnentry: 1620cb35306SFlorian Hahn switch i8 %x, label %exit.1 [ 1630cb35306SFlorian Hahn i8 6, label %exit.2 1640cb35306SFlorian Hahn i8 10, label %exit.2 1650cb35306SFlorian Hahn ] 1660cb35306SFlorian Hahn 1670cb35306SFlorian Hahnexit.1: 1680cb35306SFlorian Hahn %c.1 = icmp ult i8 %x, 7 1690cb35306SFlorian Hahn %c.2 = icmp ult i8 %x, 6 1700cb35306SFlorian Hahn %res.1 = xor i1 %c.1, %c.2 1710cb35306SFlorian Hahn ret i1 %res.1 1720cb35306SFlorian Hahn 1730cb35306SFlorian Hahnexit.2: 1740cb35306SFlorian Hahn %c.3 = icmp ult i8 %x, 7 1750cb35306SFlorian Hahn call void @use(i1 %c.3) 1760cb35306SFlorian Hahn %c.4 = icmp ult i8 %x, 6 1770cb35306SFlorian Hahn call void @use(i1 %c.4) 1780cb35306SFlorian Hahn %c.5 = icmp ult i8 %x, 11 1790cb35306SFlorian Hahn call void @use(i1 %c.5) 1800cb35306SFlorian Hahn %c.6 = icmp ult i8 %x, 10 1810cb35306SFlorian Hahn ret i1 %c.6 1820cb35306SFlorian Hahn} 1830cb35306SFlorian Hahn 1842d14317aSFlorian Hahndeclare void @use(i1) 185