diff --git a/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp index 956ebe8fc8b9a..2f3de199f51d4 100644 --- a/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp @@ -803,6 +803,10 @@ bool ThreadSanitizer::instrumentAtomic(Instruction *I, const DataLayout &DL) { int ThreadSanitizer::getMemoryAccessFuncIndex(Type *OrigTy, Value *Addr, const DataLayout &DL) { assert(OrigTy->isSized()); + if (OrigTy->isScalableTy()) { + // FIXME: support vscale. + return -1; + } uint32_t TypeSize = DL.getTypeStoreSizeInBits(OrigTy); if (TypeSize != 8 && TypeSize != 16 && TypeSize != 32 && TypeSize != 64 && TypeSize != 128) { diff --git a/llvm/test/Instrumentation/ThreadSanitizer/tsan_basic.ll b/llvm/test/Instrumentation/ThreadSanitizer/tsan_basic.ll index 60a423835f21f..3aef34317b0bb 100644 --- a/llvm/test/Instrumentation/ThreadSanitizer/tsan_basic.ll +++ b/llvm/test/Instrumentation/ThreadSanitizer/tsan_basic.ll @@ -108,6 +108,18 @@ define i32 @NakedTest(ptr %a) naked sanitize_thread { ret i32 %tmp1 } +; vscale is unsupported, just don't crash here. +define void @test_load_store_i32(ptr %a, ptr %b) sanitize_thread { +; CHECK-LABEL: define void @test_load_store_i32( +; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]]) +; CHECK-NEXT: [[TMP1:%.*]] = load , ptr [[A]], align 16 +; CHECK-NEXT: store [[TMP1]], ptr [[B]], align 16 +; CHECK-NEXT: ret void + %1 = load , ptr %a + store %1, ptr %b + ret void +} + declare void @foo() nounwind ; CHECK: define internal void @tsan.module_ctor()