1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -passes=argpromotion < %s | FileCheck %s
3
4; Make sure volatile and atomic loads are not promoted.
5
6define internal i32 @callee_volatile(i32* %p) {
7; CHECK-LABEL: @callee_volatile(
8; CHECK-NEXT:    [[V:%.*]] = load volatile i32, i32* [[P:%.*]], align 4
9; CHECK-NEXT:    ret i32 [[V]]
10;
11  %v = load volatile i32, i32* %p
12  ret i32 %v
13}
14
15define void @caller_volatile(i32* %p) {
16; CHECK-LABEL: @caller_volatile(
17; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @callee_volatile(i32* [[P:%.*]])
18; CHECK-NEXT:    ret void
19;
20  call i32 @callee_volatile(i32* %p)
21  ret void
22}
23
24define internal i32 @callee_atomic(i32* %p) {
25; CHECK-LABEL: @callee_atomic(
26; CHECK-NEXT:    [[V:%.*]] = load atomic i32, i32* [[P:%.*]] seq_cst, align 4
27; CHECK-NEXT:    ret i32 [[V]]
28;
29  %v = load atomic i32, i32* %p seq_cst, align 4
30  ret i32 %v
31}
32
33define void @caller_atomic(i32* %p) {
34; CHECK-LABEL: @caller_atomic(
35; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @callee_atomic(i32* [[P:%.*]])
36; CHECK-NEXT:    ret void
37;
38  call i32 @callee_atomic(i32* %p)
39  ret void
40}
41