diff --git a/clang/include/clang/Basic/BuiltinsWebAssembly.def b/clang/include/clang/Basic/BuiltinsWebAssembly.def --- a/clang/include/clang/Basic/BuiltinsWebAssembly.def +++ b/clang/include/clang/Basic/BuiltinsWebAssembly.def @@ -25,11 +25,6 @@ BUILTIN(__builtin_wasm_memory_size, "zIi", "n") BUILTIN(__builtin_wasm_memory_grow, "zIiz", "n") -// Thread-local storage -TARGET_BUILTIN(__builtin_wasm_tls_size, "z", "nc", "bulk-memory") -TARGET_BUILTIN(__builtin_wasm_tls_align, "z", "nc", "bulk-memory") -TARGET_BUILTIN(__builtin_wasm_tls_base, "v*", "nU", "bulk-memory") - // Floating point min/max BUILTIN(__builtin_wasm_min_f32, "fff", "nc") BUILTIN(__builtin_wasm_max_f32, "fff", "nc") diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -16388,20 +16388,6 @@ CGM.getIntrinsic(Intrinsic::wasm_memory_grow, ResultType); return Builder.CreateCall(Callee, Args); } - case WebAssembly::BI__builtin_wasm_tls_size: { - llvm::Type *ResultType = ConvertType(E->getType()); - Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_tls_size, ResultType); - return Builder.CreateCall(Callee); - } - case WebAssembly::BI__builtin_wasm_tls_align: { - llvm::Type *ResultType = ConvertType(E->getType()); - Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_tls_align, ResultType); - return Builder.CreateCall(Callee); - } - case WebAssembly::BI__builtin_wasm_tls_base: { - Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_tls_base); - return Builder.CreateCall(Callee); - } case WebAssembly::BI__builtin_wasm_throw: { Value *Tag = EmitScalarExpr(E->getArg(0)); Value *Obj = EmitScalarExpr(E->getArg(1)); diff --git a/clang/test/CodeGen/builtins-wasm.c b/clang/test/CodeGen/builtins-wasm.c --- a/clang/test/CodeGen/builtins-wasm.c +++ b/clang/test/CodeGen/builtins-wasm.c @@ -26,23 +26,6 @@ // WEBASSEMBLY64: call i64 @llvm.wasm.memory.grow.i64(i32 0, i64 %{{.*}}) } -__SIZE_TYPE__ tls_size() { - return __builtin_wasm_tls_size(); - // WEBASSEMBLY32: call i32 @llvm.wasm.tls.size.i32() - // WEBASSEMBLY64: call i64 @llvm.wasm.tls.size.i64() -} - -__SIZE_TYPE__ tls_align() { - return __builtin_wasm_tls_align(); - // WEBASSEMBLY32: call i32 @llvm.wasm.tls.align.i32() - // WEBASSEMBLY64: call i64 @llvm.wasm.tls.align.i64() -} - -void *tls_base() { - return __builtin_wasm_tls_base(); - // WEBASSEMBLY: call i8* @llvm.wasm.tls.base() -} - void throw(void *obj) { return __builtin_wasm_throw(0, obj); // WEBASSEMBLY32: call void @llvm.wasm.throw(i32 0, i8* %{{.*}}) diff --git a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td --- a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td +++ b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td @@ -301,23 +301,4 @@ [llvm_v2i64_ty, llvm_v2i64_ty], [IntrNoMem, IntrSpeculatable]>; -//===----------------------------------------------------------------------===// -// Thread-local storage intrinsics -//===----------------------------------------------------------------------===// - -def int_wasm_tls_size : - Intrinsic<[llvm_anyint_ty], - [], - [IntrNoMem, IntrSpeculatable]>; - -def int_wasm_tls_align : - Intrinsic<[llvm_anyint_ty], - [], - [IntrNoMem, IntrSpeculatable]>; - -def int_wasm_tls_base : - Intrinsic<[llvm_ptr_ty], - [], - [IntrReadMem]>; - } // TargetPrefix = "wasm" diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp --- a/llvm/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp @@ -161,40 +161,6 @@ return; } - case ISD::INTRINSIC_WO_CHAIN: { - unsigned IntNo = cast(Node->getOperand(0))->getZExtValue(); - switch (IntNo) { - case Intrinsic::wasm_tls_size: { - MachineSDNode *TLSSize = CurDAG->getMachineNode( - GlobalGetIns, DL, PtrVT, - CurDAG->getTargetExternalSymbol("__tls_size", PtrVT)); - ReplaceNode(Node, TLSSize); - return; - } - case Intrinsic::wasm_tls_align: { - MachineSDNode *TLSAlign = CurDAG->getMachineNode( - GlobalGetIns, DL, PtrVT, - CurDAG->getTargetExternalSymbol("__tls_align", PtrVT)); - ReplaceNode(Node, TLSAlign); - return; - } - } - break; - } - case ISD::INTRINSIC_W_CHAIN: { - unsigned IntNo = cast(Node->getOperand(1))->getZExtValue(); - switch (IntNo) { - case Intrinsic::wasm_tls_base: { - MachineSDNode *TLSBase = CurDAG->getMachineNode( - GlobalGetIns, DL, PtrVT, MVT::Other, - CurDAG->getTargetExternalSymbol("__tls_base", PtrVT), - Node->getOperand(0)); - ReplaceNode(Node, TLSBase); - return; - } - } - break; - } case WebAssemblyISD::CALL: case WebAssemblyISD::RET_CALL: { // CALL has both variable operands and variable results, but ISel only diff --git a/llvm/test/CodeGen/WebAssembly/tls-general-dynamic.ll b/llvm/test/CodeGen/WebAssembly/tls-general-dynamic.ll --- a/llvm/test/CodeGen/WebAssembly/tls-general-dynamic.ll +++ b/llvm/test/CodeGen/WebAssembly/tls-general-dynamic.ll @@ -66,44 +66,6 @@ ret void } -; CHECK-LABEL: tls_size: -; CHECK-NEXT: .functype tls_size () -> (i32) -define i32 @tls_size() { -; CHECK-NEXT: global.get __tls_size -; CHECK-NEXT: return - %1 = call i32 @llvm.wasm.tls.size.i32() - ret i32 %1 -} - -; CHECK-LABEL: tls_align: -; CHECK-NEXT: .functype tls_align () -> (i32) -define i32 @tls_align() { -; CHECK-NEXT: global.get __tls_align -; CHECK-NEXT: return - %1 = call i32 @llvm.wasm.tls.align.i32() - ret i32 %1 -} - -; CHECK-LABEL: tls_base: -; CHECK-NEXT: .functype tls_base () -> (i32) -define i8* @tls_base() { -; CHECK-NEXT: global.get __tls_base -; CHECK-NEXT: return - %1 = call i8* @llvm.wasm.tls.base() - ret i8* %1 -} - -; CHECK-LABEL: tls_base_write: -; CHECK-NEXT: .functype tls_base_write (i32) -> () -define void @tls_base_write(i8** %output) { -; CHECK-NEXT: global.get __tls_base -; CHECK-NEXT: i32.store 0 -; CHECK-NEXT: return - %1 = call i8* @llvm.wasm.tls.base() - store i8* %1, i8** %output - ret void -} - ; CHECK: .type tls,@object ; TLS-NEXT: .section .tbss.tls,"",@ ; NO-TLS-NEXT: .section .bss.tls,"",@ @@ -111,7 +73,3 @@ ; CHECK-NEXT: tls: ; CHECK-NEXT: .int32 0 @tls = internal thread_local global i32 0 - -declare i32 @llvm.wasm.tls.size.i32() -declare i32 @llvm.wasm.tls.align.i32() -declare i8* @llvm.wasm.tls.base() diff --git a/llvm/test/CodeGen/WebAssembly/tls-local-exec.ll b/llvm/test/CodeGen/WebAssembly/tls-local-exec.ll --- a/llvm/test/CodeGen/WebAssembly/tls-local-exec.ll +++ b/llvm/test/CodeGen/WebAssembly/tls-local-exec.ll @@ -62,15 +62,6 @@ ret void } -; CHECK-LABEL: tls_size: -; CHECK-NEXT: .functype tls_size () -> (i32) -define i32 @tls_size() { -; CHECK-NEXT: global.get __tls_size -; CHECK-NEXT: return - %1 = call i32 @llvm.wasm.tls.size.i32() - ret i32 %1 -} - ; CHECK: .type tls,@object ; TLS-NEXT: .section .tbss.tls,"",@ ; NO-TLS-NEXT: .section .bss.tls,"",@ @@ -78,5 +69,3 @@ ; CHECK-NEXT: tls: ; CHECK-NEXT: .int32 0 @tls = internal thread_local(localexec) global i32 0 - -declare i32 @llvm.wasm.tls.size.i32()