@@ -126,11 +126,41 @@ define void @cfcmov64mr(ptr %p, i64 %0) {
126126; CHECK-NEXT: cmpq (%rdi), %rsi
127127; CHECK-NEXT: cfcmovgq %rsi, (%rdi)
128128; CHECK-NEXT: retq
129- %2 = load i64 , ptr %p , align 2
129+ %2 = load i64 , ptr %p , align 8
130130 %3 = icmp sgt i64 %0 , %2
131131 %4 = select i1 %3 , i64 %0 , i64 %2
132- store i64 %4 , ptr %p , align 2
132+ store i64 %4 , ptr %p , align 8
133+ ret void
134+ }
135+
136+ define void @volatileload (ptr %p , i32 %0 ) {
137+ ; CHECK-LABEL: volatileload:
138+ ; CHECK: # %bb.0:
139+ ; CHECK-NEXT: movl (%rdi), %eax
140+ ; CHECK-NEXT: cmpl %eax, %esi
141+ ; CHECK-NEXT: cmovbl %esi, %eax
142+ ; CHECK-NEXT: movl %eax, (%rdi)
143+ ; CHECK-NEXT: retq
144+ %2 = load volatile i32 , ptr %p , align 4
145+ %3 = call i32 @llvm.umin.i32 (i32 %0 , i32 %2 )
146+ store i32 %3 , ptr %p , align 4
147+ ret void
148+ }
149+
150+ define void @atomicstore (ptr %p , i64 %0 ) {
151+ ; CHECK-LABEL: atomicstore:
152+ ; CHECK: # %bb.0:
153+ ; CHECK-NEXT: movq (%rdi), %rax
154+ ; CHECK-NEXT: cmpq %rax, %rsi
155+ ; CHECK-NEXT: cmovaq %rsi, %rax
156+ ; CHECK-NEXT: movq %rax, (%rdi)
157+ ; CHECK-NEXT: retq
158+ %2 = load i64 , ptr %p , align 8
159+ %3 = icmp ugt i64 %0 , %2
160+ %4 = select i1 %3 , i64 %0 , i64 %2
161+ store atomic i64 %4 , ptr %p unordered , align 8
133162 ret void
134163}
135164
136165declare i32 @llvm.smax.i32 (i32 , i32 )
166+ declare i32 @llvm.umin.i32 (i32 , i32 )
0 commit comments