@@ -6,11 +6,7 @@ define void @store_load(ptr %ptr) {
6
6
; CHECK-SAME: ptr [[PTR:%.*]]) {
7
7
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
8
8
; CHECK-NEXT: [[PTR1:%.*]] = getelementptr float, ptr [[PTR]], i32 1
9
- ; CHECK-NEXT: [[LD0:%.*]] = load float, ptr [[PTR0]], align 4
10
- ; CHECK-NEXT: [[LD1:%.*]] = load float, ptr [[PTR1]], align 4
11
9
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4
12
- ; CHECK-NEXT: store float [[LD0]], ptr [[PTR0]], align 4
13
- ; CHECK-NEXT: store float [[LD1]], ptr [[PTR1]], align 4
14
10
; CHECK-NEXT: store <2 x float> [[VECL]], ptr [[PTR0]], align 4
15
11
; CHECK-NEXT: ret void
16
12
;
@@ -31,14 +27,8 @@ define void @store_fpext_load(ptr %ptr) {
31
27
; CHECK-NEXT: [[PTR1:%.*]] = getelementptr float, ptr [[PTR]], i32 1
32
28
; CHECK-NEXT: [[PTRD0:%.*]] = getelementptr double, ptr [[PTR]], i32 0
33
29
; CHECK-NEXT: [[PTRD1:%.*]] = getelementptr double, ptr [[PTR]], i32 1
34
- ; CHECK-NEXT: [[LD0:%.*]] = load float, ptr [[PTR0]], align 4
35
- ; CHECK-NEXT: [[LD1:%.*]] = load float, ptr [[PTR1]], align 4
36
30
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4
37
- ; CHECK-NEXT: [[FPEXT0:%.*]] = fpext float [[LD0]] to double
38
- ; CHECK-NEXT: [[FPEXT1:%.*]] = fpext float [[LD1]] to double
39
31
; CHECK-NEXT: [[VCAST:%.*]] = fpext <2 x float> [[VECL]] to <2 x double>
40
- ; CHECK-NEXT: store double [[FPEXT0]], ptr [[PTRD0]], align 8
41
- ; CHECK-NEXT: store double [[FPEXT1]], ptr [[PTRD1]], align 8
42
32
; CHECK-NEXT: store <2 x double> [[VCAST]], ptr [[PTRD0]], align 8
43
33
; CHECK-NEXT: ret void
44
34
;
@@ -62,20 +52,10 @@ define void @store_fcmp_zext_load(ptr %ptr) {
62
52
; CHECK-NEXT: [[PTR1:%.*]] = getelementptr float, ptr [[PTR]], i32 1
63
53
; CHECK-NEXT: [[PTRB0:%.*]] = getelementptr i32, ptr [[PTR]], i32 0
64
54
; CHECK-NEXT: [[PTRB1:%.*]] = getelementptr i32, ptr [[PTR]], i32 1
65
- ; CHECK-NEXT: [[LDB0:%.*]] = load float, ptr [[PTR0]], align 4
66
- ; CHECK-NEXT: [[LDB1:%.*]] = load float, ptr [[PTR1]], align 4
67
55
; CHECK-NEXT: [[VECL1:%.*]] = load <2 x float>, ptr [[PTR0]], align 4
68
- ; CHECK-NEXT: [[LDA0:%.*]] = load float, ptr [[PTR0]], align 4
69
- ; CHECK-NEXT: [[LDA1:%.*]] = load float, ptr [[PTR1]], align 4
70
56
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4
71
- ; CHECK-NEXT: [[FCMP0:%.*]] = fcmp ogt float [[LDA0]], [[LDB0]]
72
- ; CHECK-NEXT: [[FCMP1:%.*]] = fcmp ogt float [[LDA1]], [[LDB1]]
73
57
; CHECK-NEXT: [[VCMP:%.*]] = fcmp ogt <2 x float> [[VECL]], [[VECL1]]
74
- ; CHECK-NEXT: [[ZEXT0:%.*]] = zext i1 [[FCMP0]] to i32
75
- ; CHECK-NEXT: [[ZEXT1:%.*]] = zext i1 [[FCMP1]] to i32
76
58
; CHECK-NEXT: [[VCAST:%.*]] = zext <2 x i1> [[VCMP]] to <2 x i32>
77
- ; CHECK-NEXT: store i32 [[ZEXT0]], ptr [[PTRB0]], align 4
78
- ; CHECK-NEXT: store i32 [[ZEXT1]], ptr [[PTRB1]], align 4
79
59
; CHECK-NEXT: store <2 x i32> [[VCAST]], ptr [[PTRB0]], align 4
80
60
; CHECK-NEXT: ret void
81
61
;
@@ -101,17 +81,9 @@ define void @store_fadd_load(ptr %ptr) {
101
81
; CHECK-SAME: ptr [[PTR:%.*]]) {
102
82
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
103
83
; CHECK-NEXT: [[PTR1:%.*]] = getelementptr float, ptr [[PTR]], i32 1
104
- ; CHECK-NEXT: [[LDA0:%.*]] = load float, ptr [[PTR0]], align 4
105
- ; CHECK-NEXT: [[LDA1:%.*]] = load float, ptr [[PTR1]], align 4
106
84
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4
107
- ; CHECK-NEXT: [[LDB0:%.*]] = load float, ptr [[PTR0]], align 4
108
- ; CHECK-NEXT: [[LDB1:%.*]] = load float, ptr [[PTR1]], align 4
109
85
; CHECK-NEXT: [[VECL1:%.*]] = load <2 x float>, ptr [[PTR0]], align 4
110
- ; CHECK-NEXT: [[FADD0:%.*]] = fadd float [[LDA0]], [[LDB0]]
111
- ; CHECK-NEXT: [[FADD1:%.*]] = fadd float [[LDA1]], [[LDB1]]
112
86
; CHECK-NEXT: [[VEC:%.*]] = fadd <2 x float> [[VECL]], [[VECL1]]
113
- ; CHECK-NEXT: store float [[FADD0]], ptr [[PTR0]], align 4
114
- ; CHECK-NEXT: store float [[FADD1]], ptr [[PTR1]], align 4
115
87
; CHECK-NEXT: store <2 x float> [[VEC]], ptr [[PTR0]], align 4
116
88
; CHECK-NEXT: ret void
117
89
;
@@ -133,14 +105,8 @@ define void @store_fneg_load(ptr %ptr) {
133
105
; CHECK-SAME: ptr [[PTR:%.*]]) {
134
106
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
135
107
; CHECK-NEXT: [[PTR1:%.*]] = getelementptr float, ptr [[PTR]], i32 1
136
- ; CHECK-NEXT: [[LD0:%.*]] = load float, ptr [[PTR0]], align 4
137
- ; CHECK-NEXT: [[LD1:%.*]] = load float, ptr [[PTR1]], align 4
138
108
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4
139
- ; CHECK-NEXT: [[FNEG0:%.*]] = fneg float [[LD0]]
140
- ; CHECK-NEXT: [[FNEG1:%.*]] = fneg float [[LD1]]
141
109
; CHECK-NEXT: [[VEC:%.*]] = fneg <2 x float> [[VECL]]
142
- ; CHECK-NEXT: store float [[FNEG0]], ptr [[PTR0]], align 4
143
- ; CHECK-NEXT: store float [[FNEG1]], ptr [[PTR1]], align 4
144
110
; CHECK-NEXT: store <2 x float> [[VEC]], ptr [[PTR0]], align 4
145
111
; CHECK-NEXT: ret void
146
112
;
@@ -155,3 +121,25 @@ define void @store_fneg_load(ptr %ptr) {
155
121
ret void
156
122
}
157
123
124
+ define float @scalars_with_external_uses_not_dead (ptr %ptr ) {
125
+ ; CHECK-LABEL: define float @scalars_with_external_uses_not_dead(
126
+ ; CHECK-SAME: ptr [[PTR:%.*]]) {
127
+ ; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
128
+ ; CHECK-NEXT: [[PTR1:%.*]] = getelementptr float, ptr [[PTR]], i32 1
129
+ ; CHECK-NEXT: [[LD0:%.*]] = load float, ptr [[PTR0]], align 4
130
+ ; CHECK-NEXT: [[LD1:%.*]] = load float, ptr [[PTR1]], align 4
131
+ ; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4
132
+ ; CHECK-NEXT: store <2 x float> [[VECL]], ptr [[PTR0]], align 4
133
+ ; CHECK-NEXT: [[USER:%.*]] = fneg float [[LD1]]
134
+ ; CHECK-NEXT: ret float [[LD0]]
135
+ ;
136
+ %ptr0 = getelementptr float , ptr %ptr , i32 0
137
+ %ptr1 = getelementptr float , ptr %ptr , i32 1
138
+ %ld0 = load float , ptr %ptr0
139
+ %ld1 = load float , ptr %ptr1
140
+ store float %ld0 , ptr %ptr0
141
+ store float %ld1 , ptr %ptr1
142
+ %user = fneg float %ld1
143
+ ret float %ld0
144
+ }
145
+
0 commit comments