[VE] Support atomic exchange instructions
Support atomic exchange and atomic compare and exchange instructions.
Change CAS and TS1AM instructions for ISel patterns. Add selectADDRzi
pattern for them. Add TS1AM pseudo instruction also for better ISel.
Add shouldExpandAtomicRMWInIR() function to expand all atomicrmw
instructions except atomicrmw xchg. Add custom lower for i8/i16
atomicrmw xchg. Modify replaceFI to support CAS/TS1AM instructions
which use "reg+disp" operands instead of "reg+imm+disp" operands.
And, add several regression tests to check the correctness.
Reviewed By: simoll
Differential Revision: https://reviews.llvm.org/D93161
diff --git a/llvm/test/CodeGen/VE/Scalar/atomic_load.ll b/llvm/test/CodeGen/VE/Scalar/atomic_load.ll
index af9f64d..a9d3472 100644
--- a/llvm/test/CodeGen/VE/Scalar/atomic_load.ll
+++ b/llvm/test/CodeGen/VE/Scalar/atomic_load.ll
@@ -5,6 +5,7 @@
;;; Note:
;;; We test i1/i8/i16/i32/i64/i128/u8/u16/u32/u64/u128.
;;; We test relaxed, acquire, and seq_cst.
+;;; We test an object, a stack object, and a global variable.
%"struct.std::__1::atomic" = type { %"struct.std::__1::__atomic_base" }
%"struct.std::__1::__atomic_base" = type { %"struct.std::__1::__cxx_atomic_impl" }
@@ -61,7 +62,19 @@
%"struct.std::__1::__cxx_atomic_impl.48" = type { %"struct.std::__1::__cxx_atomic_base_impl.49" }
%"struct.std::__1::__cxx_atomic_base_impl.49" = type { i128 }
-; Function Attrs: nofree norecurse nounwind
+@gv_i1 = global %"struct.std::__1::atomic" zeroinitializer, align 4
+@gv_i8 = global %"struct.std::__1::atomic.0" zeroinitializer, align 4
+@gv_u8 = global %"struct.std::__1::atomic.5" zeroinitializer, align 4
+@gv_i16 = global %"struct.std::__1::atomic.10" zeroinitializer, align 4
+@gv_u16 = global %"struct.std::__1::atomic.15" zeroinitializer, align 4
+@gv_i32 = global %"struct.std::__1::atomic.20" zeroinitializer, align 4
+@gv_u32 = global %"struct.std::__1::atomic.25" zeroinitializer, align 4
+@gv_i64 = global %"struct.std::__1::atomic.30" zeroinitializer, align 8
+@gv_u64 = global %"struct.std::__1::atomic.35" zeroinitializer, align 8
+@gv_i128 = global %"struct.std::__1::atomic.40" zeroinitializer, align 16
+@gv_u128 = global %"struct.std::__1::atomic.45" zeroinitializer, align 16
+
+; Function Attrs: nofree norecurse nounwind mustprogress
define zeroext i1 @_Z22atomic_load_relaxed_i1RNSt3__16atomicIbEE(%"struct.std::__1::atomic"* nocapture nonnull readonly align 1 dereferenceable(1) %0) {
; CHECK-LABEL: _Z22atomic_load_relaxed_i1RNSt3__16atomicIbEE:
; CHECK: # %bb.0:
@@ -75,7 +88,7 @@
ret i1 %5
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define signext i8 @_Z22atomic_load_relaxed_i8RNSt3__16atomicIcEE(%"struct.std::__1::atomic.0"* nocapture nonnull readonly align 1 dereferenceable(1) %0) {
; CHECK-LABEL: _Z22atomic_load_relaxed_i8RNSt3__16atomicIcEE:
; CHECK: # %bb.0:
@@ -86,7 +99,7 @@
ret i8 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define zeroext i8 @_Z22atomic_load_relaxed_u8RNSt3__16atomicIhEE(%"struct.std::__1::atomic.5"* nocapture nonnull readonly align 1 dereferenceable(1) %0) {
; CHECK-LABEL: _Z22atomic_load_relaxed_u8RNSt3__16atomicIhEE:
; CHECK: # %bb.0:
@@ -97,7 +110,7 @@
ret i8 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define signext i16 @_Z23atomic_load_relaxed_i16RNSt3__16atomicIsEE(%"struct.std::__1::atomic.10"* nocapture nonnull readonly align 2 dereferenceable(2) %0) {
; CHECK-LABEL: _Z23atomic_load_relaxed_i16RNSt3__16atomicIsEE:
; CHECK: # %bb.0:
@@ -108,7 +121,7 @@
ret i16 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define zeroext i16 @_Z23atomic_load_relaxed_u16RNSt3__16atomicItEE(%"struct.std::__1::atomic.15"* nocapture nonnull readonly align 2 dereferenceable(2) %0) {
; CHECK-LABEL: _Z23atomic_load_relaxed_u16RNSt3__16atomicItEE:
; CHECK: # %bb.0:
@@ -119,7 +132,7 @@
ret i16 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define signext i32 @_Z23atomic_load_relaxed_i32RNSt3__16atomicIiEE(%"struct.std::__1::atomic.20"* nocapture nonnull readonly align 4 dereferenceable(4) %0) {
; CHECK-LABEL: _Z23atomic_load_relaxed_i32RNSt3__16atomicIiEE:
; CHECK: # %bb.0:
@@ -130,7 +143,7 @@
ret i32 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define zeroext i32 @_Z23atomic_load_relaxed_u32RNSt3__16atomicIjEE(%"struct.std::__1::atomic.25"* nocapture nonnull readonly align 4 dereferenceable(4) %0) {
; CHECK-LABEL: _Z23atomic_load_relaxed_u32RNSt3__16atomicIjEE:
; CHECK: # %bb.0:
@@ -141,7 +154,7 @@
ret i32 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define i64 @_Z23atomic_load_relaxed_i64RNSt3__16atomicIlEE(%"struct.std::__1::atomic.30"* nocapture nonnull readonly align 8 dereferenceable(8) %0) {
; CHECK-LABEL: _Z23atomic_load_relaxed_i64RNSt3__16atomicIlEE:
; CHECK: # %bb.0:
@@ -152,7 +165,7 @@
ret i64 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define i64 @_Z23atomic_load_relaxed_u64RNSt3__16atomicImEE(%"struct.std::__1::atomic.35"* nocapture nonnull readonly align 8 dereferenceable(8) %0) {
; CHECK-LABEL: _Z23atomic_load_relaxed_u64RNSt3__16atomicImEE:
; CHECK: # %bb.0:
@@ -163,7 +176,7 @@
ret i64 %3
}
-; Function Attrs: nounwind
+; Function Attrs: nofree nounwind mustprogress
define i128 @_Z24atomic_load_relaxed_i128RNSt3__16atomicInEE(%"struct.std::__1::atomic.40"* nonnull align 16 dereferenceable(16) %0) {
; CHECK-LABEL: _Z24atomic_load_relaxed_i128RNSt3__16atomicInEE:
; CHECK: .LBB{{[0-9]+}}_2:
@@ -188,7 +201,7 @@
ret i128 %5
}
-; Function Attrs: nounwind
+; Function Attrs: nofree nounwind mustprogress
define i128 @_Z24atomic_load_relaxed_u128RNSt3__16atomicIoEE(%"struct.std::__1::atomic.45"* nonnull align 16 dereferenceable(16) %0) {
; CHECK-LABEL: _Z24atomic_load_relaxed_u128RNSt3__16atomicIoEE:
; CHECK: .LBB{{[0-9]+}}_2:
@@ -213,7 +226,7 @@
ret i128 %5
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define zeroext i1 @_Z22atomic_load_acquire_i1RNSt3__16atomicIbEE(%"struct.std::__1::atomic"* nocapture nonnull readonly align 1 dereferenceable(1) %0) {
; CHECK-LABEL: _Z22atomic_load_acquire_i1RNSt3__16atomicIbEE:
; CHECK: # %bb.0:
@@ -228,7 +241,7 @@
ret i1 %5
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define signext i8 @_Z22atomic_load_acquire_i8RNSt3__16atomicIcEE(%"struct.std::__1::atomic.0"* nocapture nonnull readonly align 1 dereferenceable(1) %0) {
; CHECK-LABEL: _Z22atomic_load_acquire_i8RNSt3__16atomicIcEE:
; CHECK: # %bb.0:
@@ -240,7 +253,7 @@
ret i8 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define zeroext i8 @_Z22atomic_load_acquire_u8RNSt3__16atomicIhEE(%"struct.std::__1::atomic.5"* nocapture nonnull readonly align 1 dereferenceable(1) %0) {
; CHECK-LABEL: _Z22atomic_load_acquire_u8RNSt3__16atomicIhEE:
; CHECK: # %bb.0:
@@ -252,7 +265,7 @@
ret i8 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define signext i16 @_Z23atomic_load_acquire_i16RNSt3__16atomicIsEE(%"struct.std::__1::atomic.10"* nocapture nonnull readonly align 2 dereferenceable(2) %0) {
; CHECK-LABEL: _Z23atomic_load_acquire_i16RNSt3__16atomicIsEE:
; CHECK: # %bb.0:
@@ -264,7 +277,7 @@
ret i16 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define zeroext i16 @_Z23atomic_load_acquire_u16RNSt3__16atomicItEE(%"struct.std::__1::atomic.15"* nocapture nonnull readonly align 2 dereferenceable(2) %0) {
; CHECK-LABEL: _Z23atomic_load_acquire_u16RNSt3__16atomicItEE:
; CHECK: # %bb.0:
@@ -276,7 +289,7 @@
ret i16 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define signext i32 @_Z23atomic_load_acquire_i32RNSt3__16atomicIiEE(%"struct.std::__1::atomic.20"* nocapture nonnull readonly align 4 dereferenceable(4) %0) {
; CHECK-LABEL: _Z23atomic_load_acquire_i32RNSt3__16atomicIiEE:
; CHECK: # %bb.0:
@@ -288,7 +301,7 @@
ret i32 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define zeroext i32 @_Z23atomic_load_acquire_u32RNSt3__16atomicIjEE(%"struct.std::__1::atomic.25"* nocapture nonnull readonly align 4 dereferenceable(4) %0) {
; CHECK-LABEL: _Z23atomic_load_acquire_u32RNSt3__16atomicIjEE:
; CHECK: # %bb.0:
@@ -300,7 +313,7 @@
ret i32 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define i64 @_Z23atomic_load_acquire_i64RNSt3__16atomicIlEE(%"struct.std::__1::atomic.30"* nocapture nonnull readonly align 8 dereferenceable(8) %0) {
; CHECK-LABEL: _Z23atomic_load_acquire_i64RNSt3__16atomicIlEE:
; CHECK: # %bb.0:
@@ -312,7 +325,7 @@
ret i64 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define i64 @_Z23atomic_load_acquire_u64RNSt3__16atomicImEE(%"struct.std::__1::atomic.35"* nocapture nonnull readonly align 8 dereferenceable(8) %0) {
; CHECK-LABEL: _Z23atomic_load_acquire_u64RNSt3__16atomicImEE:
; CHECK: # %bb.0:
@@ -324,7 +337,7 @@
ret i64 %3
}
-; Function Attrs: nounwind
+; Function Attrs: nofree nounwind mustprogress
define i128 @_Z24atomic_load_acquire_i128RNSt3__16atomicInEE(%"struct.std::__1::atomic.40"* nonnull align 16 dereferenceable(16) %0) {
; CHECK-LABEL: _Z24atomic_load_acquire_i128RNSt3__16atomicInEE:
; CHECK: .LBB{{[0-9]+}}_2:
@@ -349,7 +362,7 @@
ret i128 %5
}
-; Function Attrs: nounwind
+; Function Attrs: nofree nounwind mustprogress
define i128 @_Z24atomic_load_acquire_u128RNSt3__16atomicIoEE(%"struct.std::__1::atomic.45"* nonnull align 16 dereferenceable(16) %0) {
; CHECK-LABEL: _Z24atomic_load_acquire_u128RNSt3__16atomicIoEE:
; CHECK: .LBB{{[0-9]+}}_2:
@@ -374,7 +387,7 @@
ret i128 %5
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define zeroext i1 @_Z22atomic_load_seq_cst_i1RNSt3__16atomicIbEE(%"struct.std::__1::atomic"* nocapture nonnull readonly align 1 dereferenceable(1) %0) {
; CHECK-LABEL: _Z22atomic_load_seq_cst_i1RNSt3__16atomicIbEE:
; CHECK: # %bb.0:
@@ -389,7 +402,7 @@
ret i1 %5
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define signext i8 @_Z22atomic_load_seq_cst_i8RNSt3__16atomicIcEE(%"struct.std::__1::atomic.0"* nocapture nonnull readonly align 1 dereferenceable(1) %0) {
; CHECK-LABEL: _Z22atomic_load_seq_cst_i8RNSt3__16atomicIcEE:
; CHECK: # %bb.0:
@@ -401,7 +414,7 @@
ret i8 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define zeroext i8 @_Z22atomic_load_seq_cst_u8RNSt3__16atomicIhEE(%"struct.std::__1::atomic.5"* nocapture nonnull readonly align 1 dereferenceable(1) %0) {
; CHECK-LABEL: _Z22atomic_load_seq_cst_u8RNSt3__16atomicIhEE:
; CHECK: # %bb.0:
@@ -413,7 +426,7 @@
ret i8 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define signext i16 @_Z23atomic_load_seq_cst_i16RNSt3__16atomicIsEE(%"struct.std::__1::atomic.10"* nocapture nonnull readonly align 2 dereferenceable(2) %0) {
; CHECK-LABEL: _Z23atomic_load_seq_cst_i16RNSt3__16atomicIsEE:
; CHECK: # %bb.0:
@@ -425,7 +438,7 @@
ret i16 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define zeroext i16 @_Z23atomic_load_seq_cst_u16RNSt3__16atomicItEE(%"struct.std::__1::atomic.15"* nocapture nonnull readonly align 2 dereferenceable(2) %0) {
; CHECK-LABEL: _Z23atomic_load_seq_cst_u16RNSt3__16atomicItEE:
; CHECK: # %bb.0:
@@ -437,7 +450,7 @@
ret i16 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define signext i32 @_Z23atomic_load_seq_cst_i32RNSt3__16atomicIiEE(%"struct.std::__1::atomic.20"* nocapture nonnull readonly align 4 dereferenceable(4) %0) {
; CHECK-LABEL: _Z23atomic_load_seq_cst_i32RNSt3__16atomicIiEE:
; CHECK: # %bb.0:
@@ -449,7 +462,7 @@
ret i32 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define zeroext i32 @_Z23atomic_load_seq_cst_u32RNSt3__16atomicIjEE(%"struct.std::__1::atomic.25"* nocapture nonnull readonly align 4 dereferenceable(4) %0) {
; CHECK-LABEL: _Z23atomic_load_seq_cst_u32RNSt3__16atomicIjEE:
; CHECK: # %bb.0:
@@ -461,7 +474,7 @@
ret i32 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define i64 @_Z23atomic_load_seq_cst_i64RNSt3__16atomicIlEE(%"struct.std::__1::atomic.30"* nocapture nonnull readonly align 8 dereferenceable(8) %0) {
; CHECK-LABEL: _Z23atomic_load_seq_cst_i64RNSt3__16atomicIlEE:
; CHECK: # %bb.0:
@@ -473,7 +486,7 @@
ret i64 %3
}
-; Function Attrs: nofree norecurse nounwind
+; Function Attrs: nofree norecurse nounwind mustprogress
define i64 @_Z23atomic_load_seq_cst_u64RNSt3__16atomicImEE(%"struct.std::__1::atomic.35"* nocapture nonnull readonly align 8 dereferenceable(8) %0) {
; CHECK-LABEL: _Z23atomic_load_seq_cst_u64RNSt3__16atomicImEE:
; CHECK: # %bb.0:
@@ -485,7 +498,7 @@
ret i64 %3
}
-; Function Attrs: nounwind
+; Function Attrs: nofree nounwind mustprogress
define i128 @_Z24atomic_load_seq_cst_i128RNSt3__16atomicInEE(%"struct.std::__1::atomic.40"* nonnull align 16 dereferenceable(16) %0) {
; CHECK-LABEL: _Z24atomic_load_seq_cst_i128RNSt3__16atomicInEE:
; CHECK: .LBB{{[0-9]+}}_2:
@@ -510,7 +523,7 @@
ret i128 %5
}
-; Function Attrs: nounwind
+; Function Attrs: nofree nounwind mustprogress
define i128 @_Z24atomic_load_seq_cst_u128RNSt3__16atomicIoEE(%"struct.std::__1::atomic.45"* nonnull align 16 dereferenceable(16) %0) {
; CHECK-LABEL: _Z24atomic_load_seq_cst_u128RNSt3__16atomicIoEE:
; CHECK: .LBB{{[0-9]+}}_2:
@@ -535,15 +548,466 @@
ret i128 %5
}
-; Function Attrs: nofree nounwind willreturn
-declare void @__atomic_load(i64, i8*, i8*, i32)
+; Function Attrs: mustprogress
+define zeroext i1 @_Z26atomic_load_relaxed_stk_i1v() {
+; CHECK-LABEL: _Z26atomic_load_relaxed_stk_i1v:
+; CHECK: .LBB{{[0-9]+}}_2:
+; CHECK-NEXT: lea %s0, _Z6fun_i1RNSt3__16atomicIbEE@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s12, _Z6fun_i1RNSt3__16atomicIbEE@hi(, %s0)
+; CHECK-NEXT: lea %s0, 248(, %s11)
+; CHECK-NEXT: bsic %s10, (, %s12)
+; CHECK-NEXT: ld1b.zx %s0, 248(, %s11)
+; CHECK-NEXT: and %s0, 1, %s0
+; CHECK-NEXT: or %s11, 0, %s9
+ %1 = alloca %"struct.std::__1::atomic", align 1
+ %2 = getelementptr inbounds %"struct.std::__1::atomic", %"struct.std::__1::atomic"* %1, i64 0, i32 0, i32 0, i32 0, i32 0
+ call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull %2)
+ call void @_Z6fun_i1RNSt3__16atomicIbEE(%"struct.std::__1::atomic"* nonnull align 1 dereferenceable(1) %1)
+ %3 = load atomic i8, i8* %2 monotonic, align 1
+ %4 = and i8 %3, 1
+ %5 = icmp ne i8 %4, 0
+ call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull %2)
+ ret i1 %5
+}
-; Function Attrs: argmemonly nounwind willreturn
+; Function Attrs: argmemonly nofree nosync nounwind willreturn
declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture)
-; Function Attrs: argmemonly nounwind willreturn
+declare void @_Z6fun_i1RNSt3__16atomicIbEE(%"struct.std::__1::atomic"* nonnull align 1 dereferenceable(1))
+
+; Function Attrs: argmemonly nofree nosync nounwind willreturn
declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture)
+; Function Attrs: mustprogress
+define signext i8 @_Z26atomic_load_relaxed_stk_i8v() {
+; CHECK-LABEL: _Z26atomic_load_relaxed_stk_i8v:
+; CHECK: .LBB{{[0-9]+}}_2:
+; CHECK-NEXT: lea %s0, _Z6fun_i8RNSt3__16atomicIcEE@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s12, _Z6fun_i8RNSt3__16atomicIcEE@hi(, %s0)
+; CHECK-NEXT: lea %s0, 248(, %s11)
+; CHECK-NEXT: bsic %s10, (, %s12)
+; CHECK-NEXT: ld1b.sx %s0, 248(, %s11)
+; CHECK-NEXT: or %s11, 0, %s9
+ %1 = alloca %"struct.std::__1::atomic.0", align 1
+ %2 = getelementptr inbounds %"struct.std::__1::atomic.0", %"struct.std::__1::atomic.0"* %1, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0
+ call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull %2)
+ call void @_Z6fun_i8RNSt3__16atomicIcEE(%"struct.std::__1::atomic.0"* nonnull align 1 dereferenceable(1) %1)
+ %3 = load atomic i8, i8* %2 monotonic, align 1
+ call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull %2)
+ ret i8 %3
+}
+
+declare void @_Z6fun_i8RNSt3__16atomicIcEE(%"struct.std::__1::atomic.0"* nonnull align 1 dereferenceable(1))
+
+; Function Attrs: mustprogress
+define zeroext i8 @_Z26atomic_load_relaxed_stk_u8v() {
+; CHECK-LABEL: _Z26atomic_load_relaxed_stk_u8v:
+; CHECK: .LBB{{[0-9]+}}_2:
+; CHECK-NEXT: lea %s0, _Z6fun_u8RNSt3__16atomicIhEE@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s12, _Z6fun_u8RNSt3__16atomicIhEE@hi(, %s0)
+; CHECK-NEXT: lea %s0, 248(, %s11)
+; CHECK-NEXT: bsic %s10, (, %s12)
+; CHECK-NEXT: ld1b.zx %s0, 248(, %s11)
+; CHECK-NEXT: or %s11, 0, %s9
+ %1 = alloca %"struct.std::__1::atomic.5", align 1
+ %2 = getelementptr inbounds %"struct.std::__1::atomic.5", %"struct.std::__1::atomic.5"* %1, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0
+ call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull %2)
+ call void @_Z6fun_u8RNSt3__16atomicIhEE(%"struct.std::__1::atomic.5"* nonnull align 1 dereferenceable(1) %1)
+ %3 = load atomic i8, i8* %2 monotonic, align 1
+ call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull %2)
+ ret i8 %3
+}
+
+declare void @_Z6fun_u8RNSt3__16atomicIhEE(%"struct.std::__1::atomic.5"* nonnull align 1 dereferenceable(1))
+
+; Function Attrs: mustprogress
+define signext i16 @_Z27atomic_load_relaxed_stk_i16v() {
+; CHECK-LABEL: _Z27atomic_load_relaxed_stk_i16v:
+; CHECK: .LBB{{[0-9]+}}_2:
+; CHECK-NEXT: lea %s0, _Z7fun_i16RNSt3__16atomicIsEE@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s12, _Z7fun_i16RNSt3__16atomicIsEE@hi(, %s0)
+; CHECK-NEXT: lea %s0, 248(, %s11)
+; CHECK-NEXT: bsic %s10, (, %s12)
+; CHECK-NEXT: ld2b.sx %s0, 248(, %s11)
+; CHECK-NEXT: or %s11, 0, %s9
+ %1 = alloca %"struct.std::__1::atomic.10", align 2
+ %2 = bitcast %"struct.std::__1::atomic.10"* %1 to i8*
+ call void @llvm.lifetime.start.p0i8(i64 2, i8* nonnull %2)
+ call void @_Z7fun_i16RNSt3__16atomicIsEE(%"struct.std::__1::atomic.10"* nonnull align 2 dereferenceable(2) %1)
+ %3 = getelementptr inbounds %"struct.std::__1::atomic.10", %"struct.std::__1::atomic.10"* %1, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0
+ %4 = load atomic i16, i16* %3 monotonic, align 2
+ call void @llvm.lifetime.end.p0i8(i64 2, i8* nonnull %2)
+ ret i16 %4
+}
+
+declare void @_Z7fun_i16RNSt3__16atomicIsEE(%"struct.std::__1::atomic.10"* nonnull align 2 dereferenceable(2))
+
+; Function Attrs: mustprogress
+define zeroext i16 @_Z27atomic_load_relaxed_stk_u16v() {
+; CHECK-LABEL: _Z27atomic_load_relaxed_stk_u16v:
+; CHECK: .LBB{{[0-9]+}}_2:
+; CHECK-NEXT: lea %s0, _Z7fun_u16RNSt3__16atomicItEE@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s12, _Z7fun_u16RNSt3__16atomicItEE@hi(, %s0)
+; CHECK-NEXT: lea %s0, 248(, %s11)
+; CHECK-NEXT: bsic %s10, (, %s12)
+; CHECK-NEXT: ld2b.zx %s0, 248(, %s11)
+; CHECK-NEXT: or %s11, 0, %s9
+ %1 = alloca %"struct.std::__1::atomic.15", align 2
+ %2 = bitcast %"struct.std::__1::atomic.15"* %1 to i8*
+ call void @llvm.lifetime.start.p0i8(i64 2, i8* nonnull %2)
+ call void @_Z7fun_u16RNSt3__16atomicItEE(%"struct.std::__1::atomic.15"* nonnull align 2 dereferenceable(2) %1)
+ %3 = getelementptr inbounds %"struct.std::__1::atomic.15", %"struct.std::__1::atomic.15"* %1, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0
+ %4 = load atomic i16, i16* %3 monotonic, align 2
+ call void @llvm.lifetime.end.p0i8(i64 2, i8* nonnull %2)
+ ret i16 %4
+}
+
+declare void @_Z7fun_u16RNSt3__16atomicItEE(%"struct.std::__1::atomic.15"* nonnull align 2 dereferenceable(2))
+
+; Function Attrs: mustprogress
+define signext i32 @_Z27atomic_load_relaxed_stk_i32v() {
+; CHECK-LABEL: _Z27atomic_load_relaxed_stk_i32v:
+; CHECK: .LBB{{[0-9]+}}_2:
+; CHECK-NEXT: lea %s0, _Z7fun_i32RNSt3__16atomicIiEE@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s12, _Z7fun_i32RNSt3__16atomicIiEE@hi(, %s0)
+; CHECK-NEXT: lea %s0, 248(, %s11)
+; CHECK-NEXT: bsic %s10, (, %s12)
+; CHECK-NEXT: ldl.sx %s0, 248(, %s11)
+; CHECK-NEXT: or %s11, 0, %s9
+ %1 = alloca %"struct.std::__1::atomic.20", align 4
+ %2 = bitcast %"struct.std::__1::atomic.20"* %1 to i8*
+ call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %2)
+ call void @_Z7fun_i32RNSt3__16atomicIiEE(%"struct.std::__1::atomic.20"* nonnull align 4 dereferenceable(4) %1)
+ %3 = getelementptr inbounds %"struct.std::__1::atomic.20", %"struct.std::__1::atomic.20"* %1, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0
+ %4 = load atomic i32, i32* %3 monotonic, align 4
+ call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %2)
+ ret i32 %4
+}
+
+declare void @_Z7fun_i32RNSt3__16atomicIiEE(%"struct.std::__1::atomic.20"* nonnull align 4 dereferenceable(4))
+
+; Function Attrs: mustprogress
+define zeroext i32 @_Z27atomic_load_relaxed_stk_u32v() {
+; CHECK-LABEL: _Z27atomic_load_relaxed_stk_u32v:
+; CHECK: .LBB{{[0-9]+}}_2:
+; CHECK-NEXT: lea %s0, _Z7fun_u32RNSt3__16atomicIjEE@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s12, _Z7fun_u32RNSt3__16atomicIjEE@hi(, %s0)
+; CHECK-NEXT: lea %s0, 248(, %s11)
+; CHECK-NEXT: bsic %s10, (, %s12)
+; CHECK-NEXT: ldl.zx %s0, 248(, %s11)
+; CHECK-NEXT: or %s11, 0, %s9
+ %1 = alloca %"struct.std::__1::atomic.25", align 4
+ %2 = bitcast %"struct.std::__1::atomic.25"* %1 to i8*
+ call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %2)
+ call void @_Z7fun_u32RNSt3__16atomicIjEE(%"struct.std::__1::atomic.25"* nonnull align 4 dereferenceable(4) %1)
+ %3 = getelementptr inbounds %"struct.std::__1::atomic.25", %"struct.std::__1::atomic.25"* %1, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0
+ %4 = load atomic i32, i32* %3 monotonic, align 4
+ call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %2)
+ ret i32 %4
+}
+
+declare void @_Z7fun_u32RNSt3__16atomicIjEE(%"struct.std::__1::atomic.25"* nonnull align 4 dereferenceable(4))
+
+; Function Attrs: mustprogress
+define i64 @_Z27atomic_load_relaxed_stk_i64v() {
+; CHECK-LABEL: _Z27atomic_load_relaxed_stk_i64v:
+; CHECK: .LBB{{[0-9]+}}_2:
+; CHECK-NEXT: lea %s0, _Z7fun_i64RNSt3__16atomicIlEE@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s12, _Z7fun_i64RNSt3__16atomicIlEE@hi(, %s0)
+; CHECK-NEXT: lea %s0, 248(, %s11)
+; CHECK-NEXT: bsic %s10, (, %s12)
+; CHECK-NEXT: ld %s0, 248(, %s11)
+; CHECK-NEXT: or %s11, 0, %s9
+ %1 = alloca %"struct.std::__1::atomic.30", align 8
+ %2 = bitcast %"struct.std::__1::atomic.30"* %1 to i8*
+ call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %2)
+ call void @_Z7fun_i64RNSt3__16atomicIlEE(%"struct.std::__1::atomic.30"* nonnull align 8 dereferenceable(8) %1)
+ %3 = getelementptr inbounds %"struct.std::__1::atomic.30", %"struct.std::__1::atomic.30"* %1, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0
+ %4 = load atomic i64, i64* %3 monotonic, align 8
+ call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %2)
+ ret i64 %4
+}
+
+declare void @_Z7fun_i64RNSt3__16atomicIlEE(%"struct.std::__1::atomic.30"* nonnull align 8 dereferenceable(8))
+
+; Function Attrs: mustprogress
+define i64 @_Z27atomic_load_relaxed_stk_u64v() {
+; CHECK-LABEL: _Z27atomic_load_relaxed_stk_u64v:
+; CHECK: .LBB{{[0-9]+}}_2:
+; CHECK-NEXT: lea %s0, _Z7fun_u64RNSt3__16atomicImEE@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s12, _Z7fun_u64RNSt3__16atomicImEE@hi(, %s0)
+; CHECK-NEXT: lea %s0, 248(, %s11)
+; CHECK-NEXT: bsic %s10, (, %s12)
+; CHECK-NEXT: ld %s0, 248(, %s11)
+; CHECK-NEXT: or %s11, 0, %s9
+ %1 = alloca %"struct.std::__1::atomic.35", align 8
+ %2 = bitcast %"struct.std::__1::atomic.35"* %1 to i8*
+ call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %2)
+ call void @_Z7fun_u64RNSt3__16atomicImEE(%"struct.std::__1::atomic.35"* nonnull align 8 dereferenceable(8) %1)
+ %3 = getelementptr inbounds %"struct.std::__1::atomic.35", %"struct.std::__1::atomic.35"* %1, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0
+ %4 = load atomic i64, i64* %3 monotonic, align 8
+ call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %2)
+ ret i64 %4
+}
+
+declare void @_Z7fun_u64RNSt3__16atomicImEE(%"struct.std::__1::atomic.35"* nonnull align 8 dereferenceable(8))
+
+; Function Attrs: mustprogress
+define i128 @_Z28atomic_load_relaxed_stk_i128v() {
+; CHECK-LABEL: _Z28atomic_load_relaxed_stk_i128v:
+; CHECK: .LBB{{[0-9]+}}_2:
+; CHECK-NEXT: lea %s0, _Z8fun_i128RNSt3__16atomicInEE@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s12, _Z8fun_i128RNSt3__16atomicInEE@hi(, %s0)
+; CHECK-NEXT: lea %s0, 240(, %s11)
+; CHECK-NEXT: bsic %s10, (, %s12)
+; CHECK-NEXT: lea %s0, __atomic_load@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s12, __atomic_load@hi(, %s0)
+; CHECK-NEXT: lea %s1, 240(, %s11)
+; CHECK-NEXT: lea %s2, 256(, %s11)
+; CHECK-NEXT: or %s0, 16, (0)1
+; CHECK-NEXT: or %s3, 0, (0)1
+; CHECK-NEXT: bsic %s10, (, %s12)
+; CHECK-NEXT: ld %s1, 264(, %s11)
+; CHECK-NEXT: ld %s0, 256(, %s11)
+; CHECK-NEXT: or %s11, 0, %s9
+ %1 = alloca i128, align 16
+ %2 = alloca %"struct.std::__1::atomic.40", align 16
+ %3 = bitcast %"struct.std::__1::atomic.40"* %2 to i8*
+ call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %3)
+ call void @_Z8fun_i128RNSt3__16atomicInEE(%"struct.std::__1::atomic.40"* nonnull align 16 dereferenceable(16) %2)
+ %4 = bitcast i128* %1 to i8*
+ call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %4)
+ call void @__atomic_load(i64 16, i8* nonnull %3, i8* nonnull %4, i32 signext 0)
+ %5 = load i128, i128* %1, align 16, !tbaa !2
+ call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %4)
+ call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %3)
+ ret i128 %5
+}
+
+declare void @_Z8fun_i128RNSt3__16atomicInEE(%"struct.std::__1::atomic.40"* nonnull align 16 dereferenceable(16))
+
+; Function Attrs: mustprogress
+define i128 @_Z28atomic_load_relaxed_stk_u128v() {
+; CHECK-LABEL: _Z28atomic_load_relaxed_stk_u128v:
+; CHECK: .LBB{{[0-9]+}}_2:
+; CHECK-NEXT: lea %s0, _Z8fun_u128RNSt3__16atomicIoEE@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s12, _Z8fun_u128RNSt3__16atomicIoEE@hi(, %s0)
+; CHECK-NEXT: lea %s0, 240(, %s11)
+; CHECK-NEXT: bsic %s10, (, %s12)
+; CHECK-NEXT: lea %s0, __atomic_load@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s12, __atomic_load@hi(, %s0)
+; CHECK-NEXT: lea %s1, 240(, %s11)
+; CHECK-NEXT: lea %s2, 256(, %s11)
+; CHECK-NEXT: or %s0, 16, (0)1
+; CHECK-NEXT: or %s3, 0, (0)1
+; CHECK-NEXT: bsic %s10, (, %s12)
+; CHECK-NEXT: ld %s1, 264(, %s11)
+; CHECK-NEXT: ld %s0, 256(, %s11)
+; CHECK-NEXT: or %s11, 0, %s9
+ %1 = alloca i128, align 16
+ %2 = alloca %"struct.std::__1::atomic.45", align 16
+ %3 = bitcast %"struct.std::__1::atomic.45"* %2 to i8*
+ call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %3)
+ call void @_Z8fun_u128RNSt3__16atomicIoEE(%"struct.std::__1::atomic.45"* nonnull align 16 dereferenceable(16) %2)
+ %4 = bitcast i128* %1 to i8*
+ call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %4)
+ call void @__atomic_load(i64 16, i8* nonnull %3, i8* nonnull %4, i32 signext 0)
+ %5 = load i128, i128* %1, align 16, !tbaa !2
+ call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %4)
+ call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %3)
+ ret i128 %5
+}
+
+declare void @_Z8fun_u128RNSt3__16atomicIoEE(%"struct.std::__1::atomic.45"* nonnull align 16 dereferenceable(16))
+
+; Function Attrs: nofree norecurse nounwind mustprogress
+define zeroext i1 @_Z25atomic_load_relaxed_gv_i1v() {
+; CHECK-LABEL: _Z25atomic_load_relaxed_gv_i1v:
+; CHECK: # %bb.0:
+; CHECK-NEXT: lea %s0, gv_i1@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s0, gv_i1@hi(, %s0)
+; CHECK-NEXT: ld1b.zx %s0, (, %s0)
+; CHECK-NEXT: and %s0, 1, %s0
+; CHECK-NEXT: b.l.t (, %s10)
+ %1 = load atomic i8, i8* getelementptr inbounds (%"struct.std::__1::atomic", %"struct.std::__1::atomic"* @gv_i1, i64 0, i32 0, i32 0, i32 0, i32 0) monotonic, align 4
+ %2 = and i8 %1, 1
+ %3 = icmp ne i8 %2, 0
+ ret i1 %3
+}
+
+; Function Attrs: nofree norecurse nounwind mustprogress
+define signext i8 @_Z25atomic_load_relaxed_gv_i8v() {
+; CHECK-LABEL: _Z25atomic_load_relaxed_gv_i8v:
+; CHECK: # %bb.0:
+; CHECK-NEXT: lea %s0, gv_i8@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s0, gv_i8@hi(, %s0)
+; CHECK-NEXT: ld1b.sx %s0, (, %s0)
+; CHECK-NEXT: b.l.t (, %s10)
+ %1 = load atomic i8, i8* getelementptr inbounds (%"struct.std::__1::atomic.0", %"struct.std::__1::atomic.0"* @gv_i8, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0) monotonic, align 4
+ ret i8 %1
+}
+
+; Function Attrs: nofree norecurse nounwind mustprogress
+define zeroext i8 @_Z25atomic_load_relaxed_gv_u8v() {
+; CHECK-LABEL: _Z25atomic_load_relaxed_gv_u8v:
+; CHECK: # %bb.0:
+; CHECK-NEXT: lea %s0, gv_u8@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s0, gv_u8@hi(, %s0)
+; CHECK-NEXT: ld1b.zx %s0, (, %s0)
+; CHECK-NEXT: b.l.t (, %s10)
+ %1 = load atomic i8, i8* getelementptr inbounds (%"struct.std::__1::atomic.5", %"struct.std::__1::atomic.5"* @gv_u8, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0) monotonic, align 4
+ ret i8 %1
+}
+
+; Function Attrs: nofree norecurse nounwind mustprogress
+define signext i16 @_Z26atomic_load_relaxed_gv_i16v() {
+; CHECK-LABEL: _Z26atomic_load_relaxed_gv_i16v:
+; CHECK: # %bb.0:
+; CHECK-NEXT: lea %s0, gv_i16@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s0, gv_i16@hi(, %s0)
+; CHECK-NEXT: ld2b.sx %s0, (, %s0)
+; CHECK-NEXT: b.l.t (, %s10)
+ %1 = load atomic i16, i16* getelementptr inbounds (%"struct.std::__1::atomic.10", %"struct.std::__1::atomic.10"* @gv_i16, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0) monotonic, align 4
+ ret i16 %1
+}
+
+; Function Attrs: nofree norecurse nounwind mustprogress
+define zeroext i16 @_Z26atomic_load_relaxed_gv_u16v() {
+; CHECK-LABEL: _Z26atomic_load_relaxed_gv_u16v:
+; CHECK: # %bb.0:
+; CHECK-NEXT: lea %s0, gv_u16@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s0, gv_u16@hi(, %s0)
+; CHECK-NEXT: ld2b.zx %s0, (, %s0)
+; CHECK-NEXT: b.l.t (, %s10)
+ %1 = load atomic i16, i16* getelementptr inbounds (%"struct.std::__1::atomic.15", %"struct.std::__1::atomic.15"* @gv_u16, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0) monotonic, align 4
+ ret i16 %1
+}
+
+; Function Attrs: nofree norecurse nounwind mustprogress
+define signext i32 @_Z26atomic_load_relaxed_gv_i32v() {
+; CHECK-LABEL: _Z26atomic_load_relaxed_gv_i32v:
+; CHECK: # %bb.0:
+; CHECK-NEXT: lea %s0, gv_i32@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s0, gv_i32@hi(, %s0)
+; CHECK-NEXT: ldl.sx %s0, (, %s0)
+; CHECK-NEXT: b.l.t (, %s10)
+ %1 = load atomic i32, i32* getelementptr inbounds (%"struct.std::__1::atomic.20", %"struct.std::__1::atomic.20"* @gv_i32, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0) monotonic, align 4
+ ret i32 %1
+}
+
+; Function Attrs: nofree norecurse nounwind mustprogress
+define zeroext i32 @_Z26atomic_load_relaxed_gv_u32v() {
+; CHECK-LABEL: _Z26atomic_load_relaxed_gv_u32v:
+; CHECK: # %bb.0:
+; CHECK-NEXT: lea %s0, gv_u32@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s0, gv_u32@hi(, %s0)
+; CHECK-NEXT: ldl.zx %s0, (, %s0)
+; CHECK-NEXT: b.l.t (, %s10)
+ %1 = load atomic i32, i32* getelementptr inbounds (%"struct.std::__1::atomic.25", %"struct.std::__1::atomic.25"* @gv_u32, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0) monotonic, align 4
+ ret i32 %1
+}
+
+; Function Attrs: nofree norecurse nounwind mustprogress
+define i64 @_Z26atomic_load_relaxed_gv_i64v() {
+; CHECK-LABEL: _Z26atomic_load_relaxed_gv_i64v:
+; CHECK: # %bb.0:
+; CHECK-NEXT: lea %s0, gv_i64@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s0, gv_i64@hi(, %s0)
+; CHECK-NEXT: ld %s0, (, %s0)
+; CHECK-NEXT: b.l.t (, %s10)
+ %1 = load atomic i64, i64* getelementptr inbounds (%"struct.std::__1::atomic.30", %"struct.std::__1::atomic.30"* @gv_i64, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0) monotonic, align 8
+ ret i64 %1
+}
+
+; Function Attrs: nofree norecurse nounwind mustprogress
+define i64 @_Z26atomic_load_relaxed_gv_u64v() {
+; CHECK-LABEL: _Z26atomic_load_relaxed_gv_u64v:
+; CHECK: # %bb.0:
+; CHECK-NEXT: lea %s0, gv_u64@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s0, gv_u64@hi(, %s0)
+; CHECK-NEXT: ld %s0, (, %s0)
+; CHECK-NEXT: b.l.t (, %s10)
+ %1 = load atomic i64, i64* getelementptr inbounds (%"struct.std::__1::atomic.35", %"struct.std::__1::atomic.35"* @gv_u64, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0) monotonic, align 8
+ ret i64 %1
+}
+
+; Function Attrs: nofree nounwind mustprogress
+define i128 @_Z27atomic_load_relaxed_gv_i128v() {
+; CHECK-LABEL: _Z27atomic_load_relaxed_gv_i128v:
+; CHECK: .LBB{{[0-9]+}}_2:
+; CHECK-NEXT: lea %s0, __atomic_load@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s12, __atomic_load@hi(, %s0)
+; CHECK-NEXT: lea %s0, gv_i128@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s1, gv_i128@hi(, %s0)
+; CHECK-NEXT: lea %s2, 240(, %s11)
+; CHECK-NEXT: or %s0, 16, (0)1
+; CHECK-NEXT: or %s3, 0, (0)1
+; CHECK-NEXT: bsic %s10, (, %s12)
+; CHECK-NEXT: ld %s1, 248(, %s11)
+; CHECK-NEXT: ld %s0, 240(, %s11)
+; CHECK-NEXT: or %s11, 0, %s9
+ %1 = alloca i128, align 16
+ %2 = bitcast i128* %1 to i8*
+ call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %2)
+ call void @__atomic_load(i64 16, i8* nonnull bitcast (%"struct.std::__1::atomic.40"* @gv_i128 to i8*), i8* nonnull %2, i32 signext 0)
+ %3 = load i128, i128* %1, align 16, !tbaa !2
+ call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %2)
+ ret i128 %3
+}
+
+; Function Attrs: nofree nounwind mustprogress
+define i128 @_Z27atomic_load_relaxed_gv_u128v() {
+; CHECK-LABEL: _Z27atomic_load_relaxed_gv_u128v:
+; CHECK: .LBB{{[0-9]+}}_2:
+; CHECK-NEXT: lea %s0, __atomic_load@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s12, __atomic_load@hi(, %s0)
+; CHECK-NEXT: lea %s0, gv_u128@lo
+; CHECK-NEXT: and %s0, %s0, (32)0
+; CHECK-NEXT: lea.sl %s1, gv_u128@hi(, %s0)
+; CHECK-NEXT: lea %s2, 240(, %s11)
+; CHECK-NEXT: or %s0, 16, (0)1
+; CHECK-NEXT: or %s3, 0, (0)1
+; CHECK-NEXT: bsic %s10, (, %s12)
+; CHECK-NEXT: ld %s1, 248(, %s11)
+; CHECK-NEXT: ld %s0, 240(, %s11)
+; CHECK-NEXT: or %s11, 0, %s9
+ %1 = alloca i128, align 16
+ %2 = bitcast i128* %1 to i8*
+ call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %2)
+ call void @__atomic_load(i64 16, i8* nonnull bitcast (%"struct.std::__1::atomic.45"* @gv_u128 to i8*), i8* nonnull %2, i32 signext 0)
+ %3 = load i128, i128* %1, align 16, !tbaa !2
+ call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %2)
+ ret i128 %3
+}
+
+; Function Attrs: nofree nounwind willreturn
+declare void @__atomic_load(i64, i8*, i8*, i32)
+
!2 = !{!3, !3, i64 0}
!3 = !{!"__int128", !4, i64 0}
!4 = !{!"omnipotent char", !5, i64 0}