Skip to content

Commit 7930c4a

Browse files
committed
C++: tests for phi nodes after unreachable blocks
1 parent 922cf64 commit 7930c4a

7 files changed

+1016
-0
lines changed

cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency.expected

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,21 @@ missingOperand
22
unexpectedOperand
33
duplicateOperand
44
missingPhiOperand
5+
| ssa.cpp:398:3:398:13 | Phi: return ... | Instruction 'Phi: return ...' is missing an operand for predecessor block 'VariableAddress: y' in function '$@'. | ssa.cpp:383:5:383:24 | int FusedBlockPhiOperand(int, int, int, bool) | int FusedBlockPhiOperand(int, int, int, bool) |
56
missingOperandType
67
duplicateChiOperand
78
sideEffectWithoutPrimary
89
instructionWithoutSuccessor
910
ambiguousSuccessors
1011
unexplainedLoop
1112
unnecessaryPhiInstruction
13+
| ssa.cpp:345:3:345:13 | Phi: return ... | Instruction 'Phi: return ...' is in a block with only 0 predecessors in function '$@'. | ssa.cpp:335:5:335:25 | int UnreachablePhiOperand(int, int) | int UnreachablePhiOperand(int, int) |
14+
| ssa.cpp:395:5:395:5 | Phi: ; | Instruction 'Phi: ;' is in a block with only 0 predecessors in function '$@'. | ssa.cpp:383:5:383:24 | int FusedBlockPhiOperand(int, int, int, bool) | int FusedBlockPhiOperand(int, int, int, bool) |
1215
memoryOperandDefinitionIsUnmodeled
1316
operandAcrossFunctions
1417
instructionWithoutUniqueBlock
18+
| ssa.cpp:345:3:345:13 | Phi: return ... | Instruction 'Phi: return ...' is a member of 0 blocks in function '$@'. | ssa.cpp:335:5:335:25 | int UnreachablePhiOperand(int, int) | int UnreachablePhiOperand(int, int) |
19+
| ssa.cpp:395:5:395:5 | Phi: ; | Instruction 'Phi: ;' is a member of 0 blocks in function '$@'. | ssa.cpp:383:5:383:24 | int FusedBlockPhiOperand(int, int, int, bool) | int FusedBlockPhiOperand(int, int, int, bool) |
1520
containsLoopOfForwardEdges
1621
lostReachability
1722
backEdgeCountMismatch

cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency_unsound.expected

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,21 @@ missingOperand
22
unexpectedOperand
33
duplicateOperand
44
missingPhiOperand
5+
| ssa.cpp:398:3:398:13 | Phi: return ... | Instruction 'Phi: return ...' is missing an operand for predecessor block 'VariableAddress: y' in function '$@'. | ssa.cpp:383:5:383:24 | int FusedBlockPhiOperand(int, int, int, bool) | int FusedBlockPhiOperand(int, int, int, bool) |
56
missingOperandType
67
duplicateChiOperand
78
sideEffectWithoutPrimary
89
instructionWithoutSuccessor
910
ambiguousSuccessors
1011
unexplainedLoop
1112
unnecessaryPhiInstruction
13+
| ssa.cpp:345:3:345:13 | Phi: return ... | Instruction 'Phi: return ...' is in a block with only 0 predecessors in function '$@'. | ssa.cpp:335:5:335:25 | int UnreachablePhiOperand(int, int) | int UnreachablePhiOperand(int, int) |
14+
| ssa.cpp:395:5:395:5 | Phi: ; | Instruction 'Phi: ;' is in a block with only 0 predecessors in function '$@'. | ssa.cpp:383:5:383:24 | int FusedBlockPhiOperand(int, int, int, bool) | int FusedBlockPhiOperand(int, int, int, bool) |
1215
memoryOperandDefinitionIsUnmodeled
1316
operandAcrossFunctions
1417
instructionWithoutUniqueBlock
18+
| ssa.cpp:345:3:345:13 | Phi: return ... | Instruction 'Phi: return ...' is a member of 0 blocks in function '$@'. | ssa.cpp:335:5:335:25 | int UnreachablePhiOperand(int, int) | int UnreachablePhiOperand(int, int) |
19+
| ssa.cpp:395:5:395:5 | Phi: ; | Instruction 'Phi: ;' is a member of 0 blocks in function '$@'. | ssa.cpp:383:5:383:24 | int FusedBlockPhiOperand(int, int, int, bool) | int FusedBlockPhiOperand(int, int, int, bool) |
1520
containsLoopOfForwardEdges
1621
lostReachability
1722
backEdgeCountMismatch

cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected

Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1589,3 +1589,228 @@ ssa.cpp:
15891589
# 319| v319_10(void) = ReturnVoid :
15901590
# 319| v319_11(void) = AliasedUse : ~m332_10
15911591
# 319| v319_12(void) = ExitFunction :
1592+
1593+
# 335| int UnreachablePhiOperand(int, int)
1594+
# 335| Block 0
1595+
# 335| v335_1(void) = EnterFunction :
1596+
# 335| m335_2(unknown) = AliasedDefinition :
1597+
# 335| m335_3(unknown) = InitializeNonLocal :
1598+
# 335| m335_4(unknown) = Chi : total:m335_2, partial:m335_3
1599+
# 335| r335_5(glval<int>) = VariableAddress[x] :
1600+
# 335| m335_6(int) = InitializeParameter[x] : &:r335_5
1601+
# 335| r335_7(glval<int>) = VariableAddress[y] :
1602+
# 335| m335_8(int) = InitializeParameter[y] : &:r335_7
1603+
# 336| r336_1(glval<bool>) = VariableAddress[b] :
1604+
# 336| r336_2(bool) = Constant[1] :
1605+
# 336| m336_3(bool) = Store[b] : &:r336_1, r336_2
1606+
# 337| r337_1(glval<int>) = VariableAddress[ret] :
1607+
# 337| m337_2(int) = Uninitialized[ret] : &:r337_1
1608+
# 339| r339_1(glval<bool>) = VariableAddress[b] :
1609+
# 339| r339_2(bool) = Load[b] : &:r339_1, m336_3
1610+
# 339| v339_3(void) = ConditionalBranch : r339_2
1611+
#-----| False -> Block 2
1612+
#-----| True -> Block 1
1613+
1614+
# 340| Block 1
1615+
# 340| r340_1(glval<int>) = VariableAddress[x] :
1616+
# 340| r340_2(int) = Load[x] : &:r340_1, m335_6
1617+
# 340| r340_3(glval<int>) = VariableAddress[ret] :
1618+
# 340| m340_4(int) = Store[ret] : &:r340_3, r340_2
1619+
# 345| r345_1(glval<int>) = VariableAddress[#return] :
1620+
# 345| r345_2(glval<int>) = VariableAddress[ret] :
1621+
# 345| r345_3(int) = Load[ret] : &:r345_2
1622+
# 345| m345_4(int) = Store[#return] : &:r345_1, r345_3
1623+
# 335| r335_9(glval<int>) = VariableAddress[#return] :
1624+
# 335| v335_10(void) = ReturnValue : &:r335_9, m345_4
1625+
# 335| v335_11(void) = AliasedUse : m335_3
1626+
# 335| v335_12(void) = ExitFunction :
1627+
1628+
# 335| Block 2
1629+
# 335| v335_13(void) = Unreached :
1630+
1631+
# 348| int UnreachablePhiOperand2(int, int, int, bool)
1632+
# 348| Block 0
1633+
# 348| v348_1(void) = EnterFunction :
1634+
# 348| m348_2(unknown) = AliasedDefinition :
1635+
# 348| m348_3(unknown) = InitializeNonLocal :
1636+
# 348| m348_4(unknown) = Chi : total:m348_2, partial:m348_3
1637+
# 348| r348_5(glval<int>) = VariableAddress[x] :
1638+
# 348| m348_6(int) = InitializeParameter[x] : &:r348_5
1639+
# 348| r348_7(glval<int>) = VariableAddress[y] :
1640+
# 348| m348_8(int) = InitializeParameter[y] : &:r348_7
1641+
# 348| r348_9(glval<int>) = VariableAddress[z] :
1642+
# 348| m348_10(int) = InitializeParameter[z] : &:r348_9
1643+
# 348| r348_11(glval<bool>) = VariableAddress[b1] :
1644+
# 348| m348_12(bool) = InitializeParameter[b1] : &:r348_11
1645+
# 349| r349_1(glval<bool>) = VariableAddress[b2] :
1646+
# 349| r349_2(bool) = Constant[1] :
1647+
# 349| m349_3(bool) = Store[b2] : &:r349_1, r349_2
1648+
# 350| r350_1(glval<int>) = VariableAddress[ret] :
1649+
# 350| m350_2(int) = Uninitialized[ret] : &:r350_1
1650+
# 352| r352_1(glval<bool>) = VariableAddress[b1] :
1651+
# 352| r352_2(bool) = Load[b1] : &:r352_1, m348_12
1652+
# 352| v352_3(void) = ConditionalBranch : r352_2
1653+
#-----| False -> Block 2
1654+
#-----| True -> Block 1
1655+
1656+
# 353| Block 1
1657+
# 353| r353_1(glval<int>) = VariableAddress[x] :
1658+
# 353| r353_2(int) = Load[x] : &:r353_1, m348_6
1659+
# 353| r353_3(glval<int>) = VariableAddress[ret] :
1660+
# 353| m353_4(int) = Store[ret] : &:r353_3, r353_2
1661+
#-----| Goto -> Block 4
1662+
1663+
# 355| Block 2
1664+
# 355| r355_1(glval<bool>) = VariableAddress[b2] :
1665+
# 355| r355_2(bool) = Load[b2] : &:r355_1, m349_3
1666+
# 355| v355_3(void) = ConditionalBranch : r355_2
1667+
#-----| False -> Block 5
1668+
#-----| True -> Block 3
1669+
1670+
# 356| Block 3
1671+
# 356| r356_1(glval<int>) = VariableAddress[y] :
1672+
# 356| r356_2(int) = Load[y] : &:r356_1, m348_8
1673+
# 356| r356_3(glval<int>) = VariableAddress[ret] :
1674+
# 356| m356_4(int) = Store[ret] : &:r356_3, r356_2
1675+
#-----| Goto -> Block 4
1676+
1677+
# 362| Block 4
1678+
# 362| m362_1(int) = Phi : from 1:m353_4, from 3:m356_4
1679+
# 362| r362_2(glval<int>) = VariableAddress[#return] :
1680+
# 362| r362_3(glval<int>) = VariableAddress[ret] :
1681+
# 362| r362_4(int) = Load[ret] : &:r362_3, m362_1
1682+
# 362| m362_5(int) = Store[#return] : &:r362_2, r362_4
1683+
# 348| r348_13(glval<int>) = VariableAddress[#return] :
1684+
# 348| v348_14(void) = ReturnValue : &:r348_13, m362_5
1685+
# 348| v348_15(void) = AliasedUse : m348_3
1686+
# 348| v348_16(void) = ExitFunction :
1687+
1688+
# 348| Block 5
1689+
# 348| v348_17(void) = Unreached :
1690+
1691+
# 365| int DegeneratePhi(int, int, bool)
1692+
# 365| Block 0
1693+
# 365| v365_1(void) = EnterFunction :
1694+
# 365| m365_2(unknown) = AliasedDefinition :
1695+
# 365| m365_3(unknown) = InitializeNonLocal :
1696+
# 365| m365_4(unknown) = Chi : total:m365_2, partial:m365_3
1697+
# 365| r365_5(glval<int>) = VariableAddress[x] :
1698+
# 365| m365_6(int) = InitializeParameter[x] : &:r365_5
1699+
# 365| r365_7(glval<int>) = VariableAddress[y] :
1700+
# 365| m365_8(int) = InitializeParameter[y] : &:r365_7
1701+
# 365| r365_9(glval<bool>) = VariableAddress[b1] :
1702+
# 365| m365_10(bool) = InitializeParameter[b1] : &:r365_9
1703+
# 366| r366_1(glval<bool>) = VariableAddress[b2] :
1704+
# 366| r366_2(bool) = Constant[1] :
1705+
# 366| m366_3(bool) = Store[b2] : &:r366_1, r366_2
1706+
# 367| r367_1(glval<int>) = VariableAddress[ret1] :
1707+
# 367| m367_2(int) = Uninitialized[ret1] : &:r367_1
1708+
# 368| r368_1(glval<int>) = VariableAddress[ret2] :
1709+
# 368| r368_2(glval<int>) = VariableAddress[x] :
1710+
# 368| r368_3(int) = Load[x] : &:r368_2, m365_6
1711+
# 368| m368_4(int) = Store[ret2] : &:r368_1, r368_3
1712+
# 370| r370_1(glval<bool>) = VariableAddress[b1] :
1713+
# 370| r370_2(bool) = Load[b1] : &:r370_1, m365_10
1714+
# 370| v370_3(void) = ConditionalBranch : r370_2
1715+
#-----| False -> Block 2
1716+
#-----| True -> Block 1
1717+
1718+
# 371| Block 1
1719+
# 371| r371_1(glval<int>) = VariableAddress[x] :
1720+
# 371| r371_2(int) = Load[x] : &:r371_1, m365_6
1721+
# 371| r371_3(glval<int>) = VariableAddress[ret1] :
1722+
# 371| m371_4(int) = Store[ret1] : &:r371_3, r371_2
1723+
#-----| Goto -> Block 4
1724+
1725+
# 373| Block 2
1726+
# 373| r373_1(glval<bool>) = VariableAddress[b2] :
1727+
# 373| r373_2(bool) = Load[b2] : &:r373_1, m366_3
1728+
# 373| v373_3(void) = ConditionalBranch : r373_2
1729+
#-----| False -> Block 5
1730+
#-----| True -> Block 3
1731+
1732+
# 374| Block 3
1733+
# 374| r374_1(glval<int>) = VariableAddress[x] :
1734+
# 374| r374_2(int) = Load[x] : &:r374_1, m365_6
1735+
# 374| r374_3(glval<int>) = VariableAddress[ret1] :
1736+
# 374| m374_4(int) = Store[ret1] : &:r374_3, r374_2
1737+
#-----| Goto -> Block 4
1738+
1739+
# 380| Block 4
1740+
# 380| m380_1(int) = Phi : from 1:m368_4, from 3:m368_4
1741+
# 380| m380_2(int) = Phi : from 1:m371_4, from 3:m374_4
1742+
# 380| r380_3(glval<int>) = VariableAddress[#return] :
1743+
# 380| r380_4(glval<int>) = VariableAddress[ret1] :
1744+
# 380| r380_5(int) = Load[ret1] : &:r380_4, m380_2
1745+
# 380| r380_6(glval<int>) = VariableAddress[ret2] :
1746+
# 380| r380_7(int) = Load[ret2] : &:r380_6, m380_1
1747+
# 380| r380_8(int) = Add : r380_5, r380_7
1748+
# 380| m380_9(int) = Store[#return] : &:r380_3, r380_8
1749+
# 365| r365_11(glval<int>) = VariableAddress[#return] :
1750+
# 365| v365_12(void) = ReturnValue : &:r365_11, m380_9
1751+
# 365| v365_13(void) = AliasedUse : m365_3
1752+
# 365| v365_14(void) = ExitFunction :
1753+
1754+
# 365| Block 5
1755+
# 365| v365_15(void) = Unreached :
1756+
1757+
# 383| int FusedBlockPhiOperand(int, int, int, bool)
1758+
# 383| Block 0
1759+
# 383| v383_1(void) = EnterFunction :
1760+
# 383| m383_2(unknown) = AliasedDefinition :
1761+
# 383| m383_3(unknown) = InitializeNonLocal :
1762+
# 383| m383_4(unknown) = Chi : total:m383_2, partial:m383_3
1763+
# 383| r383_5(glval<int>) = VariableAddress[x] :
1764+
# 383| m383_6(int) = InitializeParameter[x] : &:r383_5
1765+
# 383| r383_7(glval<int>) = VariableAddress[y] :
1766+
# 383| m383_8(int) = InitializeParameter[y] : &:r383_7
1767+
# 383| r383_9(glval<int>) = VariableAddress[z] :
1768+
# 383| m383_10(int) = InitializeParameter[z] : &:r383_9
1769+
# 383| r383_11(glval<bool>) = VariableAddress[b1] :
1770+
# 383| m383_12(bool) = InitializeParameter[b1] : &:r383_11
1771+
# 384| r384_1(glval<bool>) = VariableAddress[b2] :
1772+
# 384| r384_2(bool) = Constant[1] :
1773+
# 384| m384_3(bool) = Store[b2] : &:r384_1, r384_2
1774+
# 385| r385_1(glval<int>) = VariableAddress[ret] :
1775+
# 385| m385_2(int) = Uninitialized[ret] : &:r385_1
1776+
# 387| r387_1(glval<bool>) = VariableAddress[b1] :
1777+
# 387| r387_2(bool) = Load[b1] : &:r387_1, m383_12
1778+
# 387| v387_3(void) = ConditionalBranch : r387_2
1779+
#-----| False -> Block 2
1780+
#-----| True -> Block 1
1781+
1782+
# 388| Block 1
1783+
# 388| r388_1(glval<int>) = VariableAddress[x] :
1784+
# 388| r388_2(int) = Load[x] : &:r388_1, m383_6
1785+
# 388| r388_3(glval<int>) = VariableAddress[ret] :
1786+
# 388| m388_4(int) = Store[ret] : &:r388_3, r388_2
1787+
#-----| Goto -> Block 4
1788+
1789+
# 390| Block 2
1790+
# 390| r390_1(glval<bool>) = VariableAddress[b2] :
1791+
# 390| r390_2(bool) = Load[b2] : &:r390_1, m384_3
1792+
# 390| v390_3(void) = ConditionalBranch : r390_2
1793+
#-----| False -> Block 5
1794+
#-----| True -> Block 3
1795+
1796+
# 391| Block 3
1797+
# 391| r391_1(glval<int>) = VariableAddress[y] :
1798+
# 391| r391_2(int) = Load[y] : &:r391_1, m383_8
1799+
# 391| r391_3(glval<int>) = VariableAddress[ret] :
1800+
# 391| m391_4(int) = Store[ret] : &:r391_3, r391_2
1801+
# 395| v395_1(void) = NoOp :
1802+
#-----| Goto -> Block 4
1803+
1804+
# 398| Block 4
1805+
# 398| m398_1(int) = Phi : from 1:m388_4
1806+
# 398| r398_2(glval<int>) = VariableAddress[#return] :
1807+
# 398| r398_3(glval<int>) = VariableAddress[ret] :
1808+
# 398| r398_4(int) = Load[ret] : &:r398_3, m398_1
1809+
# 398| m398_5(int) = Store[#return] : &:r398_2, r398_4
1810+
# 383| r383_13(glval<int>) = VariableAddress[#return] :
1811+
# 383| v383_14(void) = ReturnValue : &:r383_13, m398_5
1812+
# 383| v383_15(void) = AliasedUse : m383_3
1813+
# 383| v383_16(void) = ExitFunction :
1814+
1815+
# 383| Block 5
1816+
# 383| v383_17(void) = Unreached :

0 commit comments

Comments
 (0)