Skip to content

Commit 70e71e4

Browse files
committed
[HEXAGON] [MachinePipeliner] Fix the DAG in case of dependent phis.
%3:intregs = PHI %21:intregs, %bb.6, %7:intregs, %bb.1 - SU0 %7:intregs = PHI %21:intregs, %bb.6, %13:intregs, %bb.1 - SU1 %27:intregs = A2_zxtb %3:intregs - SU2 %13:intregs = C2_muxri %45:predregs, 0, %46:intreg If we have dependent phis, SU0 should be the successor of SU1 not the other way around.
1 parent 132ed05 commit 70e71e4

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
;RUN: llc -march=hexagon -mv71t -O2 < %s -o - 2>&1 > /dev/null
2+
3+
; Validate that we do not crash while running this test.
4+
;%3:intregs = PHI %21:intregs, %bb.6, %7:intregs, %bb.1 - SU0
5+
;%7:intregs = PHI %21:intregs, %bb.6, %13:intregs, %bb.1 - SU1
6+
;%27:intregs = A2_zxtb %3:intregs - SU2
7+
;%13:intregs = C2_muxri %45:predregs, 0, %46:intreg
8+
;If we have dependent phis, SU0 should be the successor of SU1 not
9+
;the other way around. (it used to be SU1 is the successor of SU0).
10+
;In some cases, SU0 is scheduled earlier than SU1 resulting in bad
11+
;IR as we do not have a value that can be used by SU2.
12+
13+
@global = common dso_local local_unnamed_addr global ptr null, align 4
14+
@global.1 = common dso_local local_unnamed_addr global i32 0, align 4
15+
@global.2 = common dso_local local_unnamed_addr global i16 0, align 2
16+
@global.3 = common dso_local local_unnamed_addr global i16 0, align 2
17+
@global.4 = common dso_local local_unnamed_addr global i32 0, align 4
18+
19+
; Function Attrs: nofree norecurse nosync nounwind
20+
define dso_local i32 @wombat(i8 zeroext %arg) local_unnamed_addr #0 {
21+
bb:
22+
%load = load ptr, ptr @global, align 4
23+
%load1 = load i32, ptr @global.1, align 4
24+
%add2 = add nsw i32 %load1, -1
25+
store i32 %add2, ptr @global.1, align 4
26+
%icmp = icmp eq i32 %load1, 0
27+
br i1 %icmp, label %bb36, label %bb3
28+
29+
bb3: ; preds = %bb3, %bb
30+
%phi = phi i32 [ %add30, %bb3 ], [ %add2, %bb ]
31+
%phi4 = phi i8 [ %phi8, %bb3 ], [ %arg, %bb ]
32+
%phi5 = phi i16 [ %select23, %bb3 ], [ undef, %bb ]
33+
%phi6 = phi i16 [ %select26, %bb3 ], [ undef, %bb ]
34+
%phi7 = phi i16 [ %select, %bb3 ], [ undef, %bb ]
35+
%phi8 = phi i8 [ %select29, %bb3 ], [ %arg, %bb ]
36+
%zext = zext i8 %phi4 to i32
37+
%getelementptr = getelementptr inbounds i32, ptr %load, i32 %zext
38+
%getelementptr9 = getelementptr inbounds i32, ptr %getelementptr, i32 2
39+
%ptrtoint = ptrtoint ptr %getelementptr9 to i32
40+
%trunc = trunc i32 %ptrtoint to i16
41+
%sext10 = sext i16 %phi7 to i32
42+
%shl11 = shl i32 %ptrtoint, 16
43+
%ashr = ashr exact i32 %shl11, 16
44+
%icmp12 = icmp slt i32 %ashr, %sext10
45+
%select = select i1 %icmp12, i16 %trunc, i16 %phi7
46+
%getelementptr13 = getelementptr inbounds i32, ptr %getelementptr, i32 3
47+
%load14 = load i32, ptr %getelementptr13, align 4
48+
%shl = shl i32 %load14, 8
49+
%getelementptr15 = getelementptr inbounds i32, ptr %getelementptr, i32 1
50+
%load16 = load i32, ptr %getelementptr15, align 4
51+
%shl17 = shl i32 %load16, 16
52+
%ashr18 = ashr exact i32 %shl17, 16
53+
%add = add nsw i32 %ashr18, %load14
54+
%lshr = lshr i32 %add, 8
55+
%or = or i32 %lshr, %shl
56+
%sub = sub i32 %or, %load16
57+
%trunc19 = trunc i32 %sub to i16
58+
%sext = sext i16 %phi5 to i32
59+
%shl20 = shl i32 %sub, 16
60+
%ashr21 = ashr exact i32 %shl20, 16
61+
%icmp22 = icmp sgt i32 %ashr21, %sext
62+
%select23 = select i1 %icmp22, i16 %trunc19, i16 %phi5
63+
%sext24 = sext i16 %phi6 to i32
64+
%icmp25 = icmp slt i32 %ashr21, %sext24
65+
%select26 = select i1 %icmp25, i16 %trunc19, i16 %phi6
66+
%icmp27 = icmp eq i8 %phi8, 0
67+
%add28 = add i8 %phi8, -1
68+
%select29 = select i1 %icmp27, i8 0, i8 %add28
69+
%add30 = add nsw i32 %phi, -1
70+
%icmp31 = icmp eq i32 %phi, 0
71+
br i1 %icmp31, label %bb32, label %bb3
72+
73+
bb32: ; preds = %bb3
74+
store i16 %trunc, ptr @global.2, align 2
75+
store i16 %trunc19, ptr @global.3, align 2
76+
store i32 -1, ptr @global.1, align 4
77+
%sext33 = sext i16 %select to i32
78+
%sext34 = sext i16 %select23 to i32
79+
%sext35 = sext i16 %select26 to i32
80+
br label %bb36
81+
82+
bb36: ; preds = %bb32, %bb
83+
%phi37 = phi i32 [ %sext33, %bb32 ], [ 0, %bb ]
84+
%phi38 = phi i32 [ %sext35, %bb32 ], [ 0, %bb ]
85+
%phi39 = phi i32 [ %sext34, %bb32 ], [ 0, %bb ]
86+
%sub40 = sub nsw i32 %phi39, %phi38
87+
%icmp41 = icmp slt i32 %sub40, %phi37
88+
br i1 %icmp41, label %bb43, label %bb42
89+
90+
bb42: ; preds = %bb36
91+
store i32 0, ptr @global.4, align 4
92+
br label %bb43
93+
94+
bb43: ; preds = %bb42, %bb36
95+
ret i32 undef
96+
}

0 commit comments

Comments
 (0)