Skip to content

Commit 851710d

Browse files
committed
[SimplifyCFG] Add additional tests for sinking (NFC)
This covers some interesting edge cases when the sink target is a loop header.
1 parent 29a925a commit 851710d

File tree

1 file changed

+98
-0
lines changed

1 file changed

+98
-0
lines changed

llvm/test/Transforms/SimplifyCFG/X86/sink-common-code.ll

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1604,4 +1604,102 @@ if.end:
16041604
ret void
16051605
}
16061606

1607+
define void @loop_use_in_different_bb(i32 %n) {
1608+
; CHECK-LABEL: @loop_use_in_different_bb(
1609+
; CHECK-NEXT: entry:
1610+
; CHECK-NEXT: [[ADD:%.*]] = add i32 [[N:%.*]], 1
1611+
; CHECK-NEXT: br label [[FOR_COND:%.*]]
1612+
; CHECK: for.cond:
1613+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY:%.*]] ]
1614+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[IV]], [[ADD]]
1615+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[RETURN:%.*]], label [[FOR_BODY]]
1616+
; CHECK: for.body:
1617+
; CHECK-NEXT: [[INC]] = add i32 [[IV]], 1
1618+
; CHECK-NEXT: br label [[FOR_COND]]
1619+
; CHECK: return:
1620+
; CHECK-NEXT: ret void
1621+
;
1622+
entry:
1623+
%add = add i32 %n, 1
1624+
br label %for.cond
1625+
1626+
for.cond:
1627+
%iv = phi i32 [ 0, %entry ], [ %inc, %for.body ]
1628+
%exitcond = icmp eq i32 %iv, %add
1629+
br i1 %exitcond, label %return, label %for.body
1630+
1631+
for.body:
1632+
%inc = add i32 %iv, 1
1633+
br label %for.cond
1634+
1635+
return:
1636+
ret void
1637+
}
1638+
1639+
define void @loop_use_in_different_bb_phi(i32 %n) {
1640+
; CHECK-LABEL: @loop_use_in_different_bb_phi(
1641+
; CHECK-NEXT: entry:
1642+
; CHECK-NEXT: [[ADD:%.*]] = add i32 [[N:%.*]], 1
1643+
; CHECK-NEXT: br label [[FOR_COND:%.*]]
1644+
; CHECK: for.cond:
1645+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY:%.*]] ]
1646+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[IV]], 42
1647+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[RETURN:%.*]], label [[FOR_BODY]]
1648+
; CHECK: for.body:
1649+
; CHECK-NEXT: [[DUMMY:%.*]] = phi i32 [ [[ADD]], [[FOR_COND]] ]
1650+
; CHECK-NEXT: [[INC]] = add i32 [[IV]], 1
1651+
; CHECK-NEXT: br label [[FOR_COND]]
1652+
; CHECK: return:
1653+
; CHECK-NEXT: ret void
1654+
;
1655+
entry:
1656+
%add = add i32 %n, 1
1657+
br label %for.cond
1658+
1659+
for.cond:
1660+
%iv = phi i32 [ 0, %entry ], [ %inc, %for.body ]
1661+
%exitcond = icmp eq i32 %iv, 42
1662+
br i1 %exitcond, label %return, label %for.body
1663+
1664+
for.body:
1665+
%dummy = phi i32 [ %add, %for.cond ]
1666+
%inc = add i32 %iv, 1
1667+
br label %for.cond
1668+
1669+
return:
1670+
ret void
1671+
}
1672+
1673+
define void @loop_use_in_wrong_phi_operand(i32 %n) {
1674+
; CHECK-LABEL: @loop_use_in_wrong_phi_operand(
1675+
; CHECK-NEXT: entry:
1676+
; CHECK-NEXT: [[ADD:%.*]] = add i32 [[N:%.*]], 1
1677+
; CHECK-NEXT: br label [[FOR_COND:%.*]]
1678+
; CHECK: for.cond:
1679+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[ADD]], [[FOR_BODY:%.*]] ]
1680+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[IV]], 42
1681+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[RETURN:%.*]], label [[FOR_BODY]]
1682+
; CHECK: for.body:
1683+
; CHECK-NEXT: [[INC:%.*]] = add i32 [[IV]], 1
1684+
; CHECK-NEXT: br label [[FOR_COND]]
1685+
; CHECK: return:
1686+
; CHECK-NEXT: ret void
1687+
;
1688+
entry:
1689+
%add = add i32 %n, 1
1690+
br label %for.cond
1691+
1692+
for.cond:
1693+
%iv = phi i32 [ 0, %entry ], [ %add, %for.body ]
1694+
%exitcond = icmp eq i32 %iv, 42
1695+
br i1 %exitcond, label %return, label %for.body
1696+
1697+
for.body:
1698+
%inc = add i32 %iv, 1
1699+
br label %for.cond
1700+
1701+
return:
1702+
ret void
1703+
}
1704+
16071705
!12 = !{i32 1}

0 commit comments

Comments
 (0)