Hi Krzysztof,
Thanks for the reply, I’m starting to understand the graph structure and terminology much better now, especially with the document in RDFGraph.h. I’m still a bit confused about some of the behavior I’m seeing with the phi nodes that involve aggregate registers. Here is one example:
b1531: — %bb.36 — preds(2): %bb.35, %bb.128 succs(1): %bb.37
p3193: phi [+d3194(,u3211):, u3195(+d3170,b1526):u1437, u3196(d2141,b2486):u2324]
p3197: phi [+d3198(,u3216):, u3199(+d3138,b1526):u1465, u3200(+d3364,b2486):]
p3201: phi [+d3202(,d1541,):, u3203(+d3146,b1526):, u3204(d1878,b2486):u3148]
p3205: phi [+d3206<#1073741833>(,d1551,u1552):, u3207"<#1073741833>(d1521,b1526):u1524, u3779"<#1073741833>(d1517,b1526):, u3780"<#1073741833>(d1513,b1526):u1522, u3208"<#1073741833>(d2481,b2486):u2484, u3695"<#1073741833>(d2477,b2486):, u3696"<#1073741833>(d2473,b2486):u2482]
s1532: ADJCALLSTACKDOWN64 [d1533!(+d3206,~d3647",u1557):, d1534!(+d3206,d1540,):d1533, d1535!(+d3206,~d3646",u1558):d1534, u1536!(+d3206):, u1537!(+d3206):u1536]
s1538: MOV32r0 [d1539(+d3202,):, d1540!(d1534,d1549,):, d1541(+d3202,u3221):d1539]
s1542: MOV32ri64 [d1543(+d3206,~d3645",u1561):d1535]
s1544: COPY [d1545(+d3206,~d3644",u1559):d1543, u1546(d785):]
s1547: MOV32r0 [d1548(+d3206,~d3643",u1560):d1545, d1549!(d1540,~d3642",):]
s1550: MOV64rm [d1551(+d3206,~d1554",u1562):d1548, u1552(+d3206):u1537]
s1553: CALL64pcrel32 __foo [~d1554"<#1073741833>!(d1551,d1579,):, ~d3642"<#1073741833>!(d1549,):, ~d3643"<#1073741833>!(d1548,):, ~d3644"<#1073741833>!(d1545,):, ~d3645"<#1073741833>!(d1543,):, ~d3646"<#1073741833>!(d1535,):, ~d3647"<#1073741833>!(d1533,):, d1555!(~d1554",d1564,u1567):, d1556!(~d1554",d1566,u1568):d1555, u1557!(d1533):, u1558!(d1535):, u1559!(d1545):, u1560!(d1548):, u1561!(d1543):, u1562!(d1551):]
s1563: ADJCALLSTACKUP64 [d1564!(d1555,u3778"):, d1565!(~d1554",d1571,):d1556, d1566!(d1556,u3777"):,
u1567!(d1555):, u1568!(d1556):]
s1569: MOV32r0 [d1570(~d1554",u3776"):d1565, d1571!(d1565,d1574,):]
s1572: MOV32r0 [d1573(~d1554",u3775"):d1570, d1574!(d1571,d1577,):]
s1575: MOV32r0 [d1576(~d1554",u3774"):d1573, d1577!(d1574,u3773"):]
—> s1578: MOV64rm [d1579(~d1554",u3226"):d1576]
b1580: — %bb.37 — preds(3): %bb.36, %bb.49, %bb.64 succs(1): %bb.38
p3209: phi [+d3210(,d1731,u3212):, u3211(+d3194,b1531):, u3212(+d3210,b1710):, u3213(d1857,b1874):u3466]
p3214: phi [+d3215(,u3217):, u3216(+d3198,b1531):, u3217(+d3215,b1710):u3257, u3218(+d3290,b1874):u3470]
p3219: phi [+d3220(,d1712,u1714):, u3221(d1541,b1531):, u3222(d1712,b1710):u1717, u3223(d1878,b1874):u3204]
—> p3224: phi [+d3225<#1073741833>(,d1598,):, u3226"<#1073741833>(d1579,b1531):, u3773"<#1073741833>(d1577,b1531):, u3774"<#1073741833>(d1576,b1531):, u3775"<#1073741833>(d1573,b1531):, u3776"<#1073741833>(d1570,b1531):, u3777"<#1073741833>(d1566,b1531):, u3778"<#1073741833>(d1564,b1531):, u3227<#1073741833>(d1716,b1710):u1719, u3228"<#1073741833>(d1885,b1874):u3751", u3754"<#1073741833>(d1880,b1874):u1887, u3755"<#1073741833>(d1865,b1874):u3752", u3756"<#1073741833>(d1861,b1874):u3753"]
s1581: IMUL64rri8 [d1582(+d3225,d1596,u1592):, d1583!(+d3225,d1595,):d1582, u1584(+d3220):]
s1585: LEA64r [d1586(+d3225,u3772"):d1583, u1587(d776):, u1588(d1582):]
s1589: LEA64r [d1590(+d3225,u3771"):d1586, u1591(+d3142):u1455, u1592(d1582):u1588]
s1593: MOV32r0 [d1594(d1582,):, d1595!(d1583,d1599,):, d1596(d1582,u3770"):d1594]
s1597: MOV32r0 [d1598(+d3225,u3769"):d1590, d1599!(d1595,u3231"):]
I have used arrows to highlight two nodes. The first node, s1578, def’s d1579, which has a single reached use in phi node p3224. I am surprised that this phi node exists and has no reached uses, for two reasons. First, I built the graph without the KeepDeadPhis option. Shouldn’t this remove phi nodes without reached uses? Second, there clearly is a reached use of R11 (corresponding to the instruction represented by s1578) in another basic block:
b1721: — %bb.50 — preds(1): %bb.49 succs(1): %bb.51
s1722: COPY [d1723(+d3248,u3765"):d1713, u1724(d785):u1546]
—> s1725: COPY [d1726(+d3248,u3764"):d1723, u1727(+d3248):]
s1728: MOV32r0 [d1729(+d3210,):, d1730!(d1716,u3261"):, d1731(+d3210,u3253):d1729]
I have confirmed via manual inspection and the use of a dynamic analysis tool that the next use of the R11 def in s1578 is s1725.
Could you please clarify these two points?
Thanks,
Scott