aboutsummaryrefslogtreecommitdiffstats
path: root/test/CodeGen/X86/postra-licm.ll
blob: 5c93160125e7191013b6b7db6fb2c3c814efc9c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
; RUN: llc < %s -mtriple=i386-apple-darwin -relocation-model=pic -disable-fp-elim | FileCheck %s -check-prefix=X86-32
; RUN: llc < %s -mtriple=x86_64-apple-darwin -relocation-model=pic -disable-fp-elim | FileCheck %s -check-prefix=X86-64

; MachineLICM should be able to hoist loop invariant reload out of the loop.
; Only linear scan needs this, -regalloc=greedy sinks the spill instead.
; rdar://7233099

%struct.FILE = type { i8*, i32, i32, i16, i16, %struct.__sbuf, i32, i8*, i32 (i8*)*, i32 (i8*, i8*, i32)*, i64 (i8*, i64, i32)*, i32 (i8*, i8*, i32)*, %struct.__sbuf, %struct.__sFILEX*, i32, [3 x i8], [1 x i8], %struct.__sbuf, i32, i64 }
%struct.__sFILEX = type opaque
%struct.__sbuf = type { i8*, i32 }
%struct.epoch_t = type { %struct.trans_t*, %struct.trans_t*, i32, i32, i32, i32, i32 }
%struct.trans_t = type { i32, i32, i32, i8* }

@.str12 = external constant [2 x i8], align 1     ; <[2 x i8]*> [#uses=1]
@.str19 = external constant [7 x i8], align 1     ; <[7 x i8]*> [#uses=1]
@.str24 = external constant [4 x i8], align 1     ; <[4 x i8]*> [#uses=1]

define i32 @t1(i32 %c, i8** nocapture %v) nounwind ssp {
; X86-32-LABEL: t1:
entry:
  br i1 undef, label %bb, label %bb3

bb:                                               ; preds = %entry
  unreachable

bb3:                                              ; preds = %entry
  br i1 undef, label %bb.i, label %bb.nph41

bb.i:                                             ; preds = %bb3
  unreachable

bb.nph41:                                         ; preds = %bb3
  %0 = call %struct.FILE* @"\01_fopen$UNIX2003"(i8* undef, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str12, i32 0, i32 0)) nounwind ; <%struct.FILE*> [#uses=3]
  br i1 undef, label %bb4, label %bb5.preheader

bb5.preheader:                                    ; preds = %bb.nph41
  br label %bb5

bb4:                                              ; preds = %bb.nph41
  unreachable

bb5:                                              ; preds = %bb5, %bb5.preheader
  br i1 undef, label %bb7, label %bb5

bb7:                                              ; preds = %bb5
  br i1 undef, label %bb9, label %bb12

bb9:                                              ; preds = %bb7
  unreachable

bb12:                                             ; preds = %bb7
  br i1 undef, label %bb16, label %bb22

bb16:                                             ; preds = %bb12
  unreachable

bb22:                                             ; preds = %bb12
  br label %bb.i1

bb.i1:                                            ; preds = %bb.i1, %bb22
  %1 = icmp eq i8 undef, 69                       ; <i1> [#uses=1]
  br i1 %1, label %imix_test.exit, label %bb.i1

imix_test.exit:                                   ; preds = %bb.i1
  br i1 undef, label %bb23, label %bb26.preheader

bb26.preheader:                                   ; preds = %imix_test.exit
  br i1 undef, label %bb28, label %bb30

bb23:                                             ; preds = %imix_test.exit
  unreachable
; Verify that there are no loads inside the loop.
; X86-32: .align 4
; X86-32: %bb28
; X86-32-NOT: (%esp),
; X86-32-NOT: (%ebp),
; X86-32: jmp

bb28:                                             ; preds = %bb28, %bb26.preheader
  %counter.035 = phi i32 [ %3, %bb28 ], [ 0, %bb26.preheader ] ; <i32> [#uses=2]
  %tmp56 = shl i32 %counter.035, 2                ; <i32> [#uses=0]
  %2 = call i8* @fgets(i8* undef, i32 50, %struct.FILE* %0) nounwind ; <i8*> [#uses=0]
  %3 = add nsw i32 %counter.035, 1                ; <i32> [#uses=1]
  %4 = call i32 @feof(%struct.FILE* %0) nounwind  ; <i32> [#uses=0]
  br label %bb28

bb30:                                             ; preds = %bb26.preheader
  %5 = call i32 @strcmp(i8* undef, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str19, i32 0, i32 0)) nounwind readonly ; <i32> [#uses=0]
  br i1 undef, label %bb34, label %bb70

bb32.loopexit:                                    ; preds = %bb45
  %6 = icmp eq i32 undef, 0                       ; <i1> [#uses=1]
  %indvar.next55 = add i32 %indvar54, 1           ; <i32> [#uses=1]
  br i1 %6, label %bb34, label %bb70

bb34:                                             ; preds = %bb32.loopexit, %bb30
  %indvar54 = phi i32 [ %indvar.next55, %bb32.loopexit ], [ 0, %bb30 ] ; <i32> [#uses=3]
  br i1 false, label %bb35, label %bb39.preheader

bb35:                                             ; preds = %bb34
  unreachable

bb39.preheader:                                   ; preds = %bb34
  %7 = getelementptr inbounds %struct.epoch_t, %struct.epoch_t* undef, i32 %indvar54, i32 3 ; <i32*> [#uses=1]
  %8 = getelementptr inbounds %struct.epoch_t, %struct.epoch_t* undef, i32 %indvar54, i32 2 ; <i32*> [#uses=0]
  br i1 false, label %bb42, label %bb45

bb42:                                             ; preds = %bb39.preheader
  unreachable

bb45:                                             ; preds = %bb39.preheader
  %9 = call i32 @strcmp(i8* undef, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str24, i32 0, i32 0)) nounwind readonly ; <i32> [#uses=0]
  br i1 false, label %bb47, label %bb32.loopexit

bb47:                                             ; preds = %bb45
  %10 = load i32, i32* %7, align 4                     ; <i32> [#uses=0]
  unreachable

bb70:                                             ; preds = %bb32.loopexit, %bb30
  br i1 undef, label %bb78, label %bb76

bb76:                                             ; preds = %bb70
  unreachable

bb78:                                             ; preds = %bb70
  br i1 undef, label %bb83, label %bb79

bb79:                                             ; preds = %bb78
  unreachable

bb83:                                             ; preds = %bb78
  call void @rewind(%struct.FILE* %0) nounwind
  unreachable
}

declare %struct.FILE* @"\01_fopen$UNIX2003"(i8*, i8*)

declare i8* @fgets(i8*, i32, %struct.FILE* nocapture) nounwind

declare void @rewind(%struct.FILE* nocapture) nounwind

declare i32 @feof(%struct.FILE* nocapture) nounwind

declare i32 @strcmp(i8* nocapture, i8* nocapture) nounwind readonly

@map_4_to_16 = external constant [16 x i16], align 32 ; <[16 x i16]*> [#uses=2]

define void @t2(i8* nocapture %bufp, i8* nocapture %data, i32 %dsize) nounwind ssp {
; X86-64-LABEL: t2:
entry:
  br i1 undef, label %return, label %bb.nph

bb.nph:                                           ; preds = %entry
; X86-64: movq _map_4_to_16@GOTPCREL(%rip)
; X86-64: .align 4
  %tmp5 = zext i32 undef to i64                   ; <i64> [#uses=1]
  %tmp6 = add i64 %tmp5, 1                        ; <i64> [#uses=1]
  %tmp11 = shl i64 undef, 1                       ; <i64> [#uses=1]
  %tmp14 = mul i64 undef, 3                       ; <i64> [#uses=1]
  br label %bb

bb:                                               ; preds = %bb, %bb.nph
  %tmp9 = mul i64 undef, undef                    ; <i64> [#uses=2]
  %tmp12 = add i64 %tmp11, %tmp9                  ; <i64> [#uses=1]
  %scevgep13 = getelementptr i8, i8* %bufp, i64 %tmp12 ; <i8*> [#uses=1]
  %tmp15 = add i64 %tmp14, %tmp9                  ; <i64> [#uses=1]
  %scevgep16 = getelementptr i8, i8* %bufp, i64 %tmp15 ; <i8*> [#uses=1]
  %0 = load i8, i8* undef, align 1                    ; <i8> [#uses=1]
  %1 = zext i8 %0 to i32                          ; <i32> [#uses=1]
  %2 = getelementptr inbounds [16 x i16], [16 x i16]* @map_4_to_16, i64 0, i64 0 ; <i16*> [#uses=1]
  %3 = load i16, i16* %2, align 2                      ; <i16> [#uses=1]
  %4 = trunc i16 %3 to i8                         ; <i8> [#uses=1]
  store i8 %4, i8* undef, align 1
  %5 = and i32 %1, 15                             ; <i32> [#uses=1]
  %6 = zext i32 %5 to i64                         ; <i64> [#uses=1]
  %7 = getelementptr inbounds [16 x i16], [16 x i16]* @map_4_to_16, i64 0, i64 %6 ; <i16*> [#uses=1]
  %8 = load i16, i16* %7, align 2                      ; <i16> [#uses=2]
  %9 = lshr i16 %8, 8                             ; <i16> [#uses=1]
  %10 = trunc i16 %9 to i8                        ; <i8> [#uses=1]
  store i8 %10, i8* %scevgep13, align 1
  %11 = trunc i16 %8 to i8                        ; <i8> [#uses=1]
  store i8 %11, i8* %scevgep16, align 1
  %exitcond = icmp eq i64 undef, %tmp6            ; <i1> [#uses=1]
  br i1 %exitcond, label %return, label %bb

return:                                           ; preds = %bb, %entry
  ret void
}