1 ; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -hoist-const-stores -ppc-stack-ptr-caller-preserved < %s | FileCheck %s
2 ; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -hoist-const-stores -ppc-stack-ptr-caller-preserved < %s | FileCheck %s -check-prefix=CHECKBE
4 ; Test hoist out of single loop
5 define signext i32 @test1(i32 signext %lim, ptr nocapture %Func) {
8 ; CHECK: for.body.preheader
11 ; CHECK-NOT: std 2, 24(1)
12 ; CHECKBE-LABEL: test1
13 ; CHECKBE: for.body.preheader
14 ; CHECKBE: std 2, 40(1)
16 ; CHECKBE-NOT: std 2, 40(1)
18 %cmp6 = icmp sgt i32 %lim, 0
19 br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup
21 for.body.preheader: ; preds = %entry
24 for.cond.cleanup: ; preds = %for.body, %entry
25 %Sum.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ]
28 for.body: ; preds = %for.body.preheader, %for.body
29 %i.08 = phi i32 [ %inc, %for.body ], [ 0, %for.body.preheader ]
30 %Sum.07 = phi i32 [ %add, %for.body ], [ 0, %for.body.preheader ]
31 %call = tail call signext i32 %Func(i32 signext %i.08)
32 %add = add nsw i32 %call, %Sum.07
33 %inc = add nuw nsw i32 %i.08, 1
34 %exitcond = icmp eq i32 %inc, %lim
35 br i1 %exitcond, label %for.cond.cleanup, label %for.body
38 ; Test hoist of nested loop goes to outter loop preheader
39 define signext i32 @test2(i32 signext %lim, ptr nocapture %Func) {
42 ; CHECK: for.body4.lr.ph.preheader
44 ; CHECK: for.body4.lr.ph
45 ; CHECK-NOT: std 2, 24(1)
46 ; CHECKBE-LABEL: test2
47 ; CHECKBE: for.body4.lr.ph.preheader
48 ; CHECKBE: std 2, 40(1)
49 ; CHECKBE: for.body4.lr.ph
50 ; CHECKBE-NOT: std 2, 40(1)
52 %cmp20 = icmp sgt i32 %lim, 0
53 br i1 %cmp20, label %for.body4.lr.ph.preheader, label %for.cond.cleanup
55 for.body4.lr.ph.preheader: ; preds = %entry
56 br label %for.body4.lr.ph
58 for.cond.cleanup: ; preds = %for.cond.cleanup3, %entry
59 %Sum.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.cond.cleanup3 ]
62 for.body4.lr.ph: ; preds = %for.body4.lr.ph.preheader, %for.cond.cleanup3
63 %j.022 = phi i32 [ %inc6, %for.cond.cleanup3 ], [ 0, %for.body4.lr.ph.preheader ]
64 %Sum.021 = phi i32 [ %add, %for.cond.cleanup3 ], [ 0, %for.body4.lr.ph.preheader ]
67 for.cond.cleanup3: ; preds = %for.body4
68 %inc6 = add nuw nsw i32 %j.022, 1
69 %exitcond24 = icmp eq i32 %inc6, %lim
70 br i1 %exitcond24, label %for.cond.cleanup, label %for.body4.lr.ph
72 for.body4: ; preds = %for.body4, %for.body4.lr.ph
73 %i.019 = phi i32 [ %j.022, %for.body4.lr.ph ], [ %inc, %for.body4 ]
74 %Sum.118 = phi i32 [ %Sum.021, %for.body4.lr.ph ], [ %add, %for.body4 ]
75 %call = tail call signext i32 %Func(i32 signext %i.019)
76 %add = add nsw i32 %call, %Sum.118
77 %inc = add nuw nsw i32 %i.019, 1
78 %exitcond = icmp eq i32 %inc, %lim
79 br i1 %exitcond, label %for.cond.cleanup3, label %for.body4
82 ; Test hoist out of if statement with low branch probability
83 ; FIXME: we shouldn't hoist in such cases as it could increase the number
84 ; of stores after hoisting.
85 define signext i32 @test3(i32 signext %lim, ptr nocapture %Func) {
88 ; CHECK: %for.body.lr.ph
91 ; CHECK-NOT: std 2, 24(1)
92 ; CHECKBE-LABEL: test3
93 ; CHECKBE: %for.body.lr.ph
94 ; CHECKBE: std 2, 40(1)
96 ; CHECKBE-NOT: std 2, 40(1)
98 %cmp13 = icmp sgt i32 %lim, 0
99 br i1 %cmp13, label %for.body.lr.ph, label %for.cond.cleanup
101 for.body.lr.ph: ; preds = %entry
102 %sub = add nsw i32 %lim, -1
105 for.cond.cleanup: ; preds = %if.end, %entry
106 %Sum.0.lcssa = phi i32 [ 0, %entry ], [ %add3, %if.end ]
109 for.body: ; preds = %if.end, %for.body.lr.ph
110 %i.015 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %if.end ]
111 %Sum.014 = phi i32 [ 0, %for.body.lr.ph ], [ %add3, %if.end ]
112 %cmp1 = icmp eq i32 %i.015, %sub
113 br i1 %cmp1, label %if.then, label %if.end
115 if.then: ; preds = %for.body
116 %call = tail call signext i32 %Func(i32 signext %sub)
117 %add = add nsw i32 %call, %Sum.014
120 if.end: ; preds = %if.then, %for.body
121 %Sum.1 = phi i32 [ %add, %if.then ], [ %Sum.014, %for.body ]
122 %call2 = tail call signext i32 @func(i32 signext %i.015)
123 %add3 = add nsw i32 %call2, %Sum.1
124 %inc = add nuw nsw i32 %i.015, 1
125 %exitcond = icmp eq i32 %inc, %lim
126 br i1 %exitcond, label %for.cond.cleanup, label %for.body
129 declare signext i32 @func(i32 signext)