brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.7 KiB · 332d7bd Raw
289 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 62// RUN: %clang_cc1 -triple s390x-linux-gnu -O1 -emit-llvm %s -o - | FileCheck %s3//4// Test GNU atomic builtins for __int128 (with default alignment of 8 bytes5// only), resulting in libcalls.6 7#include <stdatomic.h>8#include <stdint.h>9 10__int128 Ptr;11__int128 Ret;12__int128 Val;13__int128 Exp;14__int128 Des;15 16// TODO: This test and several more below have the unnecessary use of an alloca17// remaining. This is due to 369c9b7, which changes the behavior of the MemCpyOpt18// pass. It seems that a 'writable' attribute should now be added to the argument19// in order for this optimization to proceed.20 21// CHECK-LABEL: define dso_local void @f1(22// CHECK-SAME: ptr dead_on_unwind noalias writable writeonly sret(i128) align 8 captures(none) initializes((0, 16)) [[AGG_RESULT:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {23// CHECK-NEXT:  [[ENTRY:.*:]]24// CHECK-NEXT:    [[TMP0:%.*]] = load atomic i128, ptr @Ptr seq_cst, align 825// CHECK-NEXT:    store i128 [[TMP0]], ptr [[AGG_RESULT]], align 8, !tbaa [[__INT128_TBAA6:![0-9]+]]26// CHECK-NEXT:    ret void27//28__int128 f1() {29  return __atomic_load_n(&Ptr, memory_order_seq_cst);30}31 32// CHECK-LABEL: define dso_local void @f2(33// CHECK-SAME: ptr dead_on_unwind noalias writable writeonly sret(i128) align 8 captures(none) initializes((0, 16)) [[AGG_RESULT:%.*]]) local_unnamed_addr #[[ATTR0]] {34// CHECK-NEXT:  [[ENTRY:.*:]]35// CHECK-NEXT:    [[TMP0:%.*]] = load atomic i128, ptr @Ptr seq_cst, align 836// CHECK-NEXT:    store i128 [[TMP0]], ptr @Ret, align 837// CHECK-NEXT:    store i128 [[TMP0]], ptr [[AGG_RESULT]], align 8, !tbaa [[__INT128_TBAA6]]38// CHECK-NEXT:    ret void39//40__int128 f2() {41  __atomic_load(&Ptr, &Ret, memory_order_seq_cst);42  return Ret;43}44 45// CHECK-LABEL: define dso_local void @f3(46// CHECK-SAME: ) local_unnamed_addr #[[ATTR1:[0-9]+]] {47// CHECK-NEXT:  [[ENTRY:.*:]]48// CHECK-NEXT:    [[TMP0:%.*]] = load i128, ptr @Val, align 8, !tbaa [[__INT128_TBAA6]]49// CHECK-NEXT:    store atomic i128 [[TMP0]], ptr @Ptr seq_cst, align 850// CHECK-NEXT:    ret void51//52void f3() {53  __atomic_store_n(&Ptr, Val, memory_order_seq_cst);54}55 56// CHECK-LABEL: define dso_local void @f4(57// CHECK-SAME: ) local_unnamed_addr #[[ATTR1]] {58// CHECK-NEXT:  [[ENTRY:.*:]]59// CHECK-NEXT:    [[TMP0:%.*]] = load i128, ptr @Val, align 860// CHECK-NEXT:    store atomic i128 [[TMP0]], ptr @Ptr seq_cst, align 861// CHECK-NEXT:    ret void62//63void f4() {64  __atomic_store(&Ptr, &Val, memory_order_seq_cst);65}66 67// CHECK-LABEL: define dso_local void @f5(68// CHECK-SAME: ptr dead_on_unwind noalias writable writeonly sret(i128) align 8 captures(none) initializes((0, 16)) [[AGG_RESULT:%.*]]) local_unnamed_addr #[[ATTR0]] {69// CHECK-NEXT:  [[ENTRY:.*:]]70// CHECK-NEXT:    [[TMP0:%.*]] = load i128, ptr @Val, align 8, !tbaa [[__INT128_TBAA6]]71// CHECK-NEXT:    [[TMP1:%.*]] = atomicrmw xchg ptr @Ptr, i128 [[TMP0]] seq_cst, align 872// CHECK-NEXT:    store i128 [[TMP1]], ptr [[AGG_RESULT]], align 8, !tbaa [[__INT128_TBAA6]]73// CHECK-NEXT:    ret void74//75__int128 f5() {76  return __atomic_exchange_n(&Ptr, Val, memory_order_seq_cst);77}78 79// CHECK-LABEL: define dso_local void @f6(80// CHECK-SAME: ptr dead_on_unwind noalias writable writeonly sret(i128) align 8 captures(none) initializes((0, 16)) [[AGG_RESULT:%.*]]) local_unnamed_addr #[[ATTR0]] {81// CHECK-NEXT:  [[ENTRY:.*:]]82// CHECK-NEXT:    [[TMP0:%.*]] = load i128, ptr @Val, align 883// CHECK-NEXT:    [[TMP1:%.*]] = atomicrmw xchg ptr @Ptr, i128 [[TMP0]] seq_cst, align 884// CHECK-NEXT:    store i128 [[TMP1]], ptr @Ret, align 885// CHECK-NEXT:    store i128 [[TMP1]], ptr [[AGG_RESULT]], align 8, !tbaa [[__INT128_TBAA6]]86// CHECK-NEXT:    ret void87//88__int128 f6() {89  __atomic_exchange(&Ptr, &Val, &Ret, memory_order_seq_cst);90  return Ret;91}92 93// CHECK-LABEL: define dso_local noundef zeroext i1 @f7(94// CHECK-SAME: ) local_unnamed_addr #[[ATTR1]] {95// CHECK-NEXT:  [[ENTRY:.*:]]96// CHECK-NEXT:    [[TMP0:%.*]] = load i128, ptr @Des, align 8, !tbaa [[__INT128_TBAA6]]97// CHECK-NEXT:    [[TMP1:%.*]] = load i128, ptr @Exp, align 898// CHECK-NEXT:    [[TMP2:%.*]] = cmpxchg ptr @Ptr, i128 [[TMP1]], i128 [[TMP0]] seq_cst seq_cst, align 899// CHECK-NEXT:    [[TMP3:%.*]] = extractvalue { i128, i1 } [[TMP2]], 1100// CHECK-NEXT:    br i1 [[TMP3]], label %[[CMPXCHG_CONTINUE:.*]], label %[[CMPXCHG_STORE_EXPECTED:.*]]101// CHECK:       [[CMPXCHG_STORE_EXPECTED]]:102// CHECK-NEXT:    [[TMP4:%.*]] = extractvalue { i128, i1 } [[TMP2]], 0103// CHECK-NEXT:    store i128 [[TMP4]], ptr @Exp, align 8104// CHECK-NEXT:    br label %[[CMPXCHG_CONTINUE]]105// CHECK:       [[CMPXCHG_CONTINUE]]:106// CHECK-NEXT:    ret i1 [[TMP3]]107//108_Bool f7() {109  return __atomic_compare_exchange_n(&Ptr, &Exp, Des, 0,110                                     memory_order_seq_cst, memory_order_seq_cst);111}112 113// CHECK-LABEL: define dso_local noundef zeroext i1 @f8(114// CHECK-SAME: ) local_unnamed_addr #[[ATTR1]] {115// CHECK-NEXT:  [[ENTRY:.*:]]116// CHECK-NEXT:    [[TMP0:%.*]] = load i128, ptr @Exp, align 8117// CHECK-NEXT:    [[TMP1:%.*]] = load i128, ptr @Des, align 8118// CHECK-NEXT:    [[TMP2:%.*]] = cmpxchg ptr @Ptr, i128 [[TMP0]], i128 [[TMP1]] seq_cst seq_cst, align 8119// CHECK-NEXT:    [[TMP3:%.*]] = extractvalue { i128, i1 } [[TMP2]], 1120// CHECK-NEXT:    br i1 [[TMP3]], label %[[CMPXCHG_CONTINUE:.*]], label %[[CMPXCHG_STORE_EXPECTED:.*]]121// CHECK:       [[CMPXCHG_STORE_EXPECTED]]:122// CHECK-NEXT:    [[TMP4:%.*]] = extractvalue { i128, i1 } [[TMP2]], 0123// CHECK-NEXT:    store i128 [[TMP4]], ptr @Exp, align 8124// CHECK-NEXT:    br label %[[CMPXCHG_CONTINUE]]125// CHECK:       [[CMPXCHG_CONTINUE]]:126// CHECK-NEXT:    ret i1 [[TMP3]]127//128_Bool f8() {129  return __atomic_compare_exchange(&Ptr, &Exp, &Des, 0,130                                   memory_order_seq_cst, memory_order_seq_cst);131}132 133// CHECK-LABEL: define dso_local void @f9(134// CHECK-SAME: ptr dead_on_unwind noalias writable writeonly sret(i128) align 8 captures(none) initializes((0, 16)) [[AGG_RESULT:%.*]]) local_unnamed_addr #[[ATTR0]] {135// CHECK-NEXT:  [[ENTRY:.*:]]136// CHECK-NEXT:    [[TMP0:%.*]] = load i128, ptr @Val, align 8, !tbaa [[__INT128_TBAA6]]137// CHECK-NEXT:    [[TMP1:%.*]] = atomicrmw add ptr @Ptr, i128 [[TMP0]] seq_cst, align 8138// CHECK-NEXT:    [[TMP2:%.*]] = add i128 [[TMP1]], [[TMP0]]139// CHECK-NEXT:    store i128 [[TMP2]], ptr [[AGG_RESULT]], align 8, !tbaa [[__INT128_TBAA6]]140// CHECK-NEXT:    ret void141//142__int128 f9() {143  return __atomic_add_fetch(&Ptr, Val, memory_order_seq_cst);144}145 146// CHECK-LABEL: define dso_local void @f10(147// CHECK-SAME: ptr dead_on_unwind noalias writable writeonly sret(i128) align 8 captures(none) initializes((0, 16)) [[AGG_RESULT:%.*]]) local_unnamed_addr #[[ATTR0]] {148// CHECK-NEXT:  [[ENTRY:.*:]]149// CHECK-NEXT:    [[TMP0:%.*]] = load i128, ptr @Val, align 8, !tbaa [[__INT128_TBAA6]]150// CHECK-NEXT:    [[TMP1:%.*]] = atomicrmw sub ptr @Ptr, i128 [[TMP0]] seq_cst, align 8151// CHECK-NEXT:    [[TMP2:%.*]] = sub i128 [[TMP1]], [[TMP0]]152// CHECK-NEXT:    store i128 [[TMP2]], ptr [[AGG_RESULT]], align 8, !tbaa [[__INT128_TBAA6]]153// CHECK-NEXT:    ret void154//155__int128 f10() {156  return __atomic_sub_fetch(&Ptr, Val, memory_order_seq_cst);157}158 159// CHECK-LABEL: define dso_local void @f11(160// CHECK-SAME: ptr dead_on_unwind noalias writable writeonly sret(i128) align 8 captures(none) initializes((0, 16)) [[AGG_RESULT:%.*]]) local_unnamed_addr #[[ATTR0]] {161// CHECK-NEXT:  [[ENTRY:.*:]]162// CHECK-NEXT:    [[TMP0:%.*]] = load i128, ptr @Val, align 8, !tbaa [[__INT128_TBAA6]]163// CHECK-NEXT:    [[TMP1:%.*]] = atomicrmw and ptr @Ptr, i128 [[TMP0]] seq_cst, align 8164// CHECK-NEXT:    [[TMP2:%.*]] = and i128 [[TMP1]], [[TMP0]]165// CHECK-NEXT:    store i128 [[TMP2]], ptr [[AGG_RESULT]], align 8, !tbaa [[__INT128_TBAA6]]166// CHECK-NEXT:    ret void167//168__int128 f11() {169  return __atomic_and_fetch(&Ptr, Val, memory_order_seq_cst);170}171 172// CHECK-LABEL: define dso_local void @f12(173// CHECK-SAME: ptr dead_on_unwind noalias writable writeonly sret(i128) align 8 captures(none) initializes((0, 16)) [[AGG_RESULT:%.*]]) local_unnamed_addr #[[ATTR0]] {174// CHECK-NEXT:  [[ENTRY:.*:]]175// CHECK-NEXT:    [[TMP0:%.*]] = load i128, ptr @Val, align 8, !tbaa [[__INT128_TBAA6]]176// CHECK-NEXT:    [[TMP1:%.*]] = atomicrmw xor ptr @Ptr, i128 [[TMP0]] seq_cst, align 8177// CHECK-NEXT:    [[TMP2:%.*]] = xor i128 [[TMP1]], [[TMP0]]178// CHECK-NEXT:    store i128 [[TMP2]], ptr [[AGG_RESULT]], align 8, !tbaa [[__INT128_TBAA6]]179// CHECK-NEXT:    ret void180//181__int128 f12() {182  return __atomic_xor_fetch(&Ptr, Val, memory_order_seq_cst);183}184 185// CHECK-LABEL: define dso_local void @f13(186// CHECK-SAME: ptr dead_on_unwind noalias writable writeonly sret(i128) align 8 captures(none) initializes((0, 16)) [[AGG_RESULT:%.*]]) local_unnamed_addr #[[ATTR0]] {187// CHECK-NEXT:  [[ENTRY:.*:]]188// CHECK-NEXT:    [[TMP0:%.*]] = load i128, ptr @Val, align 8, !tbaa [[__INT128_TBAA6]]189// CHECK-NEXT:    [[TMP1:%.*]] = atomicrmw or ptr @Ptr, i128 [[TMP0]] seq_cst, align 8190// CHECK-NEXT:    [[TMP2:%.*]] = or i128 [[TMP1]], [[TMP0]]191// CHECK-NEXT:    store i128 [[TMP2]], ptr [[AGG_RESULT]], align 8, !tbaa [[__INT128_TBAA6]]192// CHECK-NEXT:    ret void193//194__int128 f13() {195  return __atomic_or_fetch(&Ptr, Val, memory_order_seq_cst);196}197 198// CHECK-LABEL: define dso_local void @f14(199// CHECK-SAME: ptr dead_on_unwind noalias writable writeonly sret(i128) align 8 captures(none) initializes((0, 16)) [[AGG_RESULT:%.*]]) local_unnamed_addr #[[ATTR0]] {200// CHECK-NEXT:  [[ENTRY:.*:]]201// CHECK-NEXT:    [[TMP0:%.*]] = load i128, ptr @Val, align 8, !tbaa [[__INT128_TBAA6]]202// CHECK-NEXT:    [[TMP1:%.*]] = atomicrmw nand ptr @Ptr, i128 [[TMP0]] seq_cst, align 8203// CHECK-NEXT:    [[TMP2:%.*]] = and i128 [[TMP1]], [[TMP0]]204// CHECK-NEXT:    [[TMP3:%.*]] = xor i128 [[TMP2]], -1205// CHECK-NEXT:    store i128 [[TMP3]], ptr [[AGG_RESULT]], align 8, !tbaa [[__INT128_TBAA6]]206// CHECK-NEXT:    ret void207//208__int128 f14() {209  return __atomic_nand_fetch(&Ptr, Val, memory_order_seq_cst);210}211 212// CHECK-LABEL: define dso_local void @f15(213// CHECK-SAME: ptr dead_on_unwind noalias writable writeonly sret(i128) align 8 captures(none) initializes((0, 16)) [[AGG_RESULT:%.*]]) local_unnamed_addr #[[ATTR0]] {214// CHECK-NEXT:  [[ENTRY:.*:]]215// CHECK-NEXT:    [[TMP0:%.*]] = load i128, ptr @Val, align 8, !tbaa [[__INT128_TBAA6]]216// CHECK-NEXT:    [[TMP1:%.*]] = atomicrmw add ptr @Ptr, i128 [[TMP0]] seq_cst, align 8217// CHECK-NEXT:    store i128 [[TMP1]], ptr [[AGG_RESULT]], align 8, !tbaa [[__INT128_TBAA6]]218// CHECK-NEXT:    ret void219//220__int128 f15() {221  return __atomic_fetch_add(&Ptr, Val, memory_order_seq_cst);222}223 224// CHECK-LABEL: define dso_local void @f16(225// CHECK-SAME: ptr dead_on_unwind noalias writable writeonly sret(i128) align 8 captures(none) initializes((0, 16)) [[AGG_RESULT:%.*]]) local_unnamed_addr #[[ATTR0]] {226// CHECK-NEXT:  [[ENTRY:.*:]]227// CHECK-NEXT:    [[TMP0:%.*]] = load i128, ptr @Val, align 8, !tbaa [[__INT128_TBAA6]]228// CHECK-NEXT:    [[TMP1:%.*]] = atomicrmw sub ptr @Ptr, i128 [[TMP0]] seq_cst, align 8229// CHECK-NEXT:    store i128 [[TMP1]], ptr [[AGG_RESULT]], align 8, !tbaa [[__INT128_TBAA6]]230// CHECK-NEXT:    ret void231//232__int128 f16() {233  return __atomic_fetch_sub(&Ptr, Val, memory_order_seq_cst);234}235 236// CHECK-LABEL: define dso_local void @f17(237// CHECK-SAME: ptr dead_on_unwind noalias writable writeonly sret(i128) align 8 captures(none) initializes((0, 16)) [[AGG_RESULT:%.*]]) local_unnamed_addr #[[ATTR0]] {238// CHECK-NEXT:  [[ENTRY:.*:]]239// CHECK-NEXT:    [[TMP0:%.*]] = load i128, ptr @Val, align 8, !tbaa [[__INT128_TBAA6]]240// CHECK-NEXT:    [[TMP1:%.*]] = atomicrmw and ptr @Ptr, i128 [[TMP0]] seq_cst, align 8241// CHECK-NEXT:    store i128 [[TMP1]], ptr [[AGG_RESULT]], align 8, !tbaa [[__INT128_TBAA6]]242// CHECK-NEXT:    ret void243//244__int128 f17() {245  return __atomic_fetch_and(&Ptr, Val, memory_order_seq_cst);246}247 248// CHECK-LABEL: define dso_local void @f18(249// CHECK-SAME: ptr dead_on_unwind noalias writable writeonly sret(i128) align 8 captures(none) initializes((0, 16)) [[AGG_RESULT:%.*]]) local_unnamed_addr #[[ATTR0]] {250// CHECK-NEXT:  [[ENTRY:.*:]]251// CHECK-NEXT:    [[TMP0:%.*]] = load i128, ptr @Val, align 8, !tbaa [[__INT128_TBAA6]]252// CHECK-NEXT:    [[TMP1:%.*]] = atomicrmw xor ptr @Ptr, i128 [[TMP0]] seq_cst, align 8253// CHECK-NEXT:    store i128 [[TMP1]], ptr [[AGG_RESULT]], align 8, !tbaa [[__INT128_TBAA6]]254// CHECK-NEXT:    ret void255//256__int128 f18() {257  return __atomic_fetch_xor(&Ptr, Val, memory_order_seq_cst);258}259 260// CHECK-LABEL: define dso_local void @f19(261// CHECK-SAME: ptr dead_on_unwind noalias writable writeonly sret(i128) align 8 captures(none) initializes((0, 16)) [[AGG_RESULT:%.*]]) local_unnamed_addr #[[ATTR0]] {262// CHECK-NEXT:  [[ENTRY:.*:]]263// CHECK-NEXT:    [[TMP0:%.*]] = load i128, ptr @Val, align 8, !tbaa [[__INT128_TBAA6]]264// CHECK-NEXT:    [[TMP1:%.*]] = atomicrmw or ptr @Ptr, i128 [[TMP0]] seq_cst, align 8265// CHECK-NEXT:    store i128 [[TMP1]], ptr [[AGG_RESULT]], align 8, !tbaa [[__INT128_TBAA6]]266// CHECK-NEXT:    ret void267//268__int128 f19() {269  return __atomic_fetch_or(&Ptr, Val, memory_order_seq_cst);270}271 272// CHECK-LABEL: define dso_local void @f20(273// CHECK-SAME: ptr dead_on_unwind noalias writable writeonly sret(i128) align 8 captures(none) initializes((0, 16)) [[AGG_RESULT:%.*]]) local_unnamed_addr #[[ATTR0]] {274// CHECK-NEXT:  [[ENTRY:.*:]]275// CHECK-NEXT:    [[TMP0:%.*]] = load i128, ptr @Val, align 8, !tbaa [[__INT128_TBAA6]]276// CHECK-NEXT:    [[TMP1:%.*]] = atomicrmw nand ptr @Ptr, i128 [[TMP0]] seq_cst, align 8277// CHECK-NEXT:    store i128 [[TMP1]], ptr [[AGG_RESULT]], align 8, !tbaa [[__INT128_TBAA6]]278// CHECK-NEXT:    ret void279//280__int128 f20() {281  return __atomic_fetch_nand(&Ptr, Val, memory_order_seq_cst);282}283//.284// CHECK: [[META4:![0-9]+]] = !{!"omnipotent char", [[META5:![0-9]+]], i64 0}285// CHECK: [[META5]] = !{!"Simple C/C++ TBAA"}286// CHECK: [[__INT128_TBAA6]] = !{[[META7:![0-9]+]], [[META7]], i64 0}287// CHECK: [[META7]] = !{!"__int128", [[META4]], i64 0}288//.289