xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/switch.ll (revision 39d7f700ce0103539fb00bd2841c5ca994c1a7f1)
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