From 4547715ec05943e2a101583bc0a4a2bc2ac55bc7 Mon Sep 17 00:00:00 2001 From: william Date: Sun, 8 Jun 2025 22:34:17 +0800 Subject: [PATCH 1/6] [X86] Use X86FixupInstTunings to select between (V)MOVSS/D and (V)BLENDPS/D --- llvm/lib/Target/X86/X86FixupInstTuning.cpp | 46 +++++++++++ .../test/CodeGen/X86/2012-01-12-extract-sv.ll | 4 +- llvm/test/CodeGen/X86/avx-insertelt.ll | 8 +- .../X86/avx512-intrinsics-fast-isel.ll | 4 +- .../CodeGen/X86/avx512-intrinsics-upgrade.ll | 2 +- llvm/test/CodeGen/X86/avx512-intrinsics.ll | 2 +- .../test/CodeGen/X86/avx512copy-intrinsics.ll | 2 +- llvm/test/CodeGen/X86/build-vector-512.ll | 6 +- llvm/test/CodeGen/X86/buildvec-extract.ll | 6 +- .../CodeGen/X86/canonicalize-vars-f16-type.ll | 8 +- .../CodeGen/X86/coalesce_commute_movsd.ll | 4 +- llvm/test/CodeGen/X86/combine-and.ll | 4 +- llvm/test/CodeGen/X86/combine-or-shuffle.ll | 80 ++++++++++++++----- .../CodeGen/X86/fminimumnum-fmaximumnum.ll | 2 +- llvm/test/CodeGen/X86/fmsubadd-combine.ll | 4 +- .../test/CodeGen/X86/fp-strict-scalar-fp16.ll | 14 ++-- .../X86/fp-strict-scalar-inttofp-fp16.ll | 24 +++--- .../X86/fp-strict-scalar-round-fp16.ll | 14 ++-- llvm/test/CodeGen/X86/half-constrained.ll | 6 +- llvm/test/CodeGen/X86/half-darwin.ll | 2 +- llvm/test/CodeGen/X86/insertelement-zero.ll | 4 +- llvm/test/CodeGen/X86/masked_expandload.ll | 14 ++-- llvm/test/CodeGen/X86/masked_gather.ll | 12 +-- .../test/CodeGen/X86/masked_gather_scatter.ll | 2 +- llvm/test/CodeGen/X86/masked_load.ll | 2 +- llvm/test/CodeGen/X86/oddsubvector.ll | 4 +- llvm/test/CodeGen/X86/pr40730.ll | 4 +- llvm/test/CodeGen/X86/scalarize-fp.ll | 2 +- .../CodeGen/X86/sse-insertelt-from-mem.ll | 2 +- llvm/test/CodeGen/X86/sse-insertelt.ll | 2 +- .../CodeGen/X86/sse-intrinsics-fast-isel.ll | 16 ++-- llvm/test/CodeGen/X86/sse-scalar-fp-arith.ll | 16 ++-- .../CodeGen/X86/sse2-intrinsics-fast-isel.ll | 8 +- llvm/test/CodeGen/X86/sse2.ll | 2 +- llvm/test/CodeGen/X86/sse41.ll | 12 +-- .../test/CodeGen/X86/stack-folding-fp-avx1.ll | 4 +- llvm/test/CodeGen/X86/vec-strict-128-fp16.ll | 2 +- .../X86/vec-strict-fptoint-128-fp16.ll | 20 ++--- llvm/test/CodeGen/X86/vec_extract-avx.ll | 8 +- llvm/test/CodeGen/X86/vec_floor.ll | 68 ++++++++-------- llvm/test/CodeGen/X86/vec_ss_load_fold.ll | 8 +- llvm/test/CodeGen/X86/vector-blend.ll | 2 +- .../CodeGen/X86/vector-half-conversions.ll | 4 +- .../vector-interleaved-store-i32-stride-5.ll | 4 +- .../vector-interleaved-store-i32-stride-7.ll | 2 +- .../vector-interleaved-store-i64-stride-5.ll | 10 +-- .../test/CodeGen/X86/vector-shuffle-128-v2.ll | 2 +- .../test/CodeGen/X86/vector-shuffle-128-v4.ll | 16 ++-- .../test/CodeGen/X86/vector-shuffle-256-v4.ll | 32 +++----- .../test/CodeGen/X86/vector-shuffle-256-v8.ll | 14 ++-- .../X86/vector-shuffle-combining-avx2.ll | 2 +- .../X86/vector-shuffle-combining-ssse3.ll | 4 +- .../X86/vector-shuffle-combining-xop.ll | 2 +- llvm/test/CodeGen/X86/vector-zmov.ll | 2 +- llvm/test/CodeGen/X86/vselect.ll | 8 +- 55 files changed, 316 insertions(+), 242 deletions(-) diff --git a/llvm/lib/Target/X86/X86FixupInstTuning.cpp b/llvm/lib/Target/X86/X86FixupInstTuning.cpp index 6bb7600dedcac..7f4d73e89f472 100644 --- a/llvm/lib/Target/X86/X86FixupInstTuning.cpp +++ b/llvm/lib/Target/X86/X86FixupInstTuning.cpp @@ -221,8 +221,54 @@ bool X86FixupInstTuningPass::processInstruction( auto ProcessUNPCKPS = [&](unsigned NewOpc) -> bool { return ProcessUNPCKToIntDomain(NewOpc); }; + + + + auto ProcessBLENDToMOV = [&](unsigned MovOpc) -> bool { + if (!MI.getOperand(NumOperands - 1).isImm() || + MI.getOperand(NumOperands - 1).getImm() != 1) + return false; + + bool Force = MF.getFunction().hasOptSize(); + + if (!Force && !NewOpcPreferable(MovOpc)) + return false; + MI.setDesc(TII->get(MovOpc)); + MI.removeOperand(NumOperands - 1); + return true; + }; + + + switch (Opc) { + + case X86::VBLENDPSrri: + case X86::VBLENDPSYrri: + case X86::VBLENDMPSZ128rrkz: + case X86::VBLENDMPSZ256rrkz: + case X86::VBLENDMPSZrrkz: { + int Imm = MI.getOperand(NumOperands - 1).getImm(); + if (Imm != 1) + return false; + return ProcessBLENDToMOV(X86::VMOVSSrr); + } + + case X86::VBLENDPDrri: + case X86::VBLENDPDYrri: + case X86::VBLENDMPDZ128rrkz: + case X86::VBLENDMPDZ256rrkz: + case X86::VBLENDMPDZrrkz: { + int Imm = MI.getOperand(NumOperands - 1).getImm(); + if (Imm != 1) + return false; + return ProcessBLENDToMOV(X86::VMOVSDrr); + } + + + + + case X86::VPERMILPDri: return ProcessVPERMILPDri(X86::VSHUFPDrri); case X86::VPERMILPDYri: diff --git a/llvm/test/CodeGen/X86/2012-01-12-extract-sv.ll b/llvm/test/CodeGen/X86/2012-01-12-extract-sv.ll index 254a53fcac4de..65273870c3dfb 100644 --- a/llvm/test/CodeGen/X86/2012-01-12-extract-sv.ll +++ b/llvm/test/CodeGen/X86/2012-01-12-extract-sv.ll @@ -11,7 +11,7 @@ define void @endless_loop() { ; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3,4,5,6],ymm1[7] ; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3] +; AVX1-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3] ; AVX1-NEXT: vmovaps %ymm0, (%eax) ; AVX1-NEXT: vmovaps %ymm1, (%eax) ; AVX1-NEXT: vzeroupper @@ -21,7 +21,7 @@ define void @endless_loop() { ; AVX2: # %bb.0: # %entry ; AVX2-NEXT: vbroadcastss (%eax), %xmm0 ; AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX2-NEXT: vblendps {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3] +; AVX2-NEXT: vmovss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3] ; AVX2-NEXT: vbroadcastss %xmm0, %ymm0 ; AVX2-NEXT: vxorps %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vblendps {{.*#+}} ymm0 = ymm2[0,1,2,3,4,5,6],ymm0[7] diff --git a/llvm/test/CodeGen/X86/avx-insertelt.ll b/llvm/test/CodeGen/X86/avx-insertelt.ll index 18ca01290c914..81f3058f19579 100644 --- a/llvm/test/CodeGen/X86/avx-insertelt.ll +++ b/llvm/test/CodeGen/X86/avx-insertelt.ll @@ -8,7 +8,7 @@ define <8 x float> @insert_f32_firstelt_of_low_subvector(<8 x float> %x, float % ; ALL-LABEL: insert_f32_firstelt_of_low_subvector: ; ALL: # %bb.0: ; ALL-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm1 -; ALL-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3,4,5,6,7] +; ALL-NEXT: vmovss {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3] ; ALL-NEXT: retq %i0 = insertelement <8 x float> %x, float %s, i32 0 ret <8 x float> %i0 @@ -94,7 +94,7 @@ define <8 x float> @insert_f32_firstelt_of_high_subvector(<8 x float> %x, float ; AVX-LABEL: insert_f32_firstelt_of_high_subvector: ; AVX: # %bb.0: ; AVX-NEXT: vextractf128 $1, %ymm0, %xmm2 -; AVX-NEXT: vblendps {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3] ; AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 ; AVX-NEXT: retq ; @@ -202,9 +202,9 @@ define <4 x i64> @insert_i64_firstelt_of_high_subvector(<4 x i64> %x, i64 %s) { define <8 x float> @insert_f32_firstelts(<8 x float> %x, float %s) { ; AVX-LABEL: insert_f32_firstelts: ; AVX: # %bb.0: -; AVX-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm0[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm2 = xmm1[0],xmm0[1,2,3] ; AVX-NEXT: vextractf128 $1, %ymm0, %xmm0 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; AVX-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0 ; AVX-NEXT: retq ; diff --git a/llvm/test/CodeGen/X86/avx512-intrinsics-fast-isel.ll b/llvm/test/CodeGen/X86/avx512-intrinsics-fast-isel.ll index a8574c0b7516c..30bf1a261f4b7 100644 --- a/llvm/test/CodeGen/X86/avx512-intrinsics-fast-isel.ll +++ b/llvm/test/CodeGen/X86/avx512-intrinsics-fast-isel.ll @@ -1843,7 +1843,7 @@ define <2 x double> @test_mm_cvtu64_sd(<2 x double> %__A, i64 %__B) { ; X86-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1 ; X86-NEXT: vshufpd {{.*#+}} xmm2 = xmm1[1,0] ; X86-NEXT: vaddsd %xmm1, %xmm2, %xmm1 -; X86-NEXT: vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1] +; X86-NEXT: vmovsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] ; X86-NEXT: retl ; ; X64-LABEL: test_mm_cvtu64_sd: @@ -1891,7 +1891,7 @@ define <4 x float> @test_mm_cvtu64_ss(<4 x float> %__A, i64 %__B) { ; X86-NEXT: fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%eax,4) ; X86-NEXT: fstps {{[0-9]+}}(%esp) ; X86-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero -; X86-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; X86-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; X86-NEXT: movl %ebp, %esp ; X86-NEXT: popl %ebp ; X86-NEXT: .cfi_def_cfa %esp, 4 diff --git a/llvm/test/CodeGen/X86/avx512-intrinsics-upgrade.ll b/llvm/test/CodeGen/X86/avx512-intrinsics-upgrade.ll index c1ef500d9d3de..aae48aba93be6 100644 --- a/llvm/test/CodeGen/X86/avx512-intrinsics-upgrade.ll +++ b/llvm/test/CodeGen/X86/avx512-intrinsics-upgrade.ll @@ -10483,7 +10483,7 @@ define <4 x float>@test_int_x86_avx512_maskz_vfmadd_ss_rm(<4 x float> %x0, <4 x ; CHECK-LABEL: test_int_x86_avx512_maskz_vfmadd_ss_rm: ; CHECK: ## %bb.0: ; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1 ## encoding: [0xc5,0xf0,0x57,0xc9] -; CHECK-NEXT: vblendps $1, %xmm1, %xmm0, %xmm0 ## encoding: [0xc4,0xe3,0x79,0x0c,0xc1,0x01] +; CHECK-NEXT: vmovss %xmm1, %xmm0, %xmm0 ## encoding: [0xc5,0xfa,0x10,0xc1] ; CHECK-NEXT: ## xmm0 = xmm1[0],xmm0[1,2,3] ; CHECK-NEXT: ret{{[l|q]}} ## encoding: [0xc3] %q = load float, ptr %ptr_b diff --git a/llvm/test/CodeGen/X86/avx512-intrinsics.ll b/llvm/test/CodeGen/X86/avx512-intrinsics.ll index 926af4e9957af..f9b5994a18d36 100644 --- a/llvm/test/CodeGen/X86/avx512-intrinsics.ll +++ b/llvm/test/CodeGen/X86/avx512-intrinsics.ll @@ -6505,7 +6505,7 @@ define <4 x float>@test_int_x86_avx512_maskz_vfmadd_ss_rm(<4 x float> %x0, <4 x ; CHECK-LABEL: test_int_x86_avx512_maskz_vfmadd_ss_rm: ; CHECK: # %bb.0: ; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; CHECK-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; CHECK-NEXT: ret{{[l|q]}} %q = load float, ptr %ptr_b %vecinit.i = insertelement <4 x float> undef, float %q, i32 0 diff --git a/llvm/test/CodeGen/X86/avx512copy-intrinsics.ll b/llvm/test/CodeGen/X86/avx512copy-intrinsics.ll index a7ca23792e6fe..a2af7df44010e 100644 --- a/llvm/test/CodeGen/X86/avx512copy-intrinsics.ll +++ b/llvm/test/CodeGen/X86/avx512copy-intrinsics.ll @@ -11,7 +11,7 @@ define <4 x i32> @test_mm_move_epi32(<4 x i32> %a0) nounwind { ; NOAVX512MOVZXC-LABEL: test_mm_move_epi32: ; NOAVX512MOVZXC: # %bb.0: ; NOAVX512MOVZXC-NEXT: vxorps %xmm1, %xmm1, %xmm1 # encoding: [0xc5,0xf0,0x57,0xc9] -; NOAVX512MOVZXC-NEXT: vblendps $1, %xmm0, %xmm1, %xmm0 # encoding: [0xc4,0xe3,0x71,0x0c,0xc0,0x01] +; NOAVX512MOVZXC-NEXT: vmovss %xmm0, %xmm1, %xmm0 # encoding: [0xc5,0xf2,0x10,0xc0] ; NOAVX512MOVZXC-NEXT: # xmm0 = xmm0[0],xmm1[1,2,3] ; NOAVX512MOVZXC-NEXT: retq # encoding: [0xc3] %res = shufflevector <4 x i32> %a0, <4 x i32> zeroinitializer, <4 x i32> diff --git a/llvm/test/CodeGen/X86/build-vector-512.ll b/llvm/test/CodeGen/X86/build-vector-512.ll index 789196c5e4848..69d17fe3ab69f 100644 --- a/llvm/test/CodeGen/X86/build-vector-512.ll +++ b/llvm/test/CodeGen/X86/build-vector-512.ll @@ -578,7 +578,7 @@ define <16 x float> @test_buildvector_16f32_2_var(float %a0, float %a1) { ; AVX-32-NEXT: vpmovsxbd {{.*#+}} xmm1 = [0,17,0,0] ; AVX-32-NEXT: vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero ; AVX-32-NEXT: vpermi2ps %zmm0, %zmm2, %zmm1 -; AVX-32-NEXT: vblendps {{.*#+}} xmm3 = xmm2[0],xmm0[1,2,3] +; AVX-32-NEXT: vmovss {{.*#+}} xmm3 = xmm2[0],xmm0[1,2,3] ; AVX-32-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 ; AVX-32-NEXT: vinsertps {{.*#+}} xmm3 = xmm0[0,1,2],xmm2[0] ; AVX-32-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[2,3] @@ -626,7 +626,7 @@ define <16 x float> @test_buildvector_16f32_2_load(ptr %p0, ptr %p1) { ; AVX-32-NEXT: vbroadcastss (%ecx), %xmm1 ; AVX-32-NEXT: vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero ; AVX-32-NEXT: vpermi2ps %zmm1, %zmm2, %zmm0 -; AVX-32-NEXT: vblendps {{.*#+}} xmm3 = xmm2[0],xmm1[1,2,3] +; AVX-32-NEXT: vmovss {{.*#+}} xmm3 = xmm2[0],xmm1[1,2,3] ; AVX-32-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 ; AVX-32-NEXT: vinsertps {{.*#+}} xmm3 = xmm1[0,1,2],xmm2[0] ; AVX-32-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[2,3] @@ -640,7 +640,7 @@ define <16 x float> @test_buildvector_16f32_2_load(ptr %p0, ptr %p1) { ; AVX-64-NEXT: vbroadcastss (%rdi), %xmm1 ; AVX-64-NEXT: vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero ; AVX-64-NEXT: vpermi2ps %zmm1, %zmm2, %zmm0 -; AVX-64-NEXT: vblendps {{.*#+}} xmm3 = xmm2[0],xmm1[1,2,3] +; AVX-64-NEXT: vmovss {{.*#+}} xmm3 = xmm2[0],xmm1[1,2,3] ; AVX-64-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 ; AVX-64-NEXT: vinsertps {{.*#+}} xmm3 = xmm1[0,1,2],xmm2[0] ; AVX-64-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[2,3] diff --git a/llvm/test/CodeGen/X86/buildvec-extract.ll b/llvm/test/CodeGen/X86/buildvec-extract.ll index 545c57fed4b2c..9d856ed7647ca 100644 --- a/llvm/test/CodeGen/X86/buildvec-extract.ll +++ b/llvm/test/CodeGen/X86/buildvec-extract.ll @@ -42,7 +42,7 @@ define <2 x i64> @extract0_i32_zext_insert0_i64_zero(<4 x i32> %x) { ; AVX-LABEL: extract0_i32_zext_insert0_i64_zero: ; AVX: # %bb.0: ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq %e = extractelement <4 x i32> %x, i32 0 %z = zext i32 %e to i64 @@ -85,7 +85,7 @@ define <2 x i64> @extract1_i32_zext_insert0_i64_zero(<4 x i32> %x) { ; AVX: # %bb.0: ; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,1,1,1] ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq %e = extractelement <4 x i32> %x, i32 1 %z = zext i32 %e to i64 @@ -130,7 +130,7 @@ define <2 x i64> @extract2_i32_zext_insert0_i64_zero(<4 x i32> %x) { ; AVX: # %bb.0: ; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[2,3,2,3] ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq %e = extractelement <4 x i32> %x, i32 2 %z = zext i32 %e to i64 diff --git a/llvm/test/CodeGen/X86/canonicalize-vars-f16-type.ll b/llvm/test/CodeGen/X86/canonicalize-vars-f16-type.ll index 556b0deaf4c83..8b3aa2964db02 100644 --- a/llvm/test/CodeGen/X86/canonicalize-vars-f16-type.ll +++ b/llvm/test/CodeGen/X86/canonicalize-vars-f16-type.ll @@ -51,7 +51,7 @@ define void @v_test_canonicalize__half(half addrspace(1)* %out) nounwind { ; AVX512-NEXT: vcvtph2ps %xmm1, %xmm1 ; AVX512-NEXT: vmulss %xmm0, %xmm1, %xmm0 ; AVX512-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX512-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX512-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX512-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX512-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX512-NEXT: retq @@ -149,7 +149,7 @@ define half @complex_canonicalize_fmul_half(half %a, half %b) nounwind { ; AVX512-NEXT: vcvtph2ps %xmm2, %xmm2 ; AVX512-NEXT: vmulss %xmm2, %xmm0, %xmm0 ; AVX512-NEXT: vxorps %xmm2, %xmm2, %xmm2 -; AVX512-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3] +; AVX512-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3] ; AVX512-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX512-NEXT: vcvtph2ps %xmm0, %xmm0 ; AVX512-NEXT: vsubss %xmm1, %xmm0, %xmm0 @@ -235,12 +235,12 @@ define void @v_test_canonicalize_v2half(<2 x half> addrspace(1)* %out) nounwind ; AVX512-NEXT: vcvtph2ps %xmm2, %xmm2 ; AVX512-NEXT: vmulss %xmm1, %xmm2, %xmm2 ; AVX512-NEXT: vxorps %xmm3, %xmm3, %xmm3 -; AVX512-NEXT: vblendps {{.*#+}} xmm2 = xmm2[0],xmm3[1,2,3] +; AVX512-NEXT: vmovss {{.*#+}} xmm2 = xmm2[0],xmm3[1,2,3] ; AVX512-NEXT: vcvtps2ph $4, %xmm2, %xmm2 ; AVX512-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero ; AVX512-NEXT: vcvtph2ps %xmm0, %xmm0 ; AVX512-NEXT: vmulss %xmm1, %xmm0, %xmm0 -; AVX512-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm3[1,2,3] +; AVX512-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm3[1,2,3] ; AVX512-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX512-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] ; AVX512-NEXT: vmovd %xmm0, (%rdi) diff --git a/llvm/test/CodeGen/X86/coalesce_commute_movsd.ll b/llvm/test/CodeGen/X86/coalesce_commute_movsd.ll index b42fd957d7f4f..086df87d1d5ff 100644 --- a/llvm/test/CodeGen/X86/coalesce_commute_movsd.ll +++ b/llvm/test/CodeGen/X86/coalesce_commute_movsd.ll @@ -44,12 +44,12 @@ define <4 x float> @insert_f32(float %a0, <4 x float> %a1) { ; ; AVX-LABEL: insert_f32: ; AVX: # %bb.0: -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq ; ; AVX512-LABEL: insert_f32: ; AVX512: # %bb.0: -; AVX512-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX512-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX512-NEXT: retq %1 = insertelement <4 x float> %a1, float %a0, i32 0 ret <4 x float> %1 diff --git a/llvm/test/CodeGen/X86/combine-and.ll b/llvm/test/CodeGen/X86/combine-and.ll index e5594dc9c5e3c..173457ff46677 100644 --- a/llvm/test/CodeGen/X86/combine-and.ll +++ b/llvm/test/CodeGen/X86/combine-and.ll @@ -37,7 +37,7 @@ define <4 x i32> @test1(<4 x i32> %A) { ; AVX-LABEL: test1: ; AVX: # %bb.0: ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq %1 = and <4 x i32> %A, ret <4 x i32> %1 @@ -195,7 +195,7 @@ define <4 x i32> @test11(<4 x i32> %A) { ; AVX-LABEL: test11: ; AVX: # %bb.0: ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; AVX-NEXT: retq %1 = and <4 x i32> %A, ret <4 x i32> %1 diff --git a/llvm/test/CodeGen/X86/combine-or-shuffle.ll b/llvm/test/CodeGen/X86/combine-or-shuffle.ll index 95b5fcf8eac52..137c3d9dec7bd 100644 --- a/llvm/test/CodeGen/X86/combine-or-shuffle.ll +++ b/llvm/test/CodeGen/X86/combine-or-shuffle.ll @@ -86,10 +86,20 @@ define <4 x i32> @test4(<4 x i32> %a, <4 x i32> %b) { ; SSE4-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; SSE4-NEXT: retq ; -; AVX-LABEL: test4: -; AVX: # %bb.0: -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] -; AVX-NEXT: retq +; AVX1-LABEL: test4: +; AVX1: # %bb.0: +; AVX1-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX1-NEXT: retq +; +; AVX2-LABEL: test4: +; AVX2: # %bb.0: +; AVX2-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX2-NEXT: retq +; +; AVX512-LABEL: test4: +; AVX512: # %bb.0: +; AVX512-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX512-NEXT: retq %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32> %or = or <4 x i32> %shuf1, %shuf2 @@ -108,10 +118,20 @@ define <4 x i32> @test5(<4 x i32> %a, <4 x i32> %b) { ; SSE4-NEXT: blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; SSE4-NEXT: retq ; -; AVX-LABEL: test5: -; AVX: # %bb.0: -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] -; AVX-NEXT: retq +; AVX1-LABEL: test5: +; AVX1: # %bb.0: +; AVX1-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX1-NEXT: retq +; +; AVX2-LABEL: test5: +; AVX2: # %bb.0: +; AVX2-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX2-NEXT: retq +; +; AVX512-LABEL: test5: +; AVX512: # %bb.0: +; AVX512-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX512-NEXT: retq %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32> %or = or <4 x i32> %shuf1, %shuf2 @@ -241,10 +261,20 @@ define <4 x i32> @test11(<4 x i32> %a, <4 x i32> %b) { ; SSE4-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; SSE4-NEXT: retq ; -; AVX-LABEL: test11: -; AVX: # %bb.0: -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] -; AVX-NEXT: retq +; AVX1-LABEL: test11: +; AVX1: # %bb.0: +; AVX1-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX1-NEXT: retq +; +; AVX2-LABEL: test11: +; AVX2: # %bb.0: +; AVX2-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX2-NEXT: retq +; +; AVX512-LABEL: test11: +; AVX512: # %bb.0: +; AVX512-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX512-NEXT: retq %and1 = and <4 x i32> %a, %and2 = and <4 x i32> %b, %or = or <4 x i32> %and1, %and2 @@ -263,10 +293,20 @@ define <4 x i32> @test12(<4 x i32> %a, <4 x i32> %b) { ; SSE4-NEXT: blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; SSE4-NEXT: retq ; -; AVX-LABEL: test12: -; AVX: # %bb.0: -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] -; AVX-NEXT: retq +; AVX1-LABEL: test12: +; AVX1: # %bb.0: +; AVX1-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX1-NEXT: retq +; +; AVX2-LABEL: test12: +; AVX2: # %bb.0: +; AVX2-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX2-NEXT: retq +; +; AVX512-LABEL: test12: +; AVX512: # %bb.0: +; AVX512-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX512-NEXT: retq %and1 = and <4 x i32> %a, %and2 = and <4 x i32> %b, %or = or <4 x i32> %and1, %and2 @@ -395,18 +435,18 @@ define <4 x i32> @test18(<4 x i32> %a, <4 x i32> %b) { ; AVX1-LABEL: test18: ; AVX1: # %bb.0: ; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3] +; AVX1-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3] ; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,0,1,1] -; AVX1-NEXT: vblendps {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3] +; AVX1-NEXT: vmovss {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3] ; AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0 ; AVX1-NEXT: retq ; ; AVX2-LABEL: test18: ; AVX2: # %bb.0: ; AVX2-NEXT: vxorps %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3] +; AVX2-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3] ; AVX2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,0,1,1] -; AVX2-NEXT: vblendps {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3] +; AVX2-NEXT: vmovss {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3] ; AVX2-NEXT: vorps %xmm1, %xmm0, %xmm0 ; AVX2-NEXT: retq ; diff --git a/llvm/test/CodeGen/X86/fminimumnum-fmaximumnum.ll b/llvm/test/CodeGen/X86/fminimumnum-fmaximumnum.ll index 33bc93d0fe4db..95d350d45d901 100644 --- a/llvm/test/CodeGen/X86/fminimumnum-fmaximumnum.ll +++ b/llvm/test/CodeGen/X86/fminimumnum-fmaximumnum.ll @@ -1343,7 +1343,7 @@ define <2 x double> @test_fminimumnum_vector_nan(<2 x double> %x) { ; AVX-NEXT: vxorpd %xmm1, %xmm1, %xmm1 ; AVX-NEXT: vmovhpd {{.*#+}} xmm2 = xmm1[0],mem[0] ; AVX-NEXT: vminpd %xmm0, %xmm2, %xmm0 -; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1] +; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] ; AVX-NEXT: retq ; ; AVX10_2-LABEL: test_fminimumnum_vector_nan: diff --git a/llvm/test/CodeGen/X86/fmsubadd-combine.ll b/llvm/test/CodeGen/X86/fmsubadd-combine.ll index ddf51b858cdd8..674a1d5ad779b 100644 --- a/llvm/test/CodeGen/X86/fmsubadd-combine.ll +++ b/llvm/test/CodeGen/X86/fmsubadd-combine.ll @@ -12,7 +12,7 @@ define <2 x double> @mul_subadd_pd128(<2 x double> %A, <2 x double> %B, <2 x dou ; NOFMA-NEXT: vmulpd %xmm1, %xmm0, %xmm0 ; NOFMA-NEXT: vsubpd %xmm2, %xmm0, %xmm1 ; NOFMA-NEXT: vaddpd %xmm2, %xmm0, %xmm0 -; NOFMA-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] +; NOFMA-NEXT: vmovsd {{.*#+}} xmm0 = xmm0[0],xmm1[1] ; NOFMA-NEXT: retq ; ; FMA3-LABEL: mul_subadd_pd128: @@ -191,7 +191,7 @@ define <2 x double> @mul_subadd_bad_commute(<2 x double> %A, <2 x double> %B, <2 ; CHECK-NEXT: vmulpd %xmm1, %xmm0, %xmm0 ; CHECK-NEXT: vsubpd %xmm0, %xmm2, %xmm1 ; CHECK-NEXT: vaddpd %xmm2, %xmm0, %xmm0 -; CHECK-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] +; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = xmm0[0],xmm1[1] ; CHECK-NEXT: retq entry: %AB = fmul <2 x double> %A, %B diff --git a/llvm/test/CodeGen/X86/fp-strict-scalar-fp16.ll b/llvm/test/CodeGen/X86/fp-strict-scalar-fp16.ll index fbc798d8bbe48..b013ddad19a95 100644 --- a/llvm/test/CodeGen/X86/fp-strict-scalar-fp16.ll +++ b/llvm/test/CodeGen/X86/fp-strict-scalar-fp16.ll @@ -44,7 +44,7 @@ define half @fadd_f16(half %a, half %b) nounwind strictfp { ; AVX-NEXT: vcvtph2ps %xmm1, %xmm1 ; AVX-NEXT: vaddss %xmm0, %xmm1, %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: retq ; @@ -92,7 +92,7 @@ define half @fsub_f16(half %a, half %b) nounwind strictfp { ; AVX-NEXT: vcvtph2ps %xmm1, %xmm1 ; AVX-NEXT: vsubss %xmm0, %xmm1, %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: retq ; @@ -140,7 +140,7 @@ define half @fmul_f16(half %a, half %b) nounwind strictfp { ; AVX-NEXT: vcvtph2ps %xmm1, %xmm1 ; AVX-NEXT: vmulss %xmm0, %xmm1, %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: retq ; @@ -188,7 +188,7 @@ define half @fdiv_f16(half %a, half %b) nounwind strictfp { ; AVX-NEXT: vcvtph2ps %xmm1, %xmm1 ; AVX-NEXT: vdivss %xmm0, %xmm1, %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: retq ; @@ -400,7 +400,7 @@ define void @fsqrt_f16(ptr %a) nounwind strictfp { ; AVX-NEXT: vcvtph2ps %xmm0, %xmm0 ; AVX-NEXT: vsqrtss %xmm0, %xmm0, %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX-NEXT: retq @@ -469,7 +469,7 @@ define half @fma_f16(half %a, half %b, half %c) nounwind strictfp { ; F16C-NEXT: vcvtph2ps %xmm0, %xmm0 ; F16C-NEXT: callq fmaf@PLT ; F16C-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; F16C-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; F16C-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; F16C-NEXT: popq %rax ; F16C-NEXT: retq @@ -490,7 +490,7 @@ define half @fma_f16(half %a, half %b, half %c) nounwind strictfp { ; AVX512-NEXT: vcvtph2ps %xmm2, %xmm2 ; AVX512-NEXT: vfmadd213ss {{.*#+}} xmm2 = (xmm1 * xmm2) + xmm0 ; AVX512-NEXT: vxorps %xmm0, %xmm0, %xmm0 -; AVX512-NEXT: vblendps {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3] +; AVX512-NEXT: vmovss {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3] ; AVX512-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX512-NEXT: retq ; diff --git a/llvm/test/CodeGen/X86/fp-strict-scalar-inttofp-fp16.ll b/llvm/test/CodeGen/X86/fp-strict-scalar-inttofp-fp16.ll index 7c0386f0e784e..cb2f2473f5ead 100644 --- a/llvm/test/CodeGen/X86/fp-strict-scalar-inttofp-fp16.ll +++ b/llvm/test/CodeGen/X86/fp-strict-scalar-inttofp-fp16.ll @@ -35,7 +35,7 @@ define half @sitofp_i1tof16(i1 %x) #0 { ; AVX-NEXT: movsbl %dil, %eax ; AVX-NEXT: vcvtsi2ss %eax, %xmm0, %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: retq ; @@ -76,7 +76,7 @@ define half @sitofp_i8tof16(i8 %x) #0 { ; AVX-NEXT: movsbl %dil, %eax ; AVX-NEXT: vcvtsi2ss %eax, %xmm0, %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: retq ; @@ -112,7 +112,7 @@ define half @sitofp_i16tof16(i16 %x) #0 { ; AVX-NEXT: movswl %di, %eax ; AVX-NEXT: vcvtsi2ss %eax, %xmm0, %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: retq ; @@ -146,7 +146,7 @@ define half @sitofp_i32tof16(i32 %x) #0 { ; AVX: # %bb.0: ; AVX-NEXT: vcvtsi2ss %edi, %xmm0, %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: retq ; @@ -178,7 +178,7 @@ define half @sitofp_i64tof16(i64 %x) #0 { ; AVX: # %bb.0: ; AVX-NEXT: vcvtsi2ss %rdi, %xmm0, %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: retq ; @@ -213,7 +213,7 @@ define half @uitofp_i1tof16(i1 %x) #0 { ; AVX-NEXT: andl $1, %edi ; AVX-NEXT: vcvtsi2ss %edi, %xmm0, %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: retq ; @@ -251,7 +251,7 @@ define half @uitofp_i8tof16(i8 %x) #0 { ; AVX-NEXT: movzbl %dil, %eax ; AVX-NEXT: vcvtsi2ss %eax, %xmm0, %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: retq ; @@ -287,7 +287,7 @@ define half @uitofp_i16tof16(i16 %x) #0 { ; AVX-NEXT: movzwl %di, %eax ; AVX-NEXT: vcvtsi2ss %eax, %xmm0, %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: retq ; @@ -323,7 +323,7 @@ define half @uitofp_i32tof16(i32 %x) #0 { ; F16C-NEXT: movl %edi, %eax ; F16C-NEXT: vcvtsi2ss %rax, %xmm0, %xmm0 ; F16C-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; F16C-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; F16C-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; F16C-NEXT: retq ; @@ -331,7 +331,7 @@ define half @uitofp_i32tof16(i32 %x) #0 { ; AVX512: # %bb.0: ; AVX512-NEXT: vcvtusi2ss %edi, %xmm0, %xmm0 ; AVX512-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX512-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX512-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX512-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX512-NEXT: retq ; @@ -387,7 +387,7 @@ define half @uitofp_i64tof16(i64 %x) #0 { ; F16C-NEXT: vaddss %xmm0, %xmm0, %xmm0 ; F16C-NEXT: .LBB9_2: ; F16C-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; F16C-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; F16C-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; F16C-NEXT: retq ; @@ -395,7 +395,7 @@ define half @uitofp_i64tof16(i64 %x) #0 { ; AVX512: # %bb.0: ; AVX512-NEXT: vcvtusi2ss %rdi, %xmm0, %xmm0 ; AVX512-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX512-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX512-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX512-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX512-NEXT: retq ; diff --git a/llvm/test/CodeGen/X86/fp-strict-scalar-round-fp16.ll b/llvm/test/CodeGen/X86/fp-strict-scalar-round-fp16.ll index 1ab97dafb8514..1f9c9edfa2a2d 100644 --- a/llvm/test/CodeGen/X86/fp-strict-scalar-round-fp16.ll +++ b/llvm/test/CodeGen/X86/fp-strict-scalar-round-fp16.ll @@ -31,7 +31,7 @@ define half @fceil32(half %f) #0 { ; AVX-NEXT: vcvtph2ps %xmm0, %xmm0 ; AVX-NEXT: vroundss $10, %xmm0, %xmm0, %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: retq ; @@ -67,7 +67,7 @@ define half @ffloor32(half %f) #0 { ; AVX-NEXT: vcvtph2ps %xmm0, %xmm0 ; AVX-NEXT: vroundss $9, %xmm0, %xmm0, %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: retq ; @@ -103,7 +103,7 @@ define half @ftrunc32(half %f) #0 { ; AVX-NEXT: vcvtph2ps %xmm0, %xmm0 ; AVX-NEXT: vroundss $11, %xmm0, %xmm0, %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: retq ; @@ -139,7 +139,7 @@ define half @frint32(half %f) #0 { ; AVX-NEXT: vcvtph2ps %xmm0, %xmm0 ; AVX-NEXT: vroundss $4, %xmm0, %xmm0, %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: retq ; @@ -176,7 +176,7 @@ define half @fnearbyint32(half %f) #0 { ; AVX-NEXT: vcvtph2ps %xmm0, %xmm0 ; AVX-NEXT: vroundss $12, %xmm0, %xmm0, %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: retq ; @@ -213,7 +213,7 @@ define half @froundeven16(half %f) #0 { ; AVX-NEXT: vcvtph2ps %xmm0, %xmm0 ; AVX-NEXT: vroundss $8, %xmm0, %xmm0, %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: retq ; @@ -251,7 +251,7 @@ define half @fround16(half %f) #0 { ; AVX-NEXT: vcvtph2ps %xmm0, %xmm0 ; AVX-NEXT: callq roundf@PLT ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; AVX-NEXT: popq %rax ; AVX-NEXT: retq diff --git a/llvm/test/CodeGen/X86/half-constrained.ll b/llvm/test/CodeGen/X86/half-constrained.ll index f1874cc03000a..d5f2060ca20e3 100644 --- a/llvm/test/CodeGen/X86/half-constrained.ll +++ b/llvm/test/CodeGen/X86/half-constrained.ll @@ -194,7 +194,7 @@ define void @float_to_half(float %0) strictfp { ; X64-F16C-LABEL: float_to_half: ; X64-F16C: # %bb.0: ; X64-F16C-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; X64-F16C-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; X64-F16C-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; X64-F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; X64-F16C-NEXT: movq a@GOTPCREL(%rip), %rax ; X64-F16C-NEXT: vpextrw $0, %xmm0, (%rax) @@ -350,7 +350,7 @@ define void @add() strictfp { ; X86-F16C-NEXT: vcvtph2ps %xmm1, %xmm1 ; X86-F16C-NEXT: vaddss %xmm1, %xmm0, %xmm0 ; X86-F16C-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; X86-F16C-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; X86-F16C-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; X86-F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; X86-F16C-NEXT: vpextrw $0, %xmm0, c ; X86-F16C-NEXT: retl @@ -387,7 +387,7 @@ define void @add() strictfp { ; X64-F16C-NEXT: vcvtph2ps %xmm1, %xmm1 ; X64-F16C-NEXT: vaddss %xmm1, %xmm0, %xmm0 ; X64-F16C-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; X64-F16C-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; X64-F16C-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; X64-F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; X64-F16C-NEXT: movq c@GOTPCREL(%rip), %rax ; X64-F16C-NEXT: vpextrw $0, %xmm0, (%rax) diff --git a/llvm/test/CodeGen/X86/half-darwin.ll b/llvm/test/CodeGen/X86/half-darwin.ll index 3cbf5c11235ea..8765f7dbe6d34 100644 --- a/llvm/test/CodeGen/X86/half-darwin.ll +++ b/llvm/test/CodeGen/X86/half-darwin.ll @@ -105,7 +105,7 @@ define void @strict_truncsfhf(float %in, ptr %ptr) nounwind strictfp { ; CHECK-F16C-LABEL: strict_truncsfhf: ; CHECK-F16C: ## %bb.0: ; CHECK-F16C-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; CHECK-F16C-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; CHECK-F16C-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; CHECK-F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0 ; CHECK-F16C-NEXT: vpextrw $0, %xmm0, (%rdi) ; CHECK-F16C-NEXT: retq diff --git a/llvm/test/CodeGen/X86/insertelement-zero.ll b/llvm/test/CodeGen/X86/insertelement-zero.ll index 952940d141808..31551360be483 100644 --- a/llvm/test/CodeGen/X86/insertelement-zero.ll +++ b/llvm/test/CodeGen/X86/insertelement-zero.ll @@ -508,8 +508,8 @@ define <8 x float> @PR41512_v8f32(float %x, float %y) { ; AVX-LABEL: PR41512_v8f32: ; AVX: # %bb.0: ; AVX-NEXT: vxorps %xmm2, %xmm2, %xmm2 -; AVX-NEXT: vblendps {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3] -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3] ; AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 ; AVX-NEXT: retq %ins1 = insertelement <8 x float> zeroinitializer, float %x, i32 0 diff --git a/llvm/test/CodeGen/X86/masked_expandload.ll b/llvm/test/CodeGen/X86/masked_expandload.ll index 4c5b67962a58b..234c7190256c4 100644 --- a/llvm/test/CodeGen/X86/masked_expandload.ll +++ b/llvm/test/CodeGen/X86/masked_expandload.ll @@ -204,7 +204,7 @@ define <4 x double> @expandload_v4f64_v4i64(ptr %base, <4 x double> %src0, <4 x ; AVX1-NEXT: retq ; AVX1-NEXT: LBB1_1: ## %cond.load ; AVX1-NEXT: vmovsd (%rdi), %xmm1 ## xmm1 = mem[0],zero -; AVX1-NEXT: vblendpd {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3] +; AVX1-NEXT: vmovsd {{.*#+}} ymm0 = ymm1[0],ymm0[1] ; AVX1-NEXT: addq $8, %rdi ; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je LBB1_4 @@ -245,7 +245,7 @@ define <4 x double> @expandload_v4f64_v4i64(ptr %base, <4 x double> %src0, <4 x ; AVX2-NEXT: retq ; AVX2-NEXT: LBB1_1: ## %cond.load ; AVX2-NEXT: vmovsd (%rdi), %xmm1 ## xmm1 = mem[0],zero -; AVX2-NEXT: vblendpd {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3] +; AVX2-NEXT: vmovsd {{.*#+}} ymm0 = ymm1[0],ymm0[1] ; AVX2-NEXT: addq $8, %rdi ; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je LBB1_4 @@ -1120,7 +1120,7 @@ define <2 x float> @expandload_v2f32_v2i1(ptr %base, <2 x float> %src0, <2 x i32 ; AVX1OR2-NEXT: retq ; AVX1OR2-NEXT: LBB4_1: ## %cond.load ; AVX1OR2-NEXT: vmovss (%rdi), %xmm1 ## xmm1 = mem[0],zero,zero,zero -; AVX1OR2-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX1OR2-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; AVX1OR2-NEXT: addq $4, %rdi ; AVX1OR2-NEXT: testb $2, %al ; AVX1OR2-NEXT: je LBB4_4 @@ -2111,7 +2111,7 @@ define <32 x float> @expandload_v32f32_v32i32(ptr %base, <32 x float> %src0, <32 ; AVX1-NEXT: retq ; AVX1-NEXT: LBB8_1: ## %cond.load ; AVX1-NEXT: vmovss (%rdi), %xmm4 ## xmm4 = mem[0],zero,zero,zero -; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm4[0],ymm0[1,2,3,4,5,6,7] +; AVX1-NEXT: vmovss {{.*#+}} ymm0 = ymm4[0],ymm0[1,2,3] ; AVX1-NEXT: addq $4, %rdi ; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je LBB8_4 @@ -2159,7 +2159,7 @@ define <32 x float> @expandload_v32f32_v32i32(ptr %base, <32 x float> %src0, <32 ; AVX1-NEXT: je LBB8_18 ; AVX1-NEXT: LBB8_17: ## %cond.load29 ; AVX1-NEXT: vmovss (%rdi), %xmm4 ## xmm4 = mem[0],zero,zero,zero -; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm4[0],ymm1[1,2,3,4,5,6,7] +; AVX1-NEXT: vmovss {{.*#+}} ymm1 = ymm4[0],ymm1[1,2,3] ; AVX1-NEXT: addq $4, %rdi ; AVX1-NEXT: testl $512, %eax ## imm = 0x200 ; AVX1-NEXT: je LBB8_20 @@ -2207,7 +2207,7 @@ define <32 x float> @expandload_v32f32_v32i32(ptr %base, <32 x float> %src0, <32 ; AVX1-NEXT: je LBB8_34 ; AVX1-NEXT: LBB8_33: ## %cond.load61 ; AVX1-NEXT: vmovss (%rdi), %xmm4 ## xmm4 = mem[0],zero,zero,zero -; AVX1-NEXT: vblendps {{.*#+}} ymm2 = ymm4[0],ymm2[1,2,3,4,5,6,7] +; AVX1-NEXT: vmovss {{.*#+}} ymm2 = ymm4[0],ymm2[1,2,3] ; AVX1-NEXT: addq $4, %rdi ; AVX1-NEXT: testl $131072, %eax ## imm = 0x20000 ; AVX1-NEXT: je LBB8_36 @@ -2255,7 +2255,7 @@ define <32 x float> @expandload_v32f32_v32i32(ptr %base, <32 x float> %src0, <32 ; AVX1-NEXT: je LBB8_50 ; AVX1-NEXT: LBB8_49: ## %cond.load93 ; AVX1-NEXT: vmovss (%rdi), %xmm4 ## xmm4 = mem[0],zero,zero,zero -; AVX1-NEXT: vblendps {{.*#+}} ymm3 = ymm4[0],ymm3[1,2,3,4,5,6,7] +; AVX1-NEXT: vmovss {{.*#+}} ymm3 = ymm4[0],ymm3[1,2,3] ; AVX1-NEXT: addq $4, %rdi ; AVX1-NEXT: testl $33554432, %eax ## imm = 0x2000000 ; AVX1-NEXT: je LBB8_52 diff --git a/llvm/test/CodeGen/X86/masked_gather.ll b/llvm/test/CodeGen/X86/masked_gather.ll index 559a7ec0930b9..324a371632c45 100644 --- a/llvm/test/CodeGen/X86/masked_gather.ll +++ b/llvm/test/CodeGen/X86/masked_gather.ll @@ -65,7 +65,7 @@ define <4 x float> @gather_v4f32_ptr_v4i32(<4 x ptr> %ptr, <4 x i32> %trigger, < ; AVX1-NEXT: # %bb.1: # %cond.load ; AVX1-NEXT: vmovq %xmm0, %rcx ; AVX1-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero -; AVX1-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] +; AVX1-NEXT: vmovss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] ; AVX1-NEXT: .LBB0_2: # %else ; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB0_4 @@ -105,7 +105,7 @@ define <4 x float> @gather_v4f32_ptr_v4i32(<4 x ptr> %ptr, <4 x i32> %trigger, < ; AVX2-NEXT: # %bb.1: # %cond.load ; AVX2-NEXT: vmovq %xmm0, %rcx ; AVX2-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero -; AVX2-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] +; AVX2-NEXT: vmovss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] ; AVX2-NEXT: .LBB0_2: # %else ; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB0_4 @@ -254,7 +254,7 @@ define <4 x float> @gather_v4f32_v4i32_v4i32(ptr %base, <4 x i32> %idx, <4 x i32 ; AVX1-NEXT: # %bb.1: # %cond.load ; AVX1-NEXT: vmovq %xmm0, %rcx ; AVX1-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero -; AVX1-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] +; AVX1-NEXT: vmovss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] ; AVX1-NEXT: .LBB1_2: # %else ; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB1_4 @@ -299,7 +299,7 @@ define <4 x float> @gather_v4f32_v4i32_v4i32(ptr %base, <4 x i32> %idx, <4 x i32 ; AVX2-NEXT: # %bb.1: # %cond.load ; AVX2-NEXT: vmovq %xmm0, %rcx ; AVX2-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero -; AVX2-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] +; AVX2-NEXT: vmovss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] ; AVX2-NEXT: .LBB1_2: # %else ; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB1_4 @@ -451,7 +451,7 @@ define <4 x float> @gather_v4f32_v4i64_v4i32(ptr %base, <4 x i64> %idx, <4 x i32 ; AVX1-NEXT: # %bb.1: # %cond.load ; AVX1-NEXT: vmovq %xmm0, %rcx ; AVX1-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero -; AVX1-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] +; AVX1-NEXT: vmovss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] ; AVX1-NEXT: .LBB2_2: # %else ; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB2_4 @@ -495,7 +495,7 @@ define <4 x float> @gather_v4f32_v4i64_v4i32(ptr %base, <4 x i64> %idx, <4 x i32 ; AVX2-NEXT: # %bb.1: # %cond.load ; AVX2-NEXT: vmovq %xmm0, %rcx ; AVX2-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero -; AVX2-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] +; AVX2-NEXT: vmovss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] ; AVX2-NEXT: .LBB2_2: # %else ; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB2_4 diff --git a/llvm/test/CodeGen/X86/masked_gather_scatter.ll b/llvm/test/CodeGen/X86/masked_gather_scatter.ll index af018d83d520e..4e6f666fa05de 100644 --- a/llvm/test/CodeGen/X86/masked_gather_scatter.ll +++ b/llvm/test/CodeGen/X86/masked_gather_scatter.ll @@ -3481,7 +3481,7 @@ define <2 x float> @large_index(ptr %base, <2 x i128> %ind, <2 x i1> %mask, <2 x ; X86-SKX-NEXT: .LBB47_1: # %cond.load ; X86-SKX-NEXT: vmovd %xmm0, %ecx ; X86-SKX-NEXT: vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero -; X86-SKX-NEXT: vblendps {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3] +; X86-SKX-NEXT: vmovss {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3] ; X86-SKX-NEXT: testb $2, %al ; X86-SKX-NEXT: je .LBB47_4 ; X86-SKX-NEXT: .LBB47_3: # %cond.load1 diff --git a/llvm/test/CodeGen/X86/masked_load.ll b/llvm/test/CodeGen/X86/masked_load.ll index 89459a2d10177..e2e26da95b874 100644 --- a/llvm/test/CodeGen/X86/masked_load.ll +++ b/llvm/test/CodeGen/X86/masked_load.ll @@ -6424,7 +6424,7 @@ define <4 x i32> @mload_constmask_v4i32(ptr %addr, <4 x i32> %dst) { ; AVX1: ## %bb.0: ; AVX1-NEXT: vmovaps {{.*#+}} xmm1 = [0,4294967295,4294967295,4294967295] ; AVX1-NEXT: vmaskmovps (%rdi), %xmm1, %xmm1 -; AVX1-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX1-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX1-NEXT: retq ; ; AVX2-LABEL: mload_constmask_v4i32: diff --git a/llvm/test/CodeGen/X86/oddsubvector.ll b/llvm/test/CodeGen/X86/oddsubvector.ll index a1da40e7e7655..3500a24dfed18 100644 --- a/llvm/test/CodeGen/X86/oddsubvector.ll +++ b/llvm/test/CodeGen/X86/oddsubvector.ll @@ -235,7 +235,7 @@ define void @PR42833() { ; AVX1-NEXT: vmovdqa c+144(%rip), %xmm3 ; AVX1-NEXT: vpaddd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 -; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3,4,5,6,7] +; AVX1-NEXT: vmovss {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3] ; AVX1-NEXT: vmovdqa d+144(%rip), %xmm2 ; AVX1-NEXT: vpsubd c+144(%rip), %xmm2, %xmm2 ; AVX1-NEXT: vmovups %ymm0, c+128(%rip) @@ -317,7 +317,7 @@ define void @PR42833() { ; XOP-NEXT: vmovdqa c+144(%rip), %xmm3 ; XOP-NEXT: vpaddd %xmm3, %xmm3, %xmm3 ; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 -; XOP-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3,4,5,6,7] +; XOP-NEXT: vmovss {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3] ; XOP-NEXT: vmovdqa d+144(%rip), %xmm2 ; XOP-NEXT: vpsubd c+144(%rip), %xmm2, %xmm2 ; XOP-NEXT: vmovups %ymm0, c+128(%rip) diff --git a/llvm/test/CodeGen/X86/pr40730.ll b/llvm/test/CodeGen/X86/pr40730.ll index 164bf203d0545..304d071e5d6e5 100644 --- a/llvm/test/CodeGen/X86/pr40730.ll +++ b/llvm/test/CodeGen/X86/pr40730.ll @@ -5,7 +5,7 @@ define <8 x i32> @shuffle_v8i32_0dcd3f14(<8 x i32> %a, <8 x i32> %b) { ; CHECK-LABEL: shuffle_v8i32_0dcd3f14: ; CHECK: # %bb.0: ; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm2 -; CHECK-NEXT: vblendps {{.*#+}} xmm2 = xmm2[0],xmm0[1,2,3] +; CHECK-NEXT: vmovss {{.*#+}} xmm2 = xmm2[0],xmm0[1,2,3] ; CHECK-NEXT: vshufps {{.*#+}} xmm2 = xmm2[3,1,1,0] ; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 ; CHECK-NEXT: vperm2f128 {{.*#+}} ymm1 = ymm1[2,3,2,3] @@ -26,7 +26,7 @@ define <8 x i32> @shuffle_v8i32_0dcd3f14_constant(<8 x i32> %a0) { ; CHECK-LABEL: shuffle_v8i32_0dcd3f14_constant: ; CHECK: # %bb.0: ; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm1 -; CHECK-NEXT: vblendps {{.*#+}} xmm1 = xmm1[0],xmm0[1,2,3] +; CHECK-NEXT: vmovss {{.*#+}} xmm1 = xmm1[0],xmm0[1,2,3] ; CHECK-NEXT: vshufps {{.*#+}} xmm1 = xmm1[3,1,1,0] ; CHECK-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 ; CHECK-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],mem[1,2,3],ymm0[4],mem[5],ymm0[6,7] diff --git a/llvm/test/CodeGen/X86/scalarize-fp.ll b/llvm/test/CodeGen/X86/scalarize-fp.ll index ea9b69f8f5b80..ae24d3487c4b1 100644 --- a/llvm/test/CodeGen/X86/scalarize-fp.ll +++ b/llvm/test/CodeGen/X86/scalarize-fp.ll @@ -911,7 +911,7 @@ define <4 x float> @merge_fcmp_cmpeqss_v4f32(<4 x float> %x, <4 x float> %y) { ; AVX1-LABEL: merge_fcmp_cmpeqss_v4f32: ; AVX1: # %bb.0: ; AVX1-NEXT: vcmpeqss %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX1-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; AVX1-NEXT: retq ; ; AVX512-LABEL: merge_fcmp_cmpeqss_v4f32: diff --git a/llvm/test/CodeGen/X86/sse-insertelt-from-mem.ll b/llvm/test/CodeGen/X86/sse-insertelt-from-mem.ll index f0af8fc29969b..5ae9055835716 100644 --- a/llvm/test/CodeGen/X86/sse-insertelt-from-mem.ll +++ b/llvm/test/CodeGen/X86/sse-insertelt-from-mem.ll @@ -22,7 +22,7 @@ define <4 x float> @insert_f32_firstelt(<4 x float> %x, ptr %s.addr) { ; AVX-LABEL: insert_f32_firstelt: ; AVX: # %bb.0: ; AVX-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; AVX-NEXT: retq %s = load float, ptr %s.addr %i0 = insertelement <4 x float> %x, float %s, i32 0 diff --git a/llvm/test/CodeGen/X86/sse-insertelt.ll b/llvm/test/CodeGen/X86/sse-insertelt.ll index 34de7e65465d1..1e4fe81abc136 100644 --- a/llvm/test/CodeGen/X86/sse-insertelt.ll +++ b/llvm/test/CodeGen/X86/sse-insertelt.ll @@ -19,7 +19,7 @@ define <4 x float> @insert_f32_firstelt(<4 x float> %x, float %s) { ; ; AVX-LABEL: insert_f32_firstelt: ; AVX: # %bb.0: -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; AVX-NEXT: retq %i0 = insertelement <4 x float> %x, float %s, i32 0 ret <4 x float> %i0 diff --git a/llvm/test/CodeGen/X86/sse-intrinsics-fast-isel.ll b/llvm/test/CodeGen/X86/sse-intrinsics-fast-isel.ll index b1f9872f7b6eb..2e2e78a6da51e 100644 --- a/llvm/test/CodeGen/X86/sse-intrinsics-fast-isel.ll +++ b/llvm/test/CodeGen/X86/sse-intrinsics-fast-isel.ll @@ -190,7 +190,7 @@ define <4 x float> @test_mm_cmpge_ss(<4 x float> %a0, <4 x float> %a1) nounwind ; AVX-LABEL: test_mm_cmpge_ss: ; AVX: # %bb.0: ; AVX-NEXT: vcmpless %xmm0, %xmm1, %xmm1 # encoding: [0xc5,0xf2,0xc2,0xc8,0x02] -; AVX-NEXT: vblendps $1, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0x79,0x0c,0xc1,0x01] +; AVX-NEXT: vmovss %xmm1, %xmm0, %xmm0 # encoding: [0xc5,0xfa,0x10,0xc1] ; AVX-NEXT: # xmm0 = xmm1[0],xmm0[1,2,3] ; AVX-NEXT: ret{{[l|q]}} # encoding: [0xc3] %cmp = call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> %a1, <4 x float> %a0, i8 2) @@ -232,7 +232,7 @@ define <4 x float> @test_mm_cmpgt_ss(<4 x float> %a0, <4 x float> %a1) nounwind ; AVX-LABEL: test_mm_cmpgt_ss: ; AVX: # %bb.0: ; AVX-NEXT: vcmpltss %xmm0, %xmm1, %xmm1 # encoding: [0xc5,0xf2,0xc2,0xc8,0x01] -; AVX-NEXT: vblendps $1, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0x79,0x0c,0xc1,0x01] +; AVX-NEXT: vmovss %xmm1, %xmm0, %xmm0 # encoding: [0xc5,0xfa,0x10,0xc1] ; AVX-NEXT: # xmm0 = xmm1[0],xmm0[1,2,3] ; AVX-NEXT: ret{{[l|q]}} # encoding: [0xc3] %cmp = call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> %a1, <4 x float> %a0, i8 1) @@ -382,7 +382,7 @@ define <4 x float> @test_mm_cmpnge_ss(<4 x float> %a0, <4 x float> %a1) nounwind ; AVX-LABEL: test_mm_cmpnge_ss: ; AVX: # %bb.0: ; AVX-NEXT: vcmpnless %xmm0, %xmm1, %xmm1 # encoding: [0xc5,0xf2,0xc2,0xc8,0x06] -; AVX-NEXT: vblendps $1, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0x79,0x0c,0xc1,0x01] +; AVX-NEXT: vmovss %xmm1, %xmm0, %xmm0 # encoding: [0xc5,0xfa,0x10,0xc1] ; AVX-NEXT: # xmm0 = xmm1[0],xmm0[1,2,3] ; AVX-NEXT: ret{{[l|q]}} # encoding: [0xc3] %cmp = call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> %a1, <4 x float> %a0, i8 6) @@ -424,7 +424,7 @@ define <4 x float> @test_mm_cmpngt_ss(<4 x float> %a0, <4 x float> %a1) nounwind ; AVX-LABEL: test_mm_cmpngt_ss: ; AVX: # %bb.0: ; AVX-NEXT: vcmpnltss %xmm0, %xmm1, %xmm1 # encoding: [0xc5,0xf2,0xc2,0xc8,0x05] -; AVX-NEXT: vblendps $1, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0x79,0x0c,0xc1,0x01] +; AVX-NEXT: vmovss %xmm1, %xmm0, %xmm0 # encoding: [0xc5,0xfa,0x10,0xc1] ; AVX-NEXT: # xmm0 = xmm1[0],xmm0[1,2,3] ; AVX-NEXT: ret{{[l|q]}} # encoding: [0xc3] %cmp = call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> %a1, <4 x float> %a0, i8 5) @@ -1603,7 +1603,7 @@ define <4 x float> @test_mm_move_ss(<4 x float> %a0, <4 x float> %a1) { ; ; AVX-LABEL: test_mm_move_ss: ; AVX: # %bb.0: -; AVX-NEXT: vblendps $1, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0x79,0x0c,0xc1,0x01] +; AVX-NEXT: vmovss %xmm1, %xmm0, %xmm0 # encoding: [0xc5,0xfa,0x10,0xc1] ; AVX-NEXT: # xmm0 = xmm1[0],xmm0[1,2,3] ; AVX-NEXT: ret{{[l|q]}} # encoding: [0xc3] %res = shufflevector <4 x float> %a0, <4 x float> %a1, <4 x i32> @@ -2219,7 +2219,7 @@ define <4 x float> @test_mm_set_ss(float %a0) nounwind { ; X86-AVX1-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero ; X86-AVX1-NEXT: # encoding: [0xc5,0xfa,0x10,0x44,0x24,0x04] ; X86-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 # encoding: [0xc5,0xf0,0x57,0xc9] -; X86-AVX1-NEXT: vblendps $1, %xmm0, %xmm1, %xmm0 # encoding: [0xc4,0xe3,0x71,0x0c,0xc0,0x01] +; X86-AVX1-NEXT: vmovss %xmm0, %xmm1, %xmm0 # encoding: [0xc5,0xf2,0x10,0xc0] ; X86-AVX1-NEXT: # xmm0 = xmm0[0],xmm1[1,2,3] ; X86-AVX1-NEXT: retl # encoding: [0xc3] ; @@ -2228,7 +2228,7 @@ define <4 x float> @test_mm_set_ss(float %a0) nounwind { ; X86-AVX512-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero ; X86-AVX512-NEXT: # EVEX TO VEX Compression encoding: [0xc5,0xfa,0x10,0x44,0x24,0x04] ; X86-AVX512-NEXT: vxorps %xmm1, %xmm1, %xmm1 # encoding: [0xc5,0xf0,0x57,0xc9] -; X86-AVX512-NEXT: vblendps $1, %xmm0, %xmm1, %xmm0 # encoding: [0xc4,0xe3,0x71,0x0c,0xc0,0x01] +; X86-AVX512-NEXT: vmovss %xmm0, %xmm1, %xmm0 # encoding: [0xc5,0xf2,0x10,0xc0] ; X86-AVX512-NEXT: # xmm0 = xmm0[0],xmm1[1,2,3] ; X86-AVX512-NEXT: retl # encoding: [0xc3] ; @@ -2243,7 +2243,7 @@ define <4 x float> @test_mm_set_ss(float %a0) nounwind { ; X64-AVX-LABEL: test_mm_set_ss: ; X64-AVX: # %bb.0: ; X64-AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 # encoding: [0xc5,0xf0,0x57,0xc9] -; X64-AVX-NEXT: vblendps $1, %xmm0, %xmm1, %xmm0 # encoding: [0xc4,0xe3,0x71,0x0c,0xc0,0x01] +; X64-AVX-NEXT: vmovss %xmm0, %xmm1, %xmm0 # encoding: [0xc5,0xf2,0x10,0xc0] ; X64-AVX-NEXT: # xmm0 = xmm0[0],xmm1[1,2,3] ; X64-AVX-NEXT: retq # encoding: [0xc3] %res0 = insertelement <4 x float> undef, float %a0, i32 0 diff --git a/llvm/test/CodeGen/X86/sse-scalar-fp-arith.ll b/llvm/test/CodeGen/X86/sse-scalar-fp-arith.ll index 47d35f3636d46..006c3006350cc 100644 --- a/llvm/test/CodeGen/X86/sse-scalar-fp-arith.ll +++ b/llvm/test/CodeGen/X86/sse-scalar-fp-arith.ll @@ -1165,7 +1165,7 @@ define <4 x float> @insert_test5_sub_ss(<4 x float> %a, <4 x float> %b) { ; AVX-LABEL: insert_test5_sub_ss: ; AVX: # %bb.0: ; AVX-NEXT: vsubps %xmm0, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; AVX-NEXT: ret{{[l|q]}} %1 = fsub <4 x float> %b, %a %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> @@ -1203,7 +1203,7 @@ define <4 x float> @insert_test5_div_ss(<4 x float> %a, <4 x float> %b) { ; AVX-LABEL: insert_test5_div_ss: ; AVX: # %bb.0: ; AVX-NEXT: vdivps %xmm0, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; AVX-NEXT: ret{{[l|q]}} %1 = fdiv <4 x float> %b, %a %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> @@ -1241,7 +1241,7 @@ define <2 x double> @insert_test5_sub_sd(<2 x double> %a, <2 x double> %b) { ; AVX-LABEL: insert_test5_sub_sd: ; AVX: # %bb.0: ; AVX-NEXT: vsubpd %xmm0, %xmm1, %xmm1 -; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1] +; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] ; AVX-NEXT: ret{{[l|q]}} %1 = fsub <2 x double> %b, %a %2 = shufflevector <2 x double> %1, <2 x double> %a, <2 x i32> @@ -1279,7 +1279,7 @@ define <2 x double> @insert_test5_div_sd(<2 x double> %a, <2 x double> %b) { ; AVX-LABEL: insert_test5_div_sd: ; AVX: # %bb.0: ; AVX-NEXT: vdivpd %xmm0, %xmm1, %xmm1 -; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1] +; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] ; AVX-NEXT: ret{{[l|q]}} %1 = fdiv <2 x double> %b, %a %2 = shufflevector <2 x double> %1, <2 x double> %a, <2 x i32> @@ -1318,7 +1318,7 @@ define <4 x float> @add_ss_mask(<4 x float> %a, <4 x float> %b, <4 x float> %c, ; X86-AVX1-NEXT: # %bb.1: ; X86-AVX1-NEXT: vaddss %xmm1, %xmm0, %xmm2 ; X86-AVX1-NEXT: .LBB70_2: -; X86-AVX1-NEXT: vblendps {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3] +; X86-AVX1-NEXT: vmovss {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3] ; X86-AVX1-NEXT: retl ; ; X86-AVX512-LABEL: add_ss_mask: @@ -1360,7 +1360,7 @@ define <4 x float> @add_ss_mask(<4 x float> %a, <4 x float> %b, <4 x float> %c, ; X64-AVX1-NEXT: # %bb.1: ; X64-AVX1-NEXT: vaddss %xmm1, %xmm0, %xmm2 ; X64-AVX1-NEXT: .LBB70_2: -; X64-AVX1-NEXT: vblendps {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3] +; X64-AVX1-NEXT: vmovss {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3] ; X64-AVX1-NEXT: retq ; ; X64-AVX512-LABEL: add_ss_mask: @@ -1412,7 +1412,7 @@ define <2 x double> @add_sd_mask(<2 x double> %a, <2 x double> %b, <2 x double> ; X86-AVX1-NEXT: # %bb.1: ; X86-AVX1-NEXT: vaddsd %xmm1, %xmm0, %xmm2 ; X86-AVX1-NEXT: .LBB71_2: -; X86-AVX1-NEXT: vblendpd {{.*#+}} xmm0 = xmm2[0],xmm0[1] +; X86-AVX1-NEXT: vmovsd {{.*#+}} xmm0 = xmm2[0],xmm0[1] ; X86-AVX1-NEXT: retl ; ; X86-AVX512-LABEL: add_sd_mask: @@ -1454,7 +1454,7 @@ define <2 x double> @add_sd_mask(<2 x double> %a, <2 x double> %b, <2 x double> ; X64-AVX1-NEXT: # %bb.1: ; X64-AVX1-NEXT: vaddsd %xmm1, %xmm0, %xmm2 ; X64-AVX1-NEXT: .LBB71_2: -; X64-AVX1-NEXT: vblendpd {{.*#+}} xmm0 = xmm2[0],xmm0[1] +; X64-AVX1-NEXT: vmovsd {{.*#+}} xmm0 = xmm2[0],xmm0[1] ; X64-AVX1-NEXT: retq ; ; X64-AVX512-LABEL: add_sd_mask: diff --git a/llvm/test/CodeGen/X86/sse2-intrinsics-fast-isel.ll b/llvm/test/CodeGen/X86/sse2-intrinsics-fast-isel.ll index dbdc45abb24d6..18a6be8aaf0b6 100644 --- a/llvm/test/CodeGen/X86/sse2-intrinsics-fast-isel.ll +++ b/llvm/test/CodeGen/X86/sse2-intrinsics-fast-isel.ll @@ -631,7 +631,7 @@ define <2 x double> @test_mm_cmpge_sd(<2 x double> %a0, <2 x double> %a1) nounwi ; AVX-LABEL: test_mm_cmpge_sd: ; AVX: # %bb.0: ; AVX-NEXT: vcmplesd %xmm0, %xmm1, %xmm1 # encoding: [0xc5,0xf3,0xc2,0xc8,0x02] -; AVX-NEXT: vblendpd $1, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0x79,0x0d,0xc1,0x01] +; AVX-NEXT: vmovsd %xmm1, %xmm0, %xmm0 # encoding: [0xc5,0xfb,0x10,0xc1] ; AVX-NEXT: # xmm0 = xmm1[0],xmm0[1] ; AVX-NEXT: ret{{[l|q]}} # encoding: [0xc3] %cmp = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %a1, <2 x double> %a0, i8 2) @@ -748,7 +748,7 @@ define <2 x double> @test_mm_cmpgt_sd(<2 x double> %a0, <2 x double> %a1) nounwi ; AVX-LABEL: test_mm_cmpgt_sd: ; AVX: # %bb.0: ; AVX-NEXT: vcmpltsd %xmm0, %xmm1, %xmm1 # encoding: [0xc5,0xf3,0xc2,0xc8,0x01] -; AVX-NEXT: vblendpd $1, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0x79,0x0d,0xc1,0x01] +; AVX-NEXT: vmovsd %xmm1, %xmm0, %xmm0 # encoding: [0xc5,0xfb,0x10,0xc1] ; AVX-NEXT: # xmm0 = xmm1[0],xmm0[1] ; AVX-NEXT: ret{{[l|q]}} # encoding: [0xc3] %cmp = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %a1, <2 x double> %a0, i8 1) @@ -976,7 +976,7 @@ define <2 x double> @test_mm_cmpnge_sd(<2 x double> %a0, <2 x double> %a1) nounw ; AVX-LABEL: test_mm_cmpnge_sd: ; AVX: # %bb.0: ; AVX-NEXT: vcmpnlesd %xmm0, %xmm1, %xmm1 # encoding: [0xc5,0xf3,0xc2,0xc8,0x06] -; AVX-NEXT: vblendpd $1, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0x79,0x0d,0xc1,0x01] +; AVX-NEXT: vmovsd %xmm1, %xmm0, %xmm0 # encoding: [0xc5,0xfb,0x10,0xc1] ; AVX-NEXT: # xmm0 = xmm1[0],xmm0[1] ; AVX-NEXT: ret{{[l|q]}} # encoding: [0xc3] %cmp = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %a1, <2 x double> %a0, i8 6) @@ -1021,7 +1021,7 @@ define <2 x double> @test_mm_cmpngt_sd(<2 x double> %a0, <2 x double> %a1) nounw ; AVX-LABEL: test_mm_cmpngt_sd: ; AVX: # %bb.0: ; AVX-NEXT: vcmpnltsd %xmm0, %xmm1, %xmm1 # encoding: [0xc5,0xf3,0xc2,0xc8,0x05] -; AVX-NEXT: vblendpd $1, %xmm1, %xmm0, %xmm0 # encoding: [0xc4,0xe3,0x79,0x0d,0xc1,0x01] +; AVX-NEXT: vmovsd %xmm1, %xmm0, %xmm0 # encoding: [0xc5,0xfb,0x10,0xc1] ; AVX-NEXT: # xmm0 = xmm1[0],xmm0[1] ; AVX-NEXT: ret{{[l|q]}} # encoding: [0xc3] %cmp = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %a1, <2 x double> %a0, i8 5) diff --git a/llvm/test/CodeGen/X86/sse2.ll b/llvm/test/CodeGen/X86/sse2.ll index 3e5d76eae0bb3..e1d91b407fc28 100644 --- a/llvm/test/CodeGen/X86/sse2.ll +++ b/llvm/test/CodeGen/X86/sse2.ll @@ -670,7 +670,7 @@ define <4 x i32> @PR19721(<4 x i32> %i) { ; AVX-LABEL: PR19721: ; AVX: # %bb.0: ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; AVX-NEXT: ret{{[l|q]}} ; ; X64-SSE-LABEL: PR19721: diff --git a/llvm/test/CodeGen/X86/sse41.ll b/llvm/test/CodeGen/X86/sse41.ll index 2d7258a49f5d0..53a10ab0c26ff 100644 --- a/llvm/test/CodeGen/X86/sse41.ll +++ b/llvm/test/CodeGen/X86/sse41.ll @@ -353,7 +353,7 @@ define <4 x float> @blendps_not_insertps_1(<4 x float> %t1, float %t2) nounwind ; X86-AVX1: ## %bb.0: ; X86-AVX1-NEXT: vmovss {{[0-9]+}}(%esp), %xmm1 ## xmm1 = mem[0],zero,zero,zero ; X86-AVX1-NEXT: ## encoding: [0xc5,0xfa,0x10,0x4c,0x24,0x04] -; X86-AVX1-NEXT: vblendps $1, %xmm1, %xmm0, %xmm0 ## encoding: [0xc4,0xe3,0x79,0x0c,0xc1,0x01] +; X86-AVX1-NEXT: vmovss %xmm1, %xmm0, %xmm0 ## encoding: [0xc5,0xfa,0x10,0xc1] ; X86-AVX1-NEXT: ## xmm0 = xmm1[0],xmm0[1,2,3] ; X86-AVX1-NEXT: retl ## encoding: [0xc3] ; @@ -361,7 +361,7 @@ define <4 x float> @blendps_not_insertps_1(<4 x float> %t1, float %t2) nounwind ; X86-AVX512: ## %bb.0: ; X86-AVX512-NEXT: vmovss {{[0-9]+}}(%esp), %xmm1 ## xmm1 = mem[0],zero,zero,zero ; X86-AVX512-NEXT: ## EVEX TO VEX Compression encoding: [0xc5,0xfa,0x10,0x4c,0x24,0x04] -; X86-AVX512-NEXT: vblendps $1, %xmm1, %xmm0, %xmm0 ## encoding: [0xc4,0xe3,0x79,0x0c,0xc1,0x01] +; X86-AVX512-NEXT: vmovss %xmm1, %xmm0, %xmm0 ## encoding: [0xc5,0xfa,0x10,0xc1] ; X86-AVX512-NEXT: ## xmm0 = xmm1[0],xmm0[1,2,3] ; X86-AVX512-NEXT: retl ## encoding: [0xc3] ; @@ -373,7 +373,7 @@ define <4 x float> @blendps_not_insertps_1(<4 x float> %t1, float %t2) nounwind ; ; X64-AVX-LABEL: blendps_not_insertps_1: ; X64-AVX: ## %bb.0: -; X64-AVX-NEXT: vblendps $1, %xmm1, %xmm0, %xmm0 ## encoding: [0xc4,0xe3,0x79,0x0c,0xc1,0x01] +; X64-AVX-NEXT: vmovss %xmm1, %xmm0, %xmm0 ## encoding: [0xc5,0xfa,0x10,0xc1] ; X64-AVX-NEXT: ## xmm0 = xmm1[0],xmm0[1,2,3] ; X64-AVX-NEXT: retq ## encoding: [0xc3] %tmp1 = insertelement <4 x float> %t1, float %t2, i32 0 @@ -440,7 +440,7 @@ define <4 x float> @blendps_not_insertps_2(<4 x float> %t1, <4 x float> %t2) nou ; ; AVX-LABEL: blendps_not_insertps_2: ; AVX: ## %bb.0: -; AVX-NEXT: vblendps $1, %xmm1, %xmm0, %xmm0 ## encoding: [0xc4,0xe3,0x79,0x0c,0xc1,0x01] +; AVX-NEXT: vmovss %xmm1, %xmm0, %xmm0 ## encoding: [0xc5,0xfa,0x10,0xc1] ; AVX-NEXT: ## xmm0 = xmm1[0],xmm0[1,2,3] ; AVX-NEXT: ret{{[l|q]}} ## encoding: [0xc3] %tmp2 = extractelement <4 x float> %t2, i32 0 @@ -1207,7 +1207,7 @@ define <4 x i32> @i32_shuf_X00A(<4 x i32> %x, <4 x i32> %a) { ; AVX1-LABEL: i32_shuf_X00A: ; AVX1: ## %bb.0: ; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 ## encoding: [0xc5,0xe8,0x57,0xd2] -; AVX1-NEXT: vblendps $1, %xmm0, %xmm2, %xmm0 ## encoding: [0xc4,0xe3,0x69,0x0c,0xc0,0x01] +; AVX1-NEXT: vmovss %xmm0, %xmm2, %xmm0 ## encoding: [0xc5,0xea,0x10,0xc0] ; AVX1-NEXT: ## xmm0 = xmm0[0],xmm2[1,2,3] ; AVX1-NEXT: vshufps $0, %xmm1, %xmm1, %xmm1 ## encoding: [0xc5,0xf0,0xc6,0xc9,0x00] ; AVX1-NEXT: ## xmm1 = xmm1[0,0,0,0] @@ -1218,7 +1218,7 @@ define <4 x i32> @i32_shuf_X00A(<4 x i32> %x, <4 x i32> %a) { ; AVX512-LABEL: i32_shuf_X00A: ; AVX512: ## %bb.0: ; AVX512-NEXT: vxorps %xmm2, %xmm2, %xmm2 ## encoding: [0xc5,0xe8,0x57,0xd2] -; AVX512-NEXT: vblendps $1, %xmm0, %xmm2, %xmm0 ## encoding: [0xc4,0xe3,0x69,0x0c,0xc0,0x01] +; AVX512-NEXT: vmovss %xmm0, %xmm2, %xmm0 ## encoding: [0xc5,0xea,0x10,0xc0] ; AVX512-NEXT: ## xmm0 = xmm0[0],xmm2[1,2,3] ; AVX512-NEXT: vbroadcastss %xmm1, %xmm1 ## EVEX TO VEX Compression encoding: [0xc4,0xe2,0x79,0x18,0xc9] ; AVX512-NEXT: vblendps $8, %xmm1, %xmm0, %xmm0 ## encoding: [0xc4,0xe3,0x79,0x0c,0xc1,0x08] diff --git a/llvm/test/CodeGen/X86/stack-folding-fp-avx1.ll b/llvm/test/CodeGen/X86/stack-folding-fp-avx1.ll index 6625cc4f07a27..6a4e87ec3ceb8 100644 --- a/llvm/test/CodeGen/X86/stack-folding-fp-avx1.ll +++ b/llvm/test/CodeGen/X86/stack-folding-fp-avx1.ll @@ -1216,7 +1216,7 @@ define <4 x float> @stack_fold_cvtsi2ss_int(i32 %a0) { ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: vcvtsi2ssl {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm0 # 4-byte Folded Reload ; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; CHECK-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; CHECK-NEXT: popq %rbx ; CHECK-NEXT: .cfi_def_cfa_offset 48 ; CHECK-NEXT: popq %r12 @@ -1307,7 +1307,7 @@ define <4 x float> @stack_fold_cvtsi642ss_int(i64 %a0) { ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: vcvtsi2ssq {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm0 # 8-byte Folded Reload ; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; CHECK-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; CHECK-NEXT: popq %rbx ; CHECK-NEXT: .cfi_def_cfa_offset 48 ; CHECK-NEXT: popq %r12 diff --git a/llvm/test/CodeGen/X86/vec-strict-128-fp16.ll b/llvm/test/CodeGen/X86/vec-strict-128-fp16.ll index 2c3d7ceb37d03..a6e288608c87b 100644 --- a/llvm/test/CodeGen/X86/vec-strict-128-fp16.ll +++ b/llvm/test/CodeGen/X86/vec-strict-128-fp16.ll @@ -154,7 +154,7 @@ define <4 x float> @f18(<4 x float> %a0, <8 x half> %a1) #0 { ; CHECK-LABEL: f18: ; CHECK: # %bb.0: ; CHECK-NEXT: vcvtsh2ss %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; CHECK-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; CHECK-NEXT: ret{{[l|q]}} %ext = extractelement <8 x half> %a1, i32 0 %cvt = call float @llvm.experimental.constrained.fpext.f32.f16(half %ext, diff --git a/llvm/test/CodeGen/X86/vec-strict-fptoint-128-fp16.ll b/llvm/test/CodeGen/X86/vec-strict-fptoint-128-fp16.ll index 0a9dd78afb8cc..b40f8befa1ec9 100644 --- a/llvm/test/CodeGen/X86/vec-strict-fptoint-128-fp16.ll +++ b/llvm/test/CodeGen/X86/vec-strict-fptoint-128-fp16.ll @@ -31,7 +31,7 @@ define <2 x i64> @strict_vector_fptosi_v2f16_to_v2i64(<2 x half> %a) #0 { ; CHECK-LABEL: strict_vector_fptosi_v2f16_to_v2i64: ; CHECK: # %bb.0: ; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; CHECK-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; CHECK-NEXT: vcvttph2qq %xmm0, %xmm0 ; CHECK-NEXT: ret{{[l|q]}} %ret = call <2 x i64> @llvm.experimental.constrained.fptosi.v2i64.v2f16(<2 x half> %a, @@ -43,7 +43,7 @@ define <2 x i64> @strict_vector_fptoui_v2f16_to_v2i64(<2 x half> %a) #0 { ; CHECK-LABEL: strict_vector_fptoui_v2f16_to_v2i64: ; CHECK: # %bb.0: ; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; CHECK-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; CHECK-NEXT: vcvttph2uqq %xmm0, %xmm0 ; CHECK-NEXT: ret{{[l|q]}} %ret = call <2 x i64> @llvm.experimental.constrained.fptoui.v2i64.v2f16(<2 x half> %a, @@ -55,7 +55,7 @@ define <2 x i32> @strict_vector_fptosi_v2f16_to_v2i32(<2 x half> %a) #0 { ; CHECK-LABEL: strict_vector_fptosi_v2f16_to_v2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; CHECK-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; CHECK-NEXT: vcvttph2dq %xmm0, %xmm0 ; CHECK-NEXT: ret{{[l|q]}} %ret = call <2 x i32> @llvm.experimental.constrained.fptosi.v2i32.v2f16(<2 x half> %a, @@ -67,7 +67,7 @@ define <2 x i32> @strict_vector_fptoui_v2f16_to_v2i32(<2 x half> %a) #0 { ; CHECK-LABEL: strict_vector_fptoui_v2f16_to_v2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; CHECK-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; CHECK-NEXT: vcvttph2udq %xmm0, %xmm0 ; CHECK-NEXT: ret{{[l|q]}} %ret = call <2 x i32> @llvm.experimental.constrained.fptoui.v2i32.v2f16(<2 x half> %a, @@ -79,7 +79,7 @@ define <2 x i16> @strict_vector_fptosi_v2f16_to_v2i16(<2 x half> %a) #0 { ; CHECK-LABEL: strict_vector_fptosi_v2f16_to_v2i16: ; CHECK: # %bb.0: ; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; CHECK-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; CHECK-NEXT: vcvttph2w %xmm0, %xmm0 ; CHECK-NEXT: ret{{[l|q]}} %ret = call <2 x i16> @llvm.experimental.constrained.fptosi.v2i16.v2f16(<2 x half> %a, @@ -91,7 +91,7 @@ define <2 x i16> @strict_vector_fptoui_v2f16_to_v2i16(<2 x half> %a) #0 { ; CHECK-LABEL: strict_vector_fptoui_v2f16_to_v2i16: ; CHECK: # %bb.0: ; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; CHECK-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; CHECK-NEXT: vcvttph2uw %xmm0, %xmm0 ; CHECK-NEXT: ret{{[l|q]}} %ret = call <2 x i16> @llvm.experimental.constrained.fptoui.v2i16.v2f16(<2 x half> %a, @@ -103,7 +103,7 @@ define <2 x i8> @strict_vector_fptosi_v2f16_to_v2i8(<2 x half> %a) #0 { ; CHECK-LABEL: strict_vector_fptosi_v2f16_to_v2i8: ; CHECK: # %bb.0: ; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; CHECK-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; CHECK-NEXT: vcvttph2w %xmm0, %xmm0 ; CHECK-NEXT: vpmovwb %xmm0, %xmm0 ; CHECK-NEXT: ret{{[l|q]}} @@ -116,7 +116,7 @@ define <2 x i8> @strict_vector_fptoui_v2f16_to_v2i8(<2 x half> %a) #0 { ; CHECK-LABEL: strict_vector_fptoui_v2f16_to_v2i8: ; CHECK: # %bb.0: ; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; CHECK-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; CHECK-NEXT: vcvttph2uw %xmm0, %xmm0 ; CHECK-NEXT: vpmovwb %xmm0, %xmm0 ; CHECK-NEXT: ret{{[l|q]}} @@ -129,7 +129,7 @@ define <2 x i1> @strict_vector_fptosi_v2f16_to_v2i1(<2 x half> %a) #0 { ; CHECK-LABEL: strict_vector_fptosi_v2f16_to_v2i1: ; CHECK: # %bb.0: ; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; CHECK-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; CHECK-NEXT: vcvttph2w %xmm0, %xmm0 ; CHECK-NEXT: vpsllw $15, %xmm0, %xmm0 ; CHECK-NEXT: vpmovw2m %xmm0, %k1 @@ -145,7 +145,7 @@ define <2 x i1> @strict_vector_fptoui_v2f16_to_v2i1(<2 x half> %a) #0 { ; CHECK-LABEL: strict_vector_fptoui_v2f16_to_v2i1: ; CHECK: # %bb.0: ; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; CHECK-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; CHECK-NEXT: vcvttph2uw %xmm0, %xmm0 ; CHECK-NEXT: vpsllw $15, %xmm0, %xmm0 ; CHECK-NEXT: vpmovw2m %xmm0, %k1 diff --git a/llvm/test/CodeGen/X86/vec_extract-avx.ll b/llvm/test/CodeGen/X86/vec_extract-avx.ll index 341a703a21bd5..4b70933334fb7 100644 --- a/llvm/test/CodeGen/X86/vec_extract-avx.ll +++ b/llvm/test/CodeGen/X86/vec_extract-avx.ll @@ -119,7 +119,7 @@ define void @legal_vzmovl_2i32_8i32(ptr %in, ptr %out) { ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero ; X86-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; X86-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; X86-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; X86-NEXT: vmovaps %ymm0, (%eax) ; X86-NEXT: vzeroupper ; X86-NEXT: retl @@ -128,7 +128,7 @@ define void @legal_vzmovl_2i32_8i32(ptr %in, ptr %out) { ; X64: # %bb.0: ; X64-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero ; X64-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; X64-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; X64-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; X64-NEXT: vmovaps %ymm0, (%rsi) ; X64-NEXT: vzeroupper ; X64-NEXT: retq @@ -169,7 +169,7 @@ define void @legal_vzmovl_2f32_8f32(ptr %in, ptr %out) { ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero ; X86-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; X86-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; X86-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; X86-NEXT: vmovaps %ymm0, (%eax) ; X86-NEXT: vzeroupper ; X86-NEXT: retl @@ -178,7 +178,7 @@ define void @legal_vzmovl_2f32_8f32(ptr %in, ptr %out) { ; X64: # %bb.0: ; X64-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero ; X64-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; X64-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; X64-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; X64-NEXT: vmovaps %ymm0, (%rsi) ; X64-NEXT: vzeroupper ; X64-NEXT: retq diff --git a/llvm/test/CodeGen/X86/vec_floor.ll b/llvm/test/CodeGen/X86/vec_floor.ll index abb85ac83464c..0538cac12cbf7 100644 --- a/llvm/test/CodeGen/X86/vec_floor.ll +++ b/llvm/test/CodeGen/X86/vec_floor.ll @@ -828,13 +828,13 @@ define <4 x float> @floor_ss(<4 x float> %x, <4 x float> %y) nounwind { ; AVX-LABEL: floor_ss: ; AVX: ## %bb.0: ; AVX-NEXT: vroundss $9, %xmm0, %xmm0, %xmm0 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq ; ; AVX512-LABEL: floor_ss: ; AVX512: ## %bb.0: ; AVX512-NEXT: vroundss $9, %xmm0, %xmm0, %xmm0 -; AVX512-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX512-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX512-NEXT: retq %s = extractelement <4 x float> %x, i32 0 %call = call float @llvm.floor.f32(float %s) @@ -853,13 +853,13 @@ define <2 x double> @floor_sd(<2 x double> %x, <2 x double> %y) nounwind { ; AVX-LABEL: floor_sd: ; AVX: ## %bb.0: ; AVX-NEXT: vroundsd $9, %xmm0, %xmm0, %xmm0 -; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] +; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm0[0],xmm1[1] ; AVX-NEXT: retq ; ; AVX512-LABEL: floor_sd: ; AVX512: ## %bb.0: ; AVX512-NEXT: vroundsd $9, %xmm0, %xmm0, %xmm0 -; AVX512-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] +; AVX512-NEXT: vmovsd {{.*#+}} xmm0 = xmm0[0],xmm1[1] ; AVX512-NEXT: retq %s = extractelement <2 x double> %x, i32 0 %call = call double @llvm.floor.f64(double %s) @@ -1372,7 +1372,7 @@ define <4 x float> @floor_mask_ss(<4 x float> %x, <4 x float> %y, <4 x float> %w ; AVX-NEXT: ## %bb.1: ; AVX-NEXT: vroundss $9, %xmm0, %xmm0, %xmm2 ; AVX-NEXT: LBB52_2: -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm2[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm2[0],xmm1[1,2,3] ; AVX-NEXT: retq ; ; AVX512-LABEL: floor_mask_ss: @@ -1414,7 +1414,7 @@ define <4 x float> @floor_maskz_ss(<4 x float> %x, <4 x float> %y, i8 %k) nounwi ; AVX-NEXT: ## %bb.1: ; AVX-NEXT: vroundss $9, %xmm0, %xmm0, %xmm2 ; AVX-NEXT: LBB53_2: -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm2[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm2[0],xmm1[1,2,3] ; AVX-NEXT: retq ; ; AVX512-LABEL: floor_maskz_ss: @@ -1452,7 +1452,7 @@ define <2 x double> @floor_mask_sd(<2 x double> %x, <2 x double> %y, <2 x double ; AVX-NEXT: ## %bb.1: ; AVX-NEXT: vroundsd $9, %xmm0, %xmm0, %xmm2 ; AVX-NEXT: LBB54_2: -; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm2[0],xmm1[1] +; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm2[0],xmm1[1] ; AVX-NEXT: retq ; ; AVX512-LABEL: floor_mask_sd: @@ -1494,7 +1494,7 @@ define <2 x double> @floor_maskz_sd(<2 x double> %x, <2 x double> %y, i8 %k) nou ; AVX-NEXT: ## %bb.1: ; AVX-NEXT: vroundsd $9, %xmm0, %xmm0, %xmm2 ; AVX-NEXT: LBB55_2: -; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm2[0],xmm1[1] +; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm2[0],xmm1[1] ; AVX-NEXT: retq ; ; AVX512-LABEL: floor_maskz_sd: @@ -1532,7 +1532,7 @@ define <4 x float> @floor_mask_ss_trunc(<4 x float> %x, <4 x float> %y, <4 x flo ; AVX-NEXT: ## %bb.1: ; AVX-NEXT: vroundss $9, %xmm0, %xmm0, %xmm2 ; AVX-NEXT: LBB56_2: -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm2[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm2[0],xmm1[1,2,3] ; AVX-NEXT: retq ; ; AVX512-LABEL: floor_mask_ss_trunc: @@ -1572,11 +1572,11 @@ define <4 x float> @floor_maskz_ss_trunc(<4 x float> %x, <4 x float> %y, i16 %k) ; AVX-NEXT: jne LBB57_1 ; AVX-NEXT: ## %bb.2: ; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq ; AVX-NEXT: LBB57_1: ; AVX-NEXT: vroundss $9, %xmm0, %xmm0, %xmm0 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq ; ; AVX512-LABEL: floor_maskz_ss_trunc: @@ -1613,7 +1613,7 @@ define <2 x double> @floor_mask_sd_trunc(<2 x double> %x, <2 x double> %y, <2 x ; AVX-NEXT: ## %bb.1: ; AVX-NEXT: vroundsd $9, %xmm0, %xmm0, %xmm2 ; AVX-NEXT: LBB58_2: -; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm2[0],xmm1[1] +; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm2[0],xmm1[1] ; AVX-NEXT: retq ; ; AVX512-LABEL: floor_mask_sd_trunc: @@ -1657,7 +1657,7 @@ define <2 x double> @floor_maskz_sd_trunc(<2 x double> %x, <2 x double> %y, i16 ; AVX-NEXT: retq ; AVX-NEXT: LBB59_1: ; AVX-NEXT: vroundsd $9, %xmm0, %xmm0, %xmm0 -; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] +; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm0[0],xmm1[1] ; AVX-NEXT: retq ; ; AVX512-LABEL: floor_maskz_sd_trunc: @@ -1689,7 +1689,7 @@ define <4 x float> @floor_mask_ss_mask8(<4 x float> %x, <4 x float> %y, <4 x flo ; AVX-NEXT: vroundss $9, %xmm0, %xmm0, %xmm3 ; AVX-NEXT: vcmpeqss %xmm1, %xmm0, %xmm0 ; AVX-NEXT: vblendvps %xmm0, %xmm3, %xmm2, %xmm0 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq ; ; AVX512-LABEL: floor_mask_ss_mask8: @@ -1723,7 +1723,7 @@ define <4 x float> @floor_maskz_ss_mask8(<4 x float> %x, <4 x float> %y) nounwin ; AVX-NEXT: vroundss $9, %xmm0, %xmm0, %xmm2 ; AVX-NEXT: vcmpeqss %xmm1, %xmm0, %xmm0 ; AVX-NEXT: vandps %xmm2, %xmm0, %xmm0 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq ; ; AVX512-LABEL: floor_maskz_ss_mask8: @@ -1756,7 +1756,7 @@ define <2 x double> @floor_mask_sd_mask8(<2 x double> %x, <2 x double> %y, <2 x ; AVX-NEXT: vroundsd $9, %xmm0, %xmm0, %xmm3 ; AVX-NEXT: vcmpeqsd %xmm1, %xmm0, %xmm0 ; AVX-NEXT: vblendvpd %xmm0, %xmm3, %xmm2, %xmm0 -; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] +; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm0[0],xmm1[1] ; AVX-NEXT: retq ; ; AVX512-LABEL: floor_mask_sd_mask8: @@ -1790,7 +1790,7 @@ define <2 x double> @floor_maskz_sd_mask8(<2 x double> %x, <2 x double> %y) noun ; AVX-NEXT: vroundsd $9, %xmm0, %xmm0, %xmm2 ; AVX-NEXT: vcmpeqsd %xmm1, %xmm0, %xmm0 ; AVX-NEXT: vandpd %xmm2, %xmm0, %xmm0 -; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] +; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm0[0],xmm1[1] ; AVX-NEXT: retq ; ; AVX512-LABEL: floor_maskz_sd_mask8: @@ -1818,13 +1818,13 @@ define <4 x float> @ceil_ss(<4 x float> %x, <4 x float> %y) nounwind { ; AVX-LABEL: ceil_ss: ; AVX: ## %bb.0: ; AVX-NEXT: vroundss $10, %xmm0, %xmm0, %xmm0 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq ; ; AVX512-LABEL: ceil_ss: ; AVX512: ## %bb.0: ; AVX512-NEXT: vroundss $10, %xmm0, %xmm0, %xmm0 -; AVX512-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX512-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX512-NEXT: retq %s = extractelement <4 x float> %x, i32 0 %call = call float @llvm.ceil.f32(float %s) @@ -1843,13 +1843,13 @@ define <2 x double> @ceil_sd(<2 x double> %x, <2 x double> %y) nounwind { ; AVX-LABEL: ceil_sd: ; AVX: ## %bb.0: ; AVX-NEXT: vroundsd $10, %xmm0, %xmm0, %xmm0 -; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] +; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm0[0],xmm1[1] ; AVX-NEXT: retq ; ; AVX512-LABEL: ceil_sd: ; AVX512: ## %bb.0: ; AVX512-NEXT: vroundsd $10, %xmm0, %xmm0, %xmm0 -; AVX512-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] +; AVX512-NEXT: vmovsd {{.*#+}} xmm0 = xmm0[0],xmm1[1] ; AVX512-NEXT: retq %s = extractelement <2 x double> %x, i32 0 %call = call double @llvm.ceil.f64(double %s) @@ -2362,7 +2362,7 @@ define <4 x float> @ceil_mask_ss(<4 x float> %x, <4 x float> %y, <4 x float> %w, ; AVX-NEXT: ## %bb.1: ; AVX-NEXT: vroundss $10, %xmm0, %xmm0, %xmm2 ; AVX-NEXT: LBB78_2: -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm2[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm2[0],xmm1[1,2,3] ; AVX-NEXT: retq ; ; AVX512-LABEL: ceil_mask_ss: @@ -2404,7 +2404,7 @@ define <4 x float> @ceil_maskz_ss(<4 x float> %x, <4 x float> %y, i8 %k) nounwin ; AVX-NEXT: ## %bb.1: ; AVX-NEXT: vroundss $10, %xmm0, %xmm0, %xmm2 ; AVX-NEXT: LBB79_2: -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm2[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm2[0],xmm1[1,2,3] ; AVX-NEXT: retq ; ; AVX512-LABEL: ceil_maskz_ss: @@ -2442,7 +2442,7 @@ define <2 x double> @ceil_mask_sd(<2 x double> %x, <2 x double> %y, <2 x double> ; AVX-NEXT: ## %bb.1: ; AVX-NEXT: vroundsd $10, %xmm0, %xmm0, %xmm2 ; AVX-NEXT: LBB80_2: -; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm2[0],xmm1[1] +; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm2[0],xmm1[1] ; AVX-NEXT: retq ; ; AVX512-LABEL: ceil_mask_sd: @@ -2484,7 +2484,7 @@ define <2 x double> @ceil_maskz_sd(<2 x double> %x, <2 x double> %y, i8 %k) noun ; AVX-NEXT: ## %bb.1: ; AVX-NEXT: vroundsd $10, %xmm0, %xmm0, %xmm2 ; AVX-NEXT: LBB81_2: -; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm2[0],xmm1[1] +; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm2[0],xmm1[1] ; AVX-NEXT: retq ; ; AVX512-LABEL: ceil_maskz_sd: @@ -2522,7 +2522,7 @@ define <4 x float> @ceil_mask_ss_trunc(<4 x float> %x, <4 x float> %y, <4 x floa ; AVX-NEXT: ## %bb.1: ; AVX-NEXT: vroundss $10, %xmm0, %xmm0, %xmm2 ; AVX-NEXT: LBB82_2: -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm2[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm2[0],xmm1[1,2,3] ; AVX-NEXT: retq ; ; AVX512-LABEL: ceil_mask_ss_trunc: @@ -2562,11 +2562,11 @@ define <4 x float> @ceil_maskz_ss_trunc(<4 x float> %x, <4 x float> %y, i16 %k) ; AVX-NEXT: jne LBB83_1 ; AVX-NEXT: ## %bb.2: ; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq ; AVX-NEXT: LBB83_1: ; AVX-NEXT: vroundss $10, %xmm0, %xmm0, %xmm0 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq ; ; AVX512-LABEL: ceil_maskz_ss_trunc: @@ -2603,7 +2603,7 @@ define <2 x double> @ceil_mask_sd_trunc(<2 x double> %x, <2 x double> %y, <2 x d ; AVX-NEXT: ## %bb.1: ; AVX-NEXT: vroundsd $10, %xmm0, %xmm0, %xmm2 ; AVX-NEXT: LBB84_2: -; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm2[0],xmm1[1] +; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm2[0],xmm1[1] ; AVX-NEXT: retq ; ; AVX512-LABEL: ceil_mask_sd_trunc: @@ -2647,7 +2647,7 @@ define <2 x double> @ceil_maskz_sd_trunc(<2 x double> %x, <2 x double> %y, i16 % ; AVX-NEXT: retq ; AVX-NEXT: LBB85_1: ; AVX-NEXT: vroundsd $10, %xmm0, %xmm0, %xmm0 -; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] +; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm0[0],xmm1[1] ; AVX-NEXT: retq ; ; AVX512-LABEL: ceil_maskz_sd_trunc: @@ -2679,7 +2679,7 @@ define <4 x float> @ceil_mask_ss_mask8(<4 x float> %x, <4 x float> %y, <4 x floa ; AVX-NEXT: vroundss $10, %xmm0, %xmm0, %xmm3 ; AVX-NEXT: vcmpeqss %xmm1, %xmm0, %xmm0 ; AVX-NEXT: vblendvps %xmm0, %xmm3, %xmm2, %xmm0 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq ; ; AVX512-LABEL: ceil_mask_ss_mask8: @@ -2713,7 +2713,7 @@ define <4 x float> @ceil_maskz_ss_mask8(<4 x float> %x, <4 x float> %y) nounwind ; AVX-NEXT: vroundss $10, %xmm0, %xmm0, %xmm2 ; AVX-NEXT: vcmpeqss %xmm1, %xmm0, %xmm0 ; AVX-NEXT: vandps %xmm2, %xmm0, %xmm0 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq ; ; AVX512-LABEL: ceil_maskz_ss_mask8: @@ -2746,7 +2746,7 @@ define <2 x double> @ceil_mask_sd_mask8(<2 x double> %x, <2 x double> %y, <2 x d ; AVX-NEXT: vroundsd $10, %xmm0, %xmm0, %xmm3 ; AVX-NEXT: vcmpeqsd %xmm1, %xmm0, %xmm0 ; AVX-NEXT: vblendvpd %xmm0, %xmm3, %xmm2, %xmm0 -; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] +; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm0[0],xmm1[1] ; AVX-NEXT: retq ; ; AVX512-LABEL: ceil_mask_sd_mask8: @@ -2780,7 +2780,7 @@ define <2 x double> @ceil_maskz_sd_mask8(<2 x double> %x, <2 x double> %y) nounw ; AVX-NEXT: vroundsd $10, %xmm0, %xmm0, %xmm2 ; AVX-NEXT: vcmpeqsd %xmm1, %xmm0, %xmm0 ; AVX-NEXT: vandpd %xmm2, %xmm0, %xmm0 -; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] +; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm0[0],xmm1[1] ; AVX-NEXT: retq ; ; AVX512-LABEL: ceil_maskz_sd_mask8: diff --git a/llvm/test/CodeGen/X86/vec_ss_load_fold.ll b/llvm/test/CodeGen/X86/vec_ss_load_fold.ll index e4304f2cc214a..e73d345d0fcd4 100644 --- a/llvm/test/CodeGen/X86/vec_ss_load_fold.ll +++ b/llvm/test/CodeGen/X86/vec_ss_load_fold.ll @@ -38,7 +38,7 @@ define i16 @test1(float %f) nounwind { ; X86_AVX1-NEXT: vaddss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 ; X86_AVX1-NEXT: vmulss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 ; X86_AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; X86_AVX1-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; X86_AVX1-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; X86_AVX1-NEXT: vminss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 ; X86_AVX1-NEXT: vmaxss %xmm1, %xmm0, %xmm0 ; X86_AVX1-NEXT: vcvttss2si %xmm0, %eax @@ -50,7 +50,7 @@ define i16 @test1(float %f) nounwind { ; X64_AVX1-NEXT: vaddss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 ; X64_AVX1-NEXT: vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 ; X64_AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; X64_AVX1-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; X64_AVX1-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; X64_AVX1-NEXT: vminss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 ; X64_AVX1-NEXT: vmaxss %xmm1, %xmm0, %xmm0 ; X64_AVX1-NEXT: vcvttss2si %xmm0, %eax @@ -63,7 +63,7 @@ define i16 @test1(float %f) nounwind { ; X86_AVX512-NEXT: vaddss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 ; X86_AVX512-NEXT: vmulss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 ; X86_AVX512-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; X86_AVX512-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; X86_AVX512-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; X86_AVX512-NEXT: vminss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 ; X86_AVX512-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; X86_AVX512-NEXT: vmaxss %xmm1, %xmm0, %xmm0 @@ -76,7 +76,7 @@ define i16 @test1(float %f) nounwind { ; X64_AVX512-NEXT: vaddss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 ; X64_AVX512-NEXT: vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 ; X64_AVX512-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; X64_AVX512-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; X64_AVX512-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; X64_AVX512-NEXT: vminss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 ; X64_AVX512-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; X64_AVX512-NEXT: vmaxss %xmm1, %xmm0, %xmm0 diff --git a/llvm/test/CodeGen/X86/vector-blend.ll b/llvm/test/CodeGen/X86/vector-blend.ll index bd5c9363794aa..a38028e87532f 100644 --- a/llvm/test/CodeGen/X86/vector-blend.ll +++ b/llvm/test/CodeGen/X86/vector-blend.ll @@ -54,7 +54,7 @@ define <4 x float> @vsel_float2(<4 x float> %v1, <4 x float> %v2) { ; ; AVX-LABEL: vsel_float2: ; AVX: # %bb.0: # %entry -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq entry: %vsel = select <4 x i1> , <4 x float> %v1, <4 x float> %v2 diff --git a/llvm/test/CodeGen/X86/vector-half-conversions.ll b/llvm/test/CodeGen/X86/vector-half-conversions.ll index 1bbf92e45fc6c..01159d4135d8e 100644 --- a/llvm/test/CodeGen/X86/vector-half-conversions.ll +++ b/llvm/test/CodeGen/X86/vector-half-conversions.ll @@ -5034,7 +5034,7 @@ define <4 x i32> @fptoui_2f16_to_4i32(<2 x half> %a) nounwind { ; F16C-LABEL: fptoui_2f16_to_4i32: ; F16C: # %bb.0: ; F16C-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; F16C-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; F16C-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; F16C-NEXT: vcvtph2ps %xmm0, %xmm0 ; F16C-NEXT: vcvttps2dq %xmm0, %xmm1 ; F16C-NEXT: vpsrad $31, %xmm1, %xmm2 @@ -5048,7 +5048,7 @@ define <4 x i32> @fptoui_2f16_to_4i32(<2 x half> %a) nounwind { ; AVX512F-LABEL: fptoui_2f16_to_4i32: ; AVX512F: # %bb.0: ; AVX512F-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX512F-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX512F-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX512F-NEXT: vcvtph2ps %xmm0, %xmm0 ; AVX512F-NEXT: vcvttps2udq %zmm0, %zmm0 ; AVX512F-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero diff --git a/llvm/test/CodeGen/X86/vector-interleaved-store-i32-stride-5.ll b/llvm/test/CodeGen/X86/vector-interleaved-store-i32-stride-5.ll index 0fba7de803488..fb17a5c16e937 100644 --- a/llvm/test/CodeGen/X86/vector-interleaved-store-i32-stride-5.ll +++ b/llvm/test/CodeGen/X86/vector-interleaved-store-i32-stride-5.ll @@ -51,7 +51,7 @@ define void @store_i32_stride5_vf2(ptr %in.vecptr0, ptr %in.vecptr1, ptr %in.vec ; AVX-NEXT: vshufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2] ; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm4[1,1],xmm0[1,1] ; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,0] -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm5[0],xmm0[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm5[0],xmm0[1,2,3] ; AVX-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0 ; AVX-NEXT: vshufps {{.*#+}} xmm1 = xmm3[3,3,3,3] ; AVX-NEXT: vblendps {{.*#+}} xmm1 = xmm1[0],xmm5[1],xmm1[2,3] @@ -452,7 +452,7 @@ define void @store_i32_stride5_vf4(ptr %in.vecptr0, ptr %in.vecptr1, ptr %in.vec ; AVX2-FCP-NEXT: vbroadcastsd {{.*#+}} ymm5 = [7,3,7,3,7,3,7,3] ; AVX2-FCP-NEXT: vpermps %ymm2, %ymm5, %ymm2 ; AVX2-FCP-NEXT: vshufps {{.*#+}} xmm1 = xmm1[3,3,3,3] -; AVX2-FCP-NEXT: vblendps {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3] +; AVX2-FCP-NEXT: vmovss {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3] ; AVX2-FCP-NEXT: vmovaps %ymm4, 32(%r9) ; AVX2-FCP-NEXT: vmovaps %ymm0, (%r9) ; AVX2-FCP-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0,1,2],xmm3[3] diff --git a/llvm/test/CodeGen/X86/vector-interleaved-store-i32-stride-7.ll b/llvm/test/CodeGen/X86/vector-interleaved-store-i32-stride-7.ll index bead2c94cf121..71d4641ecc8f1 100644 --- a/llvm/test/CodeGen/X86/vector-interleaved-store-i32-stride-7.ll +++ b/llvm/test/CodeGen/X86/vector-interleaved-store-i32-stride-7.ll @@ -650,7 +650,7 @@ define void @store_i32_stride7_vf4(ptr %in.vecptr0, ptr %in.vecptr1, ptr %in.vec ; AVX2-FCP-NEXT: vbroadcastsd {{.*#+}} ymm3 = [7,3,7,3,7,3,7,3] ; AVX2-FCP-NEXT: vpermps %ymm6, %ymm3, %ymm3 ; AVX2-FCP-NEXT: vshufps {{.*#+}} xmm1 = xmm1[3,3,3,3] -; AVX2-FCP-NEXT: vblendps {{.*#+}} xmm1 = xmm1[0],xmm3[1,2,3] +; AVX2-FCP-NEXT: vmovss {{.*#+}} xmm1 = xmm1[0],xmm3[1,2,3] ; AVX2-FCP-NEXT: vmovaps %ymm2, (%rax) ; AVX2-FCP-NEXT: vmovaps %ymm4, 64(%rax) ; AVX2-FCP-NEXT: vmovaps %ymm7, 32(%rax) diff --git a/llvm/test/CodeGen/X86/vector-interleaved-store-i64-stride-5.ll b/llvm/test/CodeGen/X86/vector-interleaved-store-i64-stride-5.ll index f41123c5c3cfd..de94a3547b4bb 100644 --- a/llvm/test/CodeGen/X86/vector-interleaved-store-i64-stride-5.ll +++ b/llvm/test/CodeGen/X86/vector-interleaved-store-i64-stride-5.ll @@ -322,7 +322,7 @@ define void @store_i64_stride5_vf4(ptr %in.vecptr0, ptr %in.vecptr1, ptr %in.vec ; AVX-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm0 ; AVX-NEXT: vbroadcastsd 8(%rsi), %ymm6 ; AVX-NEXT: vblendpd {{.*#+}} ymm0 = ymm0[0,1],ymm6[2],ymm0[3] -; AVX-NEXT: vblendpd {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3] +; AVX-NEXT: vmovsd {{.*#+}} ymm0 = ymm1[0],ymm0[1] ; AVX-NEXT: vunpcklpd {{.*#+}} xmm1 = xmm5[0],mem[0] ; AVX-NEXT: vmovaps (%rdi), %xmm5 ; AVX-NEXT: vunpcklpd {{.*#+}} xmm5 = xmm5[0],mem[0] @@ -762,7 +762,7 @@ define void @store_i64_stride5_vf8(ptr %in.vecptr0, ptr %in.vecptr1, ptr %in.vec ; AVX-NEXT: vbroadcastsd 40(%rsi), %ymm13 ; AVX-NEXT: vblendpd {{.*#+}} ymm9 = ymm9[0,1],ymm13[2,3] ; AVX-NEXT: vblendpd {{.*#+}} ymm9 = ymm9[0,1,2],ymm12[3] -; AVX-NEXT: vblendpd {{.*#+}} ymm9 = ymm5[0],ymm9[1,2,3] +; AVX-NEXT: vmovsd {{.*#+}} ymm9 = ymm5[0],ymm9[1] ; AVX-NEXT: vpermilps {{.*#+}} xmm12 = mem[2,3,2,3] ; AVX-NEXT: vunpcklpd {{.*#+}} ymm13 = ymm1[0],mem[0],ymm1[2],mem[2] ; AVX-NEXT: vblendps {{.*#+}} ymm12 = ymm12[0,1,2,3],ymm13[4,5,6,7] @@ -1747,7 +1747,7 @@ define void @store_i64_stride5_vf16(ptr %in.vecptr0, ptr %in.vecptr1, ptr %in.ve ; AVX-NEXT: vbroadcastsd 56(%rcx), %ymm8 ; AVX-NEXT: vblendpd {{.*#+}} ymm6 = ymm6[0,1],ymm8[2,3] ; AVX-NEXT: vmovapd 32(%r8), %ymm8 -; AVX-NEXT: vblendpd {{.*#+}} ymm9 = ymm8[0],ymm13[1,2,3] +; AVX-NEXT: vmovsd {{.*#+}} ymm9 = ymm8[0],ymm13[1] ; AVX-NEXT: vmovupd %ymm9, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill ; AVX-NEXT: vblendpd {{.*#+}} ymm9 = ymm15[0],ymm8[1],ymm15[2,3] ; AVX-NEXT: vmovupd %ymm9, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill @@ -1773,7 +1773,7 @@ define void @store_i64_stride5_vf16(ptr %in.vecptr0, ptr %in.vecptr1, ptr %in.ve ; AVX-NEXT: vmovapd 96(%r8), %ymm0 ; AVX-NEXT: vblendpd $13, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm4 # 32-byte Folded Reload ; AVX-NEXT: # ymm4 = mem[0],ymm0[1],mem[2,3] -; AVX-NEXT: vblendpd {{.*#+}} ymm3 = ymm0[0],ymm3[1,2,3] +; AVX-NEXT: vmovsd {{.*#+}} ymm3 = ymm0[0],ymm3[1] ; AVX-NEXT: vblendpd {{.*#+}} ymm9 = ymm9[0,1],ymm0[2],ymm9[3] ; AVX-NEXT: vblendpd {{.*#+}} ymm2 = ymm2[0,1,2],ymm0[3] ; AVX-NEXT: vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm14, %xmm1 # 16-byte Folded Reload @@ -3750,7 +3750,7 @@ define void @store_i64_stride5_vf32(ptr %in.vecptr0, ptr %in.vecptr1, ptr %in.ve ; AVX-NEXT: vbroadcastsd 248(%rcx), %ymm2 ; AVX-NEXT: vblendpd {{.*#+}} ymm1 = ymm1[0,1],ymm2[2,3] ; AVX-NEXT: vmovapd 224(%r8), %ymm5 -; AVX-NEXT: vblendpd {{.*#+}} ymm2 = ymm5[0],ymm11[1,2,3] +; AVX-NEXT: vmovsd {{.*#+}} ymm2 = ymm5[0],ymm11[1] ; AVX-NEXT: vmovupd %ymm2, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill ; AVX-NEXT: vblendpd {{.*#+}} ymm2 = ymm6[0],ymm5[1],ymm6[2,3] ; AVX-NEXT: vmovupd %ymm2, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill diff --git a/llvm/test/CodeGen/X86/vector-shuffle-128-v2.ll b/llvm/test/CodeGen/X86/vector-shuffle-128-v2.ll index 1d389f9817229..8679c262e0bf0 100644 --- a/llvm/test/CodeGen/X86/vector-shuffle-128-v2.ll +++ b/llvm/test/CodeGen/X86/vector-shuffle-128-v2.ll @@ -877,7 +877,7 @@ define <2 x i64> @shuffle_v2i64_bitcast_z123(<2 x i64> %x) { ; AVX-LABEL: shuffle_v2i64_bitcast_z123: ; AVX: # %bb.0: ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; AVX-NEXT: retq %bitcast32 = bitcast <2 x i64> %x to <4 x float> %shuffle32 = shufflevector <4 x float> %bitcast32, <4 x float> , <4 x i32> diff --git a/llvm/test/CodeGen/X86/vector-shuffle-128-v4.ll b/llvm/test/CodeGen/X86/vector-shuffle-128-v4.ll index 0eb72c8bc0be4..e1eb1a6704e39 100644 --- a/llvm/test/CodeGen/X86/vector-shuffle-128-v4.ll +++ b/llvm/test/CodeGen/X86/vector-shuffle-128-v4.ll @@ -506,7 +506,7 @@ define <4 x i32> @shuffle_v4i32_4012(<4 x i32> %a, <4 x i32> %b) { ; AVX1OR2-LABEL: shuffle_v4i32_4012: ; AVX1OR2: # %bb.0: ; AVX1OR2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,0,1,2] -; AVX1OR2-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX1OR2-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; AVX1OR2-NEXT: retq ; ; AVX512VL-LABEL: shuffle_v4i32_4012: @@ -618,7 +618,7 @@ define <4 x float> @shuffle_v4f32_4zzz(<4 x float> %a) { ; AVX-LABEL: shuffle_v4f32_4zzz: ; AVX: # %bb.0: ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> ret <4 x float> %shuffle @@ -1164,7 +1164,7 @@ define <4 x i32> @shuffle_v4i32_4zzz(<4 x i32> %a) { ; AVX-LABEL: shuffle_v4i32_4zzz: ; AVX: # %bb.0: ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> ret <4 x i32> %shuffle @@ -1202,14 +1202,14 @@ define <4 x i32> @shuffle_v4i32_z4zz(<4 x i32> %a) { ; AVX1-LABEL: shuffle_v4i32_z4zz: ; AVX1: # %bb.0: ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX1-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX1-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,0,1,1] ; AVX1-NEXT: retq ; ; AVX2-SLOW-LABEL: shuffle_v4i32_z4zz: ; AVX2-SLOW: # %bb.0: ; AVX2-SLOW-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX2-SLOW-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX2-SLOW-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,0,1,1] ; AVX2-SLOW-NEXT: retq ; @@ -1258,14 +1258,14 @@ define <4 x i32> @shuffle_v4i32_zz4z(<4 x i32> %a) { ; AVX1-LABEL: shuffle_v4i32_zz4z: ; AVX1: # %bb.0: ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX1-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX1-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,1,0,1] ; AVX1-NEXT: retq ; ; AVX2-SLOW-LABEL: shuffle_v4i32_zz4z: ; AVX2-SLOW: # %bb.0: ; AVX2-SLOW-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX2-SLOW-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX2-SLOW-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,1,0,1] ; AVX2-SLOW-NEXT: retq ; @@ -2138,7 +2138,7 @@ define <4 x float> @insert_reg_and_zero_v4f32(float %a) { ; AVX-LABEL: insert_reg_and_zero_v4f32: ; AVX: # %bb.0: ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq %v = insertelement <4 x float> poison, float %a, i32 0 %shuffle = shufflevector <4 x float> %v, <4 x float> zeroinitializer, <4 x i32> diff --git a/llvm/test/CodeGen/X86/vector-shuffle-256-v4.ll b/llvm/test/CodeGen/X86/vector-shuffle-256-v4.ll index d848a8b879215..94fc982d87e50 100644 --- a/llvm/test/CodeGen/X86/vector-shuffle-256-v4.ll +++ b/llvm/test/CodeGen/X86/vector-shuffle-256-v4.ll @@ -2376,33 +2376,21 @@ define <4 x i64> @shuffle_v4i64_0zzz_pgso(<4 x i64> %a) !prof !14 { } define <8 x float> @shuffle_v8f32_0zzzzzzz_pgso(<8 x float> %a) !prof !14 { -; AVX1OR2-LABEL: shuffle_v8f32_0zzzzzzz_pgso: -; AVX1OR2: # %bb.0: -; AVX1OR2-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX1OR2-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] -; AVX1OR2-NEXT: retq -; -; AVX512VL-LABEL: shuffle_v8f32_0zzzzzzz_pgso: -; AVX512VL: # %bb.0: -; AVX512VL-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX512VL-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] -; AVX512VL-NEXT: retq +; ALL-LABEL: shuffle_v8f32_0zzzzzzz_pgso: +; ALL: # %bb.0: +; ALL-NEXT: vxorps %xmm1, %xmm1, %xmm1 +; ALL-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; ALL-NEXT: retq %b = shufflevector <8 x float> %a, <8 x float> zeroinitializer, <8 x i32> ret <8 x float> %b } define <8 x i32> @shuffle_v8i32_0zzzzzzz_pgso(<8 x i32> %a) !prof !14 { -; AVX1OR2-LABEL: shuffle_v8i32_0zzzzzzz_pgso: -; AVX1OR2: # %bb.0: -; AVX1OR2-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX1OR2-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] -; AVX1OR2-NEXT: retq -; -; AVX512VL-LABEL: shuffle_v8i32_0zzzzzzz_pgso: -; AVX512VL: # %bb.0: -; AVX512VL-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX512VL-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] -; AVX512VL-NEXT: retq +; ALL-LABEL: shuffle_v8i32_0zzzzzzz_pgso: +; ALL: # %bb.0: +; ALL-NEXT: vxorps %xmm1, %xmm1, %xmm1 +; ALL-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; ALL-NEXT: retq %b = shufflevector <8 x i32> %a, <8 x i32> zeroinitializer, <8 x i32> ret <8 x i32> %b } diff --git a/llvm/test/CodeGen/X86/vector-shuffle-256-v8.ll b/llvm/test/CodeGen/X86/vector-shuffle-256-v8.ll index bd78dbded0705..2aa6a7ff325f2 100644 --- a/llvm/test/CodeGen/X86/vector-shuffle-256-v8.ll +++ b/llvm/test/CodeGen/X86/vector-shuffle-256-v8.ll @@ -191,7 +191,7 @@ define <8 x float> @shuffle_v8f32_00500000(<8 x float> %a, <8 x float> %b) { ; AVX1-LABEL: shuffle_v8f32_00500000: ; AVX1: # %bb.0: ; AVX1-NEXT: vperm2f128 {{.*#+}} ymm1 = ymm0[2,3,0,1] -; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7] +; AVX1-NEXT: vmovss {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3] ; AVX1-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[0,0,1,0,4,4,4,4] ; AVX1-NEXT: retq ; @@ -1422,14 +1422,14 @@ define <8 x float> @shuffle_v8f32_089abcde(<8 x float> %a, <8 x float> %b) { ; AVX1-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm1[2,3,0,1] ; AVX1-NEXT: vshufps {{.*#+}} ymm2 = ymm2[3,0],ymm1[0,0],ymm2[7,4],ymm1[4,4] ; AVX1-NEXT: vshufps {{.*#+}} ymm1 = ymm2[0,2],ymm1[1,2],ymm2[4,6],ymm1[5,6] -; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7] +; AVX1-NEXT: vmovss {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3] ; AVX1-NEXT: retq ; ; AVX2-LABEL: shuffle_v8f32_089abcde: ; AVX2: # %bb.0: ; AVX2-NEXT: vmovaps {{.*#+}} ymm2 = [u,0,1,2,3,4,5,6] ; AVX2-NEXT: vpermps %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7] +; AVX2-NEXT: vmovss {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3] ; AVX2-NEXT: retq ; ; AVX512VL-LABEL: shuffle_v8f32_089abcde: @@ -1821,7 +1821,7 @@ define <8 x i32> @shuffle_v8i32_00500000(<8 x i32> %a, <8 x i32> %b) { ; AVX1-LABEL: shuffle_v8i32_00500000: ; AVX1: # %bb.0: ; AVX1-NEXT: vperm2f128 {{.*#+}} ymm1 = ymm0[2,3,0,1] -; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7] +; AVX1-NEXT: vmovss {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3] ; AVX1-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[0,0,1,0,4,4,4,4] ; AVX1-NEXT: retq ; @@ -3121,14 +3121,14 @@ define <8 x i32> @shuffle_v8i32_089abcde(<8 x i32> %a, <8 x i32> %b) { ; AVX1-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm1[2,3,0,1] ; AVX1-NEXT: vshufps {{.*#+}} ymm2 = ymm2[3,0],ymm1[0,0],ymm2[7,4],ymm1[4,4] ; AVX1-NEXT: vshufps {{.*#+}} ymm1 = ymm2[0,2],ymm1[1,2],ymm2[4,6],ymm1[5,6] -; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7] +; AVX1-NEXT: vmovss {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3] ; AVX1-NEXT: retq ; ; AVX2-LABEL: shuffle_v8i32_089abcde: ; AVX2: # %bb.0: ; AVX2-NEXT: vmovaps {{.*#+}} ymm2 = [u,0,1,2,3,4,5,6] ; AVX2-NEXT: vpermps %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7] +; AVX2-NEXT: vmovss {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3] ; AVX2-NEXT: retq ; ; AVX512VL-SLOW-LABEL: shuffle_v8i32_089abcde: @@ -3402,7 +3402,7 @@ define <8 x i32> @shuffle_v8i32_0dcd3f14(<8 x i32> %a, <8 x i32> %b) { ; AVX1-LABEL: shuffle_v8i32_0dcd3f14: ; AVX1: # %bb.0: ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 -; AVX1-NEXT: vblendps {{.*#+}} xmm2 = xmm2[0],xmm0[1,2,3] +; AVX1-NEXT: vmovss {{.*#+}} xmm2 = xmm2[0],xmm0[1,2,3] ; AVX1-NEXT: vshufps {{.*#+}} xmm2 = xmm2[3,1,1,0] ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 ; AVX1-NEXT: vperm2f128 {{.*#+}} ymm1 = ymm1[2,3,2,3] diff --git a/llvm/test/CodeGen/X86/vector-shuffle-combining-avx2.ll b/llvm/test/CodeGen/X86/vector-shuffle-combining-avx2.ll index 38920aa5d7a12..f4f4842e4c69d 100644 --- a/llvm/test/CodeGen/X86/vector-shuffle-combining-avx2.ll +++ b/llvm/test/CodeGen/X86/vector-shuffle-combining-avx2.ll @@ -435,7 +435,7 @@ define <8 x float> @combine_pshufb_as_vzmovl_32(<8 x float> %a0) { ; CHECK-LABEL: combine_pshufb_as_vzmovl_32: ; CHECK: # %bb.0: ; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; CHECK-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; CHECK-NEXT: ret{{[l|q]}} %1 = bitcast <8 x float> %a0 to <32 x i8> %2 = call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %1, <32 x i8> ) diff --git a/llvm/test/CodeGen/X86/vector-shuffle-combining-ssse3.ll b/llvm/test/CodeGen/X86/vector-shuffle-combining-ssse3.ll index 12d494c32b656..0570e2f580c1b 100644 --- a/llvm/test/CodeGen/X86/vector-shuffle-combining-ssse3.ll +++ b/llvm/test/CodeGen/X86/vector-shuffle-combining-ssse3.ll @@ -75,7 +75,7 @@ define <4 x float> @combine_pshufb_as_movss(<4 x float> %a0, <4 x float> %a1) { ; ; AVX-LABEL: combine_pshufb_as_movss: ; AVX: # %bb.0: -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; AVX-NEXT: retq %1 = shufflevector <4 x float> %a0, <4 x float> %a1, <4 x i32> %2 = bitcast <4 x float> %1 to <16 x i8> @@ -137,7 +137,7 @@ define <4 x float> @combine_pshufb_as_vzmovl_32(<4 x float> %a0) { ; AVX-LABEL: combine_pshufb_as_vzmovl_32: ; AVX: # %bb.0: ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq %1 = bitcast <4 x float> %a0 to <16 x i8> %2 = call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %1, <16 x i8> ) diff --git a/llvm/test/CodeGen/X86/vector-shuffle-combining-xop.ll b/llvm/test/CodeGen/X86/vector-shuffle-combining-xop.ll index f53c7a3370174..e8bf5ec2b49a6 100644 --- a/llvm/test/CodeGen/X86/vector-shuffle-combining-xop.ll +++ b/llvm/test/CodeGen/X86/vector-shuffle-combining-xop.ll @@ -106,7 +106,7 @@ define <4 x float> @combine_vpermil2ps_blend_with_zero(<4 x float> %a0, <4 x flo ; CHECK-LABEL: combine_vpermil2ps_blend_with_zero: ; CHECK: # %bb.0: ; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; CHECK-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; CHECK-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; CHECK-NEXT: ret{{[l|q]}} %res0 = call <4 x float> @llvm.x86.xop.vpermil2ps(<4 x float> %a0, <4 x float> %a1, <4 x i32> , i8 2) ret <4 x float> %res0 diff --git a/llvm/test/CodeGen/X86/vector-zmov.ll b/llvm/test/CodeGen/X86/vector-zmov.ll index 09835d797d172..2f84723b3c081 100644 --- a/llvm/test/CodeGen/X86/vector-zmov.ll +++ b/llvm/test/CodeGen/X86/vector-zmov.ll @@ -63,7 +63,7 @@ define <4 x i32> @load_zmov_4i32_to_0zzz_volatile(ptr%ptr) { ; AVX: # %bb.0: # %entry ; AVX-NEXT: vmovaps (%rdi), %xmm0 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq entry: %X = load volatile <4 x i32>, ptr %ptr diff --git a/llvm/test/CodeGen/X86/vselect.ll b/llvm/test/CodeGen/X86/vselect.ll index be6ee8f689958..9851fe64847de 100644 --- a/llvm/test/CodeGen/X86/vselect.ll +++ b/llvm/test/CodeGen/X86/vselect.ll @@ -313,7 +313,7 @@ define <4 x float> @test18(<4 x float> %a, <4 x float> %b) { ; ; AVX-LABEL: test18: ; AVX: # %bb.0: -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; AVX-NEXT: retq %1 = select <4 x i1> , <4 x float> %a, <4 x float> %b ret <4 x float> %1 @@ -332,7 +332,7 @@ define <4 x i32> @test19(<4 x i32> %a, <4 x i32> %b) { ; ; AVX-LABEL: test19: ; AVX: # %bb.0: -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; AVX-NEXT: retq %1 = select <4 x i1> , <4 x i32> %a, <4 x i32> %b ret <4 x i32> %1 @@ -390,7 +390,7 @@ define <4 x float> @test22(<4 x float> %a, <4 x float> %b) { ; ; AVX-LABEL: test22: ; AVX: # %bb.0: -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq %1 = select <4 x i1> , <4 x float> %a, <4 x float> %b ret <4 x float> %1 @@ -410,7 +410,7 @@ define <4 x i32> @test23(<4 x i32> %a, <4 x i32> %b) { ; ; AVX-LABEL: test23: ; AVX: # %bb.0: -; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] +; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] ; AVX-NEXT: retq %1 = select <4 x i1> , <4 x i32> %a, <4 x i32> %b ret <4 x i32> %1 From 135e8bd9b50ca36b9d65e8cb4d9353fd3fa59c84 Mon Sep 17 00:00:00 2001 From: william Date: Sun, 8 Jun 2025 22:49:48 +0800 Subject: [PATCH 2/6] [X86] Tune X86FixupInstTuning to improve scheduling for MOVSS/D blend patterns --- llvm/lib/Target/X86/X86FixupInstTuning.cpp | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/llvm/lib/Target/X86/X86FixupInstTuning.cpp b/llvm/lib/Target/X86/X86FixupInstTuning.cpp index 7f4d73e89f472..748ebcc8a5569 100644 --- a/llvm/lib/Target/X86/X86FixupInstTuning.cpp +++ b/llvm/lib/Target/X86/X86FixupInstTuning.cpp @@ -222,8 +222,6 @@ bool X86FixupInstTuningPass::processInstruction( return ProcessUNPCKToIntDomain(NewOpc); }; - - auto ProcessBLENDToMOV = [&](unsigned MovOpc) -> bool { if (!MI.getOperand(NumOperands - 1).isImm() || MI.getOperand(NumOperands - 1).getImm() != 1) @@ -237,12 +235,7 @@ bool X86FixupInstTuningPass::processInstruction( MI.removeOperand(NumOperands - 1); return true; }; - - - - switch (Opc) { - case X86::VBLENDPSrri: case X86::VBLENDPSYrri: case X86::VBLENDMPSZ128rrkz: @@ -253,7 +246,6 @@ bool X86FixupInstTuningPass::processInstruction( return false; return ProcessBLENDToMOV(X86::VMOVSSrr); } - case X86::VBLENDPDrri: case X86::VBLENDPDYrri: case X86::VBLENDMPDZ128rrkz: @@ -264,11 +256,6 @@ bool X86FixupInstTuningPass::processInstruction( return false; return ProcessBLENDToMOV(X86::VMOVSDrr); } - - - - - case X86::VPERMILPDri: return ProcessVPERMILPDri(X86::VSHUFPDrri); case X86::VPERMILPDYri: From 934de0305b0678eca16da6a6d8089feea9df85e3 Mon Sep 17 00:00:00 2001 From: william Date: Tue, 10 Jun 2025 20:41:38 +0800 Subject: [PATCH 3/6] [X86] Update llc tests after optimizing VBLENDPS to VMOVSS --- llvm/lib/Target/X86/X86FixupInstTuning.cpp | 16 ++++------------ llvm/test/CodeGen/X86/avx-insertelt.ll | 2 +- llvm/test/CodeGen/X86/masked_expandload.ll | 12 ++++++------ llvm/test/CodeGen/X86/oddsubvector.ll | 4 ++-- .../X86/vector-interleaved-store-i64-stride-5.ll | 10 +++++----- llvm/test/CodeGen/X86/vector-shuffle-256-v8.ll | 12 ++++++------ 6 files changed, 24 insertions(+), 32 deletions(-) diff --git a/llvm/lib/Target/X86/X86FixupInstTuning.cpp b/llvm/lib/Target/X86/X86FixupInstTuning.cpp index 748ebcc8a5569..044f51c985ec7 100644 --- a/llvm/lib/Target/X86/X86FixupInstTuning.cpp +++ b/llvm/lib/Target/X86/X86FixupInstTuning.cpp @@ -223,8 +223,7 @@ bool X86FixupInstTuningPass::processInstruction( }; auto ProcessBLENDToMOV = [&](unsigned MovOpc) -> bool { - if (!MI.getOperand(NumOperands - 1).isImm() || - MI.getOperand(NumOperands - 1).getImm() != 1) + if (MI.getOperand(NumOperands - 1).getImm() != 1) return false; bool Force = MF.getFunction().hasOptSize(); @@ -235,22 +234,15 @@ bool X86FixupInstTuningPass::processInstruction( MI.removeOperand(NumOperands - 1); return true; }; + switch (Opc) { - case X86::VBLENDPSrri: - case X86::VBLENDPSYrri: - case X86::VBLENDMPSZ128rrkz: - case X86::VBLENDMPSZ256rrkz: - case X86::VBLENDMPSZrrkz: { + case X86::VBLENDPSrri: { int Imm = MI.getOperand(NumOperands - 1).getImm(); if (Imm != 1) return false; return ProcessBLENDToMOV(X86::VMOVSSrr); } - case X86::VBLENDPDrri: - case X86::VBLENDPDYrri: - case X86::VBLENDMPDZ128rrkz: - case X86::VBLENDMPDZ256rrkz: - case X86::VBLENDMPDZrrkz: { + case X86::VBLENDPDrri: { int Imm = MI.getOperand(NumOperands - 1).getImm(); if (Imm != 1) return false; diff --git a/llvm/test/CodeGen/X86/avx-insertelt.ll b/llvm/test/CodeGen/X86/avx-insertelt.ll index 81f3058f19579..c23fb00843a8c 100644 --- a/llvm/test/CodeGen/X86/avx-insertelt.ll +++ b/llvm/test/CodeGen/X86/avx-insertelt.ll @@ -8,7 +8,7 @@ define <8 x float> @insert_f32_firstelt_of_low_subvector(<8 x float> %x, float % ; ALL-LABEL: insert_f32_firstelt_of_low_subvector: ; ALL: # %bb.0: ; ALL-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm1 -; ALL-NEXT: vmovss {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3] +; ALL-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3,4,5,6,7] ; ALL-NEXT: retq %i0 = insertelement <8 x float> %x, float %s, i32 0 ret <8 x float> %i0 diff --git a/llvm/test/CodeGen/X86/masked_expandload.ll b/llvm/test/CodeGen/X86/masked_expandload.ll index 234c7190256c4..b7fe8e053fa15 100644 --- a/llvm/test/CodeGen/X86/masked_expandload.ll +++ b/llvm/test/CodeGen/X86/masked_expandload.ll @@ -204,7 +204,7 @@ define <4 x double> @expandload_v4f64_v4i64(ptr %base, <4 x double> %src0, <4 x ; AVX1-NEXT: retq ; AVX1-NEXT: LBB1_1: ## %cond.load ; AVX1-NEXT: vmovsd (%rdi), %xmm1 ## xmm1 = mem[0],zero -; AVX1-NEXT: vmovsd {{.*#+}} ymm0 = ymm1[0],ymm0[1] +; AVX1-NEXT: vblendpd {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3] ; AVX1-NEXT: addq $8, %rdi ; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je LBB1_4 @@ -245,7 +245,7 @@ define <4 x double> @expandload_v4f64_v4i64(ptr %base, <4 x double> %src0, <4 x ; AVX2-NEXT: retq ; AVX2-NEXT: LBB1_1: ## %cond.load ; AVX2-NEXT: vmovsd (%rdi), %xmm1 ## xmm1 = mem[0],zero -; AVX2-NEXT: vmovsd {{.*#+}} ymm0 = ymm1[0],ymm0[1] +; AVX2-NEXT: vblendpd {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3] ; AVX2-NEXT: addq $8, %rdi ; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je LBB1_4 @@ -2111,7 +2111,7 @@ define <32 x float> @expandload_v32f32_v32i32(ptr %base, <32 x float> %src0, <32 ; AVX1-NEXT: retq ; AVX1-NEXT: LBB8_1: ## %cond.load ; AVX1-NEXT: vmovss (%rdi), %xmm4 ## xmm4 = mem[0],zero,zero,zero -; AVX1-NEXT: vmovss {{.*#+}} ymm0 = ymm4[0],ymm0[1,2,3] +; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm4[0],ymm0[1,2,3,4,5,6,7] ; AVX1-NEXT: addq $4, %rdi ; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je LBB8_4 @@ -2159,7 +2159,7 @@ define <32 x float> @expandload_v32f32_v32i32(ptr %base, <32 x float> %src0, <32 ; AVX1-NEXT: je LBB8_18 ; AVX1-NEXT: LBB8_17: ## %cond.load29 ; AVX1-NEXT: vmovss (%rdi), %xmm4 ## xmm4 = mem[0],zero,zero,zero -; AVX1-NEXT: vmovss {{.*#+}} ymm1 = ymm4[0],ymm1[1,2,3] +; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm4[0],ymm1[1,2,3,4,5,6,7] ; AVX1-NEXT: addq $4, %rdi ; AVX1-NEXT: testl $512, %eax ## imm = 0x200 ; AVX1-NEXT: je LBB8_20 @@ -2207,7 +2207,7 @@ define <32 x float> @expandload_v32f32_v32i32(ptr %base, <32 x float> %src0, <32 ; AVX1-NEXT: je LBB8_34 ; AVX1-NEXT: LBB8_33: ## %cond.load61 ; AVX1-NEXT: vmovss (%rdi), %xmm4 ## xmm4 = mem[0],zero,zero,zero -; AVX1-NEXT: vmovss {{.*#+}} ymm2 = ymm4[0],ymm2[1,2,3] +; AVX1-NEXT: vblendps {{.*#+}} ymm2 = ymm4[0],ymm2[1,2,3,4,5,6,7] ; AVX1-NEXT: addq $4, %rdi ; AVX1-NEXT: testl $131072, %eax ## imm = 0x20000 ; AVX1-NEXT: je LBB8_36 @@ -2255,7 +2255,7 @@ define <32 x float> @expandload_v32f32_v32i32(ptr %base, <32 x float> %src0, <32 ; AVX1-NEXT: je LBB8_50 ; AVX1-NEXT: LBB8_49: ## %cond.load93 ; AVX1-NEXT: vmovss (%rdi), %xmm4 ## xmm4 = mem[0],zero,zero,zero -; AVX1-NEXT: vmovss {{.*#+}} ymm3 = ymm4[0],ymm3[1,2,3] +; AVX1-NEXT: vblendps {{.*#+}} ymm3 = ymm4[0],ymm3[1,2,3,4,5,6,7] ; AVX1-NEXT: addq $4, %rdi ; AVX1-NEXT: testl $33554432, %eax ## imm = 0x2000000 ; AVX1-NEXT: je LBB8_52 diff --git a/llvm/test/CodeGen/X86/oddsubvector.ll b/llvm/test/CodeGen/X86/oddsubvector.ll index 3500a24dfed18..a1da40e7e7655 100644 --- a/llvm/test/CodeGen/X86/oddsubvector.ll +++ b/llvm/test/CodeGen/X86/oddsubvector.ll @@ -235,7 +235,7 @@ define void @PR42833() { ; AVX1-NEXT: vmovdqa c+144(%rip), %xmm3 ; AVX1-NEXT: vpaddd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 -; AVX1-NEXT: vmovss {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3] +; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3,4,5,6,7] ; AVX1-NEXT: vmovdqa d+144(%rip), %xmm2 ; AVX1-NEXT: vpsubd c+144(%rip), %xmm2, %xmm2 ; AVX1-NEXT: vmovups %ymm0, c+128(%rip) @@ -317,7 +317,7 @@ define void @PR42833() { ; XOP-NEXT: vmovdqa c+144(%rip), %xmm3 ; XOP-NEXT: vpaddd %xmm3, %xmm3, %xmm3 ; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 -; XOP-NEXT: vmovss {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3] +; XOP-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3,4,5,6,7] ; XOP-NEXT: vmovdqa d+144(%rip), %xmm2 ; XOP-NEXT: vpsubd c+144(%rip), %xmm2, %xmm2 ; XOP-NEXT: vmovups %ymm0, c+128(%rip) diff --git a/llvm/test/CodeGen/X86/vector-interleaved-store-i64-stride-5.ll b/llvm/test/CodeGen/X86/vector-interleaved-store-i64-stride-5.ll index de94a3547b4bb..f41123c5c3cfd 100644 --- a/llvm/test/CodeGen/X86/vector-interleaved-store-i64-stride-5.ll +++ b/llvm/test/CodeGen/X86/vector-interleaved-store-i64-stride-5.ll @@ -322,7 +322,7 @@ define void @store_i64_stride5_vf4(ptr %in.vecptr0, ptr %in.vecptr1, ptr %in.vec ; AVX-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm0 ; AVX-NEXT: vbroadcastsd 8(%rsi), %ymm6 ; AVX-NEXT: vblendpd {{.*#+}} ymm0 = ymm0[0,1],ymm6[2],ymm0[3] -; AVX-NEXT: vmovsd {{.*#+}} ymm0 = ymm1[0],ymm0[1] +; AVX-NEXT: vblendpd {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3] ; AVX-NEXT: vunpcklpd {{.*#+}} xmm1 = xmm5[0],mem[0] ; AVX-NEXT: vmovaps (%rdi), %xmm5 ; AVX-NEXT: vunpcklpd {{.*#+}} xmm5 = xmm5[0],mem[0] @@ -762,7 +762,7 @@ define void @store_i64_stride5_vf8(ptr %in.vecptr0, ptr %in.vecptr1, ptr %in.vec ; AVX-NEXT: vbroadcastsd 40(%rsi), %ymm13 ; AVX-NEXT: vblendpd {{.*#+}} ymm9 = ymm9[0,1],ymm13[2,3] ; AVX-NEXT: vblendpd {{.*#+}} ymm9 = ymm9[0,1,2],ymm12[3] -; AVX-NEXT: vmovsd {{.*#+}} ymm9 = ymm5[0],ymm9[1] +; AVX-NEXT: vblendpd {{.*#+}} ymm9 = ymm5[0],ymm9[1,2,3] ; AVX-NEXT: vpermilps {{.*#+}} xmm12 = mem[2,3,2,3] ; AVX-NEXT: vunpcklpd {{.*#+}} ymm13 = ymm1[0],mem[0],ymm1[2],mem[2] ; AVX-NEXT: vblendps {{.*#+}} ymm12 = ymm12[0,1,2,3],ymm13[4,5,6,7] @@ -1747,7 +1747,7 @@ define void @store_i64_stride5_vf16(ptr %in.vecptr0, ptr %in.vecptr1, ptr %in.ve ; AVX-NEXT: vbroadcastsd 56(%rcx), %ymm8 ; AVX-NEXT: vblendpd {{.*#+}} ymm6 = ymm6[0,1],ymm8[2,3] ; AVX-NEXT: vmovapd 32(%r8), %ymm8 -; AVX-NEXT: vmovsd {{.*#+}} ymm9 = ymm8[0],ymm13[1] +; AVX-NEXT: vblendpd {{.*#+}} ymm9 = ymm8[0],ymm13[1,2,3] ; AVX-NEXT: vmovupd %ymm9, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill ; AVX-NEXT: vblendpd {{.*#+}} ymm9 = ymm15[0],ymm8[1],ymm15[2,3] ; AVX-NEXT: vmovupd %ymm9, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill @@ -1773,7 +1773,7 @@ define void @store_i64_stride5_vf16(ptr %in.vecptr0, ptr %in.vecptr1, ptr %in.ve ; AVX-NEXT: vmovapd 96(%r8), %ymm0 ; AVX-NEXT: vblendpd $13, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm4 # 32-byte Folded Reload ; AVX-NEXT: # ymm4 = mem[0],ymm0[1],mem[2,3] -; AVX-NEXT: vmovsd {{.*#+}} ymm3 = ymm0[0],ymm3[1] +; AVX-NEXT: vblendpd {{.*#+}} ymm3 = ymm0[0],ymm3[1,2,3] ; AVX-NEXT: vblendpd {{.*#+}} ymm9 = ymm9[0,1],ymm0[2],ymm9[3] ; AVX-NEXT: vblendpd {{.*#+}} ymm2 = ymm2[0,1,2],ymm0[3] ; AVX-NEXT: vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm14, %xmm1 # 16-byte Folded Reload @@ -3750,7 +3750,7 @@ define void @store_i64_stride5_vf32(ptr %in.vecptr0, ptr %in.vecptr1, ptr %in.ve ; AVX-NEXT: vbroadcastsd 248(%rcx), %ymm2 ; AVX-NEXT: vblendpd {{.*#+}} ymm1 = ymm1[0,1],ymm2[2,3] ; AVX-NEXT: vmovapd 224(%r8), %ymm5 -; AVX-NEXT: vmovsd {{.*#+}} ymm2 = ymm5[0],ymm11[1] +; AVX-NEXT: vblendpd {{.*#+}} ymm2 = ymm5[0],ymm11[1,2,3] ; AVX-NEXT: vmovupd %ymm2, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill ; AVX-NEXT: vblendpd {{.*#+}} ymm2 = ymm6[0],ymm5[1],ymm6[2,3] ; AVX-NEXT: vmovupd %ymm2, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill diff --git a/llvm/test/CodeGen/X86/vector-shuffle-256-v8.ll b/llvm/test/CodeGen/X86/vector-shuffle-256-v8.ll index 2aa6a7ff325f2..56256b4945334 100644 --- a/llvm/test/CodeGen/X86/vector-shuffle-256-v8.ll +++ b/llvm/test/CodeGen/X86/vector-shuffle-256-v8.ll @@ -191,7 +191,7 @@ define <8 x float> @shuffle_v8f32_00500000(<8 x float> %a, <8 x float> %b) { ; AVX1-LABEL: shuffle_v8f32_00500000: ; AVX1: # %bb.0: ; AVX1-NEXT: vperm2f128 {{.*#+}} ymm1 = ymm0[2,3,0,1] -; AVX1-NEXT: vmovss {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3] +; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7] ; AVX1-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[0,0,1,0,4,4,4,4] ; AVX1-NEXT: retq ; @@ -1422,14 +1422,14 @@ define <8 x float> @shuffle_v8f32_089abcde(<8 x float> %a, <8 x float> %b) { ; AVX1-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm1[2,3,0,1] ; AVX1-NEXT: vshufps {{.*#+}} ymm2 = ymm2[3,0],ymm1[0,0],ymm2[7,4],ymm1[4,4] ; AVX1-NEXT: vshufps {{.*#+}} ymm1 = ymm2[0,2],ymm1[1,2],ymm2[4,6],ymm1[5,6] -; AVX1-NEXT: vmovss {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3] +; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7] ; AVX1-NEXT: retq ; ; AVX2-LABEL: shuffle_v8f32_089abcde: ; AVX2: # %bb.0: ; AVX2-NEXT: vmovaps {{.*#+}} ymm2 = [u,0,1,2,3,4,5,6] ; AVX2-NEXT: vpermps %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vmovss {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3] +; AVX2-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7] ; AVX2-NEXT: retq ; ; AVX512VL-LABEL: shuffle_v8f32_089abcde: @@ -1821,7 +1821,7 @@ define <8 x i32> @shuffle_v8i32_00500000(<8 x i32> %a, <8 x i32> %b) { ; AVX1-LABEL: shuffle_v8i32_00500000: ; AVX1: # %bb.0: ; AVX1-NEXT: vperm2f128 {{.*#+}} ymm1 = ymm0[2,3,0,1] -; AVX1-NEXT: vmovss {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3] +; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7] ; AVX1-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[0,0,1,0,4,4,4,4] ; AVX1-NEXT: retq ; @@ -3121,14 +3121,14 @@ define <8 x i32> @shuffle_v8i32_089abcde(<8 x i32> %a, <8 x i32> %b) { ; AVX1-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm1[2,3,0,1] ; AVX1-NEXT: vshufps {{.*#+}} ymm2 = ymm2[3,0],ymm1[0,0],ymm2[7,4],ymm1[4,4] ; AVX1-NEXT: vshufps {{.*#+}} ymm1 = ymm2[0,2],ymm1[1,2],ymm2[4,6],ymm1[5,6] -; AVX1-NEXT: vmovss {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3] +; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7] ; AVX1-NEXT: retq ; ; AVX2-LABEL: shuffle_v8i32_089abcde: ; AVX2: # %bb.0: ; AVX2-NEXT: vmovaps {{.*#+}} ymm2 = [u,0,1,2,3,4,5,6] ; AVX2-NEXT: vpermps %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vmovss {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3] +; AVX2-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7] ; AVX2-NEXT: retq ; ; AVX512VL-SLOW-LABEL: shuffle_v8i32_089abcde: From 30577d58e462d89367d29bc9995921de42cfc1ae Mon Sep 17 00:00:00 2001 From: william Date: Tue, 10 Jun 2025 21:31:36 +0800 Subject: [PATCH 4/6] [X86] Update llc tests after optimizing VBLENDPS to VMOVSS --- llvm/lib/Target/X86/X86FixupInstTuning.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/llvm/lib/Target/X86/X86FixupInstTuning.cpp b/llvm/lib/Target/X86/X86FixupInstTuning.cpp index 044f51c985ec7..958a3a9ffdfda 100644 --- a/llvm/lib/Target/X86/X86FixupInstTuning.cpp +++ b/llvm/lib/Target/X86/X86FixupInstTuning.cpp @@ -225,9 +225,7 @@ bool X86FixupInstTuningPass::processInstruction( auto ProcessBLENDToMOV = [&](unsigned MovOpc) -> bool { if (MI.getOperand(NumOperands - 1).getImm() != 1) return false; - bool Force = MF.getFunction().hasOptSize(); - if (!Force && !NewOpcPreferable(MovOpc)) return false; MI.setDesc(TII->get(MovOpc)); From 1604a5e4989baaba8a490373929a6b1999d9486c Mon Sep 17 00:00:00 2001 From: william Date: Tue, 10 Jun 2025 21:42:49 +0800 Subject: [PATCH 5/6] [X86] Update llc tests after optimizing VBLENDPS to VMOVSS --- llvm/lib/Target/X86/X86FixupInstTuning.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/Target/X86/X86FixupInstTuning.cpp b/llvm/lib/Target/X86/X86FixupInstTuning.cpp index 958a3a9ffdfda..92b793f10a998 100644 --- a/llvm/lib/Target/X86/X86FixupInstTuning.cpp +++ b/llvm/lib/Target/X86/X86FixupInstTuning.cpp @@ -221,7 +221,7 @@ bool X86FixupInstTuningPass::processInstruction( auto ProcessUNPCKPS = [&](unsigned NewOpc) -> bool { return ProcessUNPCKToIntDomain(NewOpc); }; - + auto ProcessBLENDToMOV = [&](unsigned MovOpc) -> bool { if (MI.getOperand(NumOperands - 1).getImm() != 1) return false; From c40e46d2d45391ec3c0563d017f8363fee09d09e Mon Sep 17 00:00:00 2001 From: william Date: Thu, 12 Jun 2025 20:18:55 +0800 Subject: [PATCH 6/6] [X86] Update test case and code --- bolt/include/bolt/Core/BinaryBasicBlock.h | 5 +- bolt/include/bolt/Core/BinaryFunction.h | 12 + bolt/include/bolt/Core/MCPlusBuilder.h | 2 +- bolt/include/bolt/Passes/PAuthGadgetScanner.h | 4 +- bolt/include/bolt/Profile/DataAggregator.h | 14 +- bolt/include/bolt/Profile/DataReader.h | 15 +- .../include/bolt/Profile/ProfileYAMLMapping.h | 2 + bolt/lib/Core/BinaryFunction.cpp | 2 + bolt/lib/Core/HashUtilities.cpp | 1 + bolt/lib/Core/MCPlusBuilder.cpp | 10 +- bolt/lib/Passes/ProfileQualityStats.cpp | 3 + bolt/lib/Profile/DataAggregator.cpp | 67 +- bolt/lib/Profile/DataReader.cpp | 6 + bolt/lib/Profile/YAMLProfileReader.cpp | 1 + bolt/lib/Profile/YAMLProfileWriter.cpp | 6 +- .../Target/AArch64/AArch64MCPlusBuilder.cpp | 2 +- bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp | 2 +- bolt/test/AArch64/adr-relaxation.s | 1 - bolt/test/X86/pre-aggregated-perf.test | 33 +- bolt/test/X86/shrinkwrapping.test | 2 + clang-tools-extra/clang-doc/BitcodeReader.cpp | 6 +- clang-tools-extra/clang-doc/BitcodeWriter.cpp | 3 +- clang-tools-extra/clang-doc/CMakeLists.txt | 1 + clang-tools-extra/clang-doc/Generators.cpp | 2 + clang-tools-extra/clang-doc/Generators.h | 1 + clang-tools-extra/clang-doc/HTMLGenerator.cpp | 27 +- .../clang-doc/HTMLMustacheGenerator.cpp | 144 +- clang-tools-extra/clang-doc/JSONGenerator.cpp | 542 + clang-tools-extra/clang-doc/MDGenerator.cpp | 58 +- .../clang-doc/Representation.cpp | 56 + clang-tools-extra/clang-doc/Representation.h | 33 +- clang-tools-extra/clang-doc/Serialize.cpp | 3 +- clang-tools-extra/clang-doc/YAMLGenerator.cpp | 30 +- .../assets/namespace-template.mustache | 76 +- .../clang-doc/tool/ClangDocMain.cpp | 11 +- .../tool/ClangIncludeFixer.cpp | 2 - clang-tools-extra/clang-move/Move.h | 4 +- clang-tools-extra/clang-tidy/ClangTidy.cpp | 12 +- clang-tools-extra/clang-tidy/ClangTidyCheck.h | 1 - .../clang-tidy/ClangTidyDiagnosticConsumer.h | 9 +- .../clang-tidy/ClangTidyOptions.cpp | 3 +- .../clang-tidy/ClangTidyOptions.h | 4 +- .../ExpandModularHeadersPPCallbacks.cpp | 4 +- .../ExpandModularHeadersPPCallbacks.h | 8 +- .../clang-tidy/abseil/AbseilTidyModule.cpp | 8 +- .../clang-tidy/abseil/CleanupCtadCheck.cpp | 2 +- .../clang-tidy/abseil/DurationDivisionCheck.h | 2 +- .../abseil/NoInternalDependenciesCheck.cpp | 3 +- .../abseil/NoInternalDependenciesCheck.h | 2 +- .../clang-tidy/abseil/NoNamespaceCheck.cpp | 7 +- .../abseil/RedundantStrcatCallsCheck.cpp | 32 +- .../abseil/RedundantStrcatCallsCheck.h | 4 +- .../clang-tidy/abseil/StrCatAppendCheck.cpp | 14 +- .../clang-tidy/abseil/StrCatAppendCheck.h | 2 +- .../abseil/StringFindStrContainsCheck.cpp | 2 + .../clang-tidy/abseil/TimeSubtractionCheck.h | 2 +- .../abseil/UpgradeDurationConversionsCheck.h | 3 +- .../clang-tidy/altera/AlteraTidyModule.cpp | 2 +- .../altera/SingleWorkItemBarrierCheck.cpp | 6 +- .../altera/StructPackAlignCheck.cpp | 2 +- .../clang-tidy/altera/StructPackAlignCheck.h | 2 +- .../clang-tidy/altera/UnrollLoopsCheck.cpp | 4 +- .../clang-tidy/android/AndroidTidyModule.cpp | 5 +- .../clang-tidy/android/CloexecAcceptCheck.cpp | 9 +- .../clang-tidy/android/CloexecCheck.cpp | 2 +- .../clang-tidy/android/CloexecCreatCheck.cpp | 9 +- .../clang-tidy/android/CloexecFopenCheck.cpp | 9 +- .../clang-tidy/android/CloexecOpenCheck.cpp | 11 +- .../clang-tidy/android/CloexecPipe2Check.cpp | 8 +- .../clang-tidy/android/CloexecPipeCheck.cpp | 14 +- .../clang-tidy/android/CloexecSocketCheck.cpp | 11 +- .../clang-tidy/boost/BoostTidyModule.cpp | 2 +- .../clang-tidy/bugprone/BranchCloneCheck.cpp | 1 + .../bugprone/BugproneTidyModule.cpp | 1 + .../bugprone/ChainedComparisonCheck.cpp | 3 +- .../DynamicStaticInitializersCheck.cpp | 16 +- .../EasilySwappableParametersCheck.cpp | 10 +- .../bugprone/InaccurateEraseCheck.cpp | 12 +- .../bugprone/IncDecInConditionsCheck.cpp | 4 + .../bugprone/IncorrectRoundingsCheck.cpp | 2 +- .../clang-tidy/bugprone/InfiniteLoopCheck.cpp | 9 +- .../bugprone/LambdaFunctionNameCheck.cpp | 9 +- .../MisplacedOperatorInStrlenInAllocCheck.cpp | 2 +- .../MisplacedOperatorInStrlenInAllocCheck.h | 3 +- ...MisplacedPointerArithmeticInAllocCheck.cpp | 4 +- ...ltiLevelImplicitPointerConversionCheck.cpp | 11 + ...MultiLevelImplicitPointerConversionCheck.h | 10 +- .../MultipleNewInOneExpressionCheck.cpp | 10 +- .../bugprone/NotNullTerminatedResultCheck.cpp | 2 +- .../clang-tidy/bugprone/PosixReturnCheck.h | 2 +- .../RedundantBranchConditionCheck.cpp | 5 +- .../bugprone/SignalHandlerCheck.cpp | 12 +- .../bugprone/SpuriouslyWakeUpFunctionsCheck.h | 6 +- .../bugprone/StandaloneEmptyCheck.cpp | 3 +- .../StringLiteralWithEmbeddedNulCheck.cpp | 5 +- .../bugprone/StringviewNullptrCheck.cpp | 2 +- .../bugprone/SuspiciousEnumUsageCheck.h | 4 +- .../bugprone/SuspiciousMemsetUsageCheck.cpp | 3 +- .../bugprone/SuspiciousSemicolonCheck.cpp | 3 +- .../bugprone/UndelegatedConstructorCheck.cpp | 2 +- .../bugprone/UnhandledExceptionAtNewCheck.cpp | 3 + .../clang-tidy/bugprone/UnusedRaiiCheck.cpp | 4 +- .../clang-tidy/bugprone/UseAfterMoveCheck.cpp | 2 +- .../clang-tidy/cert/CERTTidyModule.cpp | 8 +- .../concurrency/ConcurrencyTidyModule.cpp | 4 +- .../CppCoreGuidelinesTidyModule.cpp | 1 + .../ProTypeMemberInitCheck.cpp | 54 +- .../cppcoreguidelines/SlicingCheck.h | 6 +- .../SpecialMemberFunctionsCheck.cpp | 3 +- .../SpecialMemberFunctionsCheck.h | 5 +- .../VirtualClassDestructorCheck.cpp | 4 + .../clang-tidy/darwin/AvoidSpinlockCheck.h | 4 +- .../clang-tidy/darwin/DarwinTidyModule.cpp | 5 +- .../clang-tidy/fuchsia/FuchsiaTidyModule.cpp | 2 +- .../fuchsia/MultipleInheritanceCheck.cpp | 27 +- .../StaticallyConstructedObjectsCheck.h | 2 +- .../clang-tidy/fuchsia/TrailingReturnCheck.h | 4 +- .../fuchsia/VirtualInheritanceCheck.cpp | 9 +- .../fuchsia/VirtualInheritanceCheck.h | 4 +- .../google/AvoidCStyleCastsCheck.cpp | 4 +- .../google/AvoidThrowingObjCExceptionCheck.h | 4 +- .../google/ExplicitConstructorCheck.cpp | 2 +- .../google/GlobalNamesInHeadersCheck.cpp | 2 +- .../google/GlobalVariableDeclarationCheck.cpp | 2 +- .../google/GlobalVariableDeclarationCheck.h | 4 +- .../clang-tidy/google/GoogleTidyModule.cpp | 6 +- .../clang-tidy/google/IntegerTypesCheck.cpp | 4 +- .../google/UnnamedNamespaceInHeaderCheck.cpp | 4 +- .../google/UsingNamespaceDirectiveCheck.cpp | 2 +- .../hicpp/ExceptionBaseclassCheck.h | 3 +- .../clang-tidy/hicpp/HICPPTidyModule.cpp | 2 +- .../hicpp/MultiwayPathsCoveredCheck.cpp | 2 +- .../linuxkernel/LinuxKernelTidyModule.cpp | 1 + .../linuxkernel/MustCheckErrsCheck.cpp | 3 +- .../clang-tidy/llvm/LLVMTidyModule.cpp | 2 +- .../PreferIsaOrDynCastInConditionalsCheck.cpp | 12 +- .../PreferIsaOrDynCastInConditionalsCheck.h | 5 +- .../llvmlibc/CalleeNamespaceCheck.cpp | 2 +- .../llvmlibc/LLVMLibcTidyModule.cpp | 1 + .../clang-tidy/misc/MiscTidyModule.cpp | 2 +- .../misc/ThrowByValueCatchByReferenceCheck.h | 2 +- .../clang-tidy/modernize/AvoidBindCheck.cpp | 6 +- .../modernize/DeprecatedIosBaseAliasesCheck.h | 4 +- .../clang-tidy/modernize/LoopConvertCheck.cpp | 6 +- .../clang-tidy/modernize/LoopConvertUtils.cpp | 5 +- .../clang-tidy/modernize/MacroToEnumCheck.cpp | 17 +- .../modernize/MakeSmartPtrCheck.cpp | 3 +- .../modernize/ModernizeTidyModule.cpp | 7 +- .../modernize/RedundantVoidArgCheck.cpp | 3 +- .../modernize/ReplaceAutoPtrCheck.cpp | 3 +- .../clang-tidy/modernize/UseAutoCheck.cpp | 19 +- .../modernize/UseConstraintsCheck.cpp | 2 +- .../clang-tidy/modernize/UseEmplaceCheck.cpp | 4 +- .../modernize/UseEqualsDefaultCheck.cpp | 4 +- .../modernize/UseEqualsDefaultCheck.h | 2 +- .../modernize/UseEqualsDeleteCheck.h | 2 +- .../UseIntegerSignComparisonCheck.cpp | 21 +- .../clang-tidy/modernize/UseNullptrCheck.cpp | 2 +- .../modernize/UseStartsEndsWithCheck.cpp | 4 + .../modernize/UseTrailingReturnTypeCheck.cpp | 159 +- .../modernize/UseTrailingReturnTypeCheck.h | 11 +- .../modernize/UseTransparentFunctorsCheck.h | 1 + .../modernize/UseUncaughtExceptionsCheck.cpp | 8 +- .../modernize/UseUncaughtExceptionsCheck.h | 7 +- .../clang-tidy/mpi/MPITidyModule.cpp | 2 +- .../clang-tidy/objc/AvoidNSErrorInitCheck.h | 4 +- .../objc/ForbiddenSubclassingCheck.cpp | 30 +- .../clang-tidy/objc/NSDateFormatterCheck.cpp | 2 +- .../clang-tidy/objc/ObjCTidyModule.cpp | 13 +- .../objc/PropertyDeclarationCheck.cpp | 2 +- .../openmp/ExceptionEscapeCheck.cpp | 3 +- .../clang-tidy/openmp/OpenMPTidyModule.cpp | 2 +- .../performance/FasterStringFindCheck.h | 2 +- .../performance/ForRangeCopyCheck.h | 2 +- .../ImplicitConversionInLoopCheck.cpp | 3 +- .../ImplicitConversionInLoopCheck.h | 6 +- .../InefficientVectorOperationCheck.cpp | 19 +- .../InefficientVectorOperationCheck.h | 2 +- .../performance/MoveConstArgCheck.cpp | 6 +- .../performance/PerformanceTidyModule.cpp | 1 + .../UnnecessaryCopyInitialization.cpp | 29 +- .../UnnecessaryCopyInitialization.h | 2 +- .../clang-tidy/plugin/ClangTidyPlugin.cpp | 1 + .../portability/PortabilityTidyModule.cpp | 1 + .../portability/SIMDIntrinsicsCheck.h | 2 +- .../readability/ConstReturnTypeCheck.h | 18 +- .../readability/ContainerSizeEmptyCheck.cpp | 31 +- .../ConvertMemberFunctionsToStatic.cpp | 7 +- ...onsistentDeclarationParameterNameCheck.cpp | 4 +- .../readability/MagicNumbersCheck.h | 7 +- .../MakeMemberFunctionConstCheck.cpp | 4 + .../MathMissingParenthesesCheck.cpp | 20 +- .../readability/NamespaceCommentCheck.cpp | 20 +- .../readability/NamespaceCommentCheck.h | 1 + .../readability/QualifiedAutoCheck.cpp | 7 +- .../readability/ReadabilityTidyModule.cpp | 1 + .../readability/RedundantDeclarationCheck.cpp | 4 + .../RedundantFunctionPtrDereferenceCheck.cpp | 6 +- .../RedundantFunctionPtrDereferenceCheck.h | 3 +- .../RedundantInlineSpecifierCheck.cpp | 4 +- .../readability/RedundantStringCStrCheck.cpp | 16 +- .../readability/SimplifySubscriptExprCheck.h | 2 +- .../clang-tidy/tool/ClangTidyMain.cpp | 9 +- .../clang-tidy/utils/IncludeSorter.cpp | 3 +- .../clang-tidy/utils/NamespaceAliaser.cpp | 11 +- .../utils/TransformerClangTidyCheck.cpp | 2 +- .../clang-tidy/utils/TypeTraits.cpp | 3 +- .../zircon/TemporaryObjectsCheck.cpp | 4 + .../clang-tidy/zircon/ZirconTidyModule.cpp | 2 +- clang-tools-extra/clangd/IncludeCleaner.cpp | 33 +- clang-tools-extra/clangd/IncludeCleaner.h | 10 +- clang-tools-extra/clangd/InlayHints.cpp | 7 +- clang-tools-extra/clangd/ModulesBuilder.cpp | 22 +- clang-tools-extra/clangd/ParsedAST.cpp | 5 +- .../clangd/test/module_dependencies.test | 95 + clang-tools-extra/clangd/tool/ClangdMain.cpp | 1 - .../clangd/unittests/IncludeCleanerTests.cpp | 47 +- .../clangd/unittests/InlayHintTests.cpp | 5 + .../unittests/PrerequisiteModulesTest.cpp | 12 +- clang-tools-extra/docs/ReleaseNotes.rst | 34 + ...ulti-level-implicit-pointer-conversion.rst | 8 + .../return-const-ref-from-parameter.rst | 2 +- .../checks/llvm/namespace-comment.rst | 6 + .../modernize/use-trailing-return-type.rst | 26 +- .../test/clang-doc/invalid-options.cpp | 2 +- .../test/clang-doc/json/class-template.cpp | 29 + .../test/clang-doc/json/class.cpp | 193 + .../clang-doc/json/function-specifiers.cpp | 25 + .../test/clang-doc/json/method-template.cpp | 40 + .../test/clang-doc/json/namespace.cpp | 107 + .../test/clang-doc/mustache-index.cpp | 75 + .../clang-doc/mustache-separate-namespace.cpp | 13 + .../test/clang-doc/templates.cpp | 16 +- .../multi-level-implicit-pointer-conversion.c | 11 + ...ace-comments-missing-nested-namespaces.cpp | 32 + ...readability-namespace-comments-missing.cpp | 40 + .../modernize/use-integer-sign-comparison.cpp | 78 + ...ng-return-type-transform-lambdas-cxx14.cpp | 24 + ...ng-return-type-transform-lambdas-cxx20.cpp | 35 + ...trailing-return-type-transform-lambdas.cpp | 89 + .../use-trailing-return-type-wrong-config.cpp | 5 + .../modernize/use-trailing-return-type.cpp | 2 - ...mber-functions-to-static-deducing-this.cpp | 22 + .../readability/math-missing-parentheses.cpp | 16 + .../unittests/clang-doc/BitcodeTest.cpp | 68 +- .../unittests/clang-doc/CMakeLists.txt | 1 + .../unittests/clang-doc/HTMLGeneratorTest.cpp | 20 +- .../clang-doc/HTMLMustacheGeneratorTest.cpp | 67 - .../unittests/clang-doc/JSONGeneratorTest.cpp | 247 + .../unittests/clang-doc/MDGeneratorTest.cpp | 56 +- .../unittests/clang-doc/MergeTest.cpp | 18 +- .../unittests/clang-doc/YAMLGeneratorTest.cpp | 122 +- clang/bindings/python/clang/cindex.py | 17 +- clang/docs/LanguageExtensions.rst | 75 + clang/docs/LibClang.rst | 48 +- clang/docs/OpenMPSupport.rst | 3 +- clang/docs/ReleaseNotes.rst | 19 +- clang/docs/UsersManual.rst | 17 +- clang/include/clang/AST/ASTNodeTraverser.h | 2 +- clang/include/clang/AST/Decl.h | 20 +- .../include/clang/AST/DeclContextInternals.h | 11 +- clang/include/clang/AST/ExprCXX.h | 54 +- clang/include/clang/AST/ExprConcepts.h | 8 +- clang/include/clang/AST/ExprObjC.h | 6 +- clang/include/clang/AST/GlobalDecl.h | 2 +- clang/include/clang/AST/RecursiveASTVisitor.h | 2 +- clang/include/clang/AST/Stmt.h | 111 +- clang/include/clang/AST/StmtCXX.h | 8 +- clang/include/clang/AST/StmtObjC.h | 10 +- clang/include/clang/AST/TemplateBase.h | 2 +- clang/include/clang/AST/Type.h | 83 +- clang/include/clang/AST/TypeProperties.td | 4 + .../include/clang/Basic/AArch64ACLETypes.def | 22 +- clang/include/clang/Basic/Attr.td | 111 +- clang/include/clang/Basic/AttrDocs.td | 86 +- clang/include/clang/Basic/Builtins.td | 6 + clang/include/clang/Basic/BuiltinsAMDGPU.def | 2 +- clang/include/clang/Basic/BuiltinsNVPTX.td | 1 + clang/include/clang/Basic/CodeGenOptions.def | 2 - clang/include/clang/Basic/CodeGenOptions.h | 4 + .../clang/Basic/DiagnosticDriverKinds.td | 4 + .../clang/Basic/DiagnosticSemaKinds.td | 37 +- clang/include/clang/Basic/IdentifierTable.h | 2 +- clang/include/clang/Basic/Specifiers.h | 5 +- clang/include/clang/Basic/arm_mve.td | 2 +- .../include/clang/Basic/riscv_andes_vector.td | 4 +- .../clang/Basic/riscv_sifive_vector.td | 10 +- clang/include/clang/Basic/riscv_vector.td | 248 +- .../clang/Basic/riscv_vector_common.td | 38 +- clang/include/clang/CIR/CIRGenerator.h | 2 + .../CIR/Dialect/Builder/CIRBaseBuilder.h | 7 + .../CIR/Dialect/IR/CIRAttrConstraints.td | 48 + .../include/clang/CIR/Dialect/IR/CIRAttrs.td | 45 + .../clang/CIR/Dialect/IR/CIRDataLayout.h | 10 +- clang/include/clang/CIR/Dialect/IR/CIROps.td | 136 +- .../include/clang/CIR/Dialect/IR/CIRTypes.td | 72 +- clang/include/clang/CIR/MissingFeatures.h | 19 +- .../clang/Driver}/CommonArgs.h | 11 + clang/include/clang/Driver/Options.td | 23 +- clang/include/clang/ExtractAPI/API.h | 2 +- clang/include/clang/Parse/Parser.h | 3 +- clang/include/clang/Sema/ParsedAttr.h | 3 - clang/include/clang/Sema/ParsedTemplate.h | 4 +- clang/include/clang/Sema/Redeclaration.h | 2 +- clang/include/clang/Sema/Sema.h | 25 +- clang/include/clang/Sema/SemaHLSL.h | 2 + clang/include/clang/Sema/SemaPseudoObject.h | 2 +- clang/include/clang/Sema/Template.h | 9 +- .../clang/StaticAnalyzer/Core/Checker.h | 14 - .../Core/PathSensitive/CheckerContext.h | 6 + .../clang/Support/RISCVVIntrinsicUtils.h | 48 +- clang/lib/APINotes/APINotesManager.cpp | 2 - clang/lib/APINotes/APINotesReader.cpp | 2 - clang/lib/AST/ASTContext.cpp | 4 +- clang/lib/AST/ByteCode/Context.cpp | 2 +- clang/lib/AST/ByteCode/Function.cpp | 4 +- clang/lib/AST/ByteCode/Function.h | 7 +- clang/lib/AST/ByteCode/Interp.cpp | 18 +- clang/lib/AST/ByteCode/InterpBuiltin.cpp | 720 +- clang/lib/AST/Decl.cpp | 12 +- clang/lib/AST/DeclPrinter.cpp | 4 +- clang/lib/AST/ExprCXX.cpp | 10 +- clang/lib/AST/ExprConstant.cpp | 93 +- clang/lib/AST/ItaniumMangle.cpp | 6 +- clang/lib/AST/MicrosoftMangle.cpp | 4 +- clang/lib/AST/Stmt.cpp | 8 +- clang/lib/AST/TemplateBase.cpp | 4 +- clang/lib/AST/Type.cpp | 37 +- clang/lib/AST/TypePrinter.cpp | 19 +- clang/lib/ASTMatchers/ASTMatchersInternal.cpp | 3 - clang/lib/ASTMatchers/Dynamic/Parser.cpp | 1 - clang/lib/ASTMatchers/Dynamic/Registry.cpp | 2 - .../lib/ASTMatchers/Dynamic/VariantValue.cpp | 1 - clang/lib/ASTMatchers/GtestMatchers.cpp | 5 - clang/lib/Analysis/CFG.cpp | 22 + clang/lib/Analysis/FlowSensitive/Formula.cpp | 2 +- clang/lib/Analysis/ThreadSafety.cpp | 6 +- clang/lib/Analysis/UnsafeBufferUsage.cpp | 23 +- clang/lib/Basic/Targets/AArch64.cpp | 4 +- clang/lib/Basic/Targets/AMDGPU.h | 3 +- clang/lib/Basic/Targets/ARM.cpp | 4 +- clang/lib/Basic/Targets/BPF.h | 2 +- clang/lib/Basic/Targets/LoongArch.h | 5 + clang/lib/Basic/Targets/Mips.cpp | 2 +- clang/lib/Basic/Targets/SPIR.h | 6 +- clang/lib/Basic/Targets/SystemZ.h | 2 +- clang/lib/Basic/Targets/X86.h | 29 +- clang/lib/CIR/CodeGen/Address.h | 14 + clang/lib/CIR/CodeGen/CIRGenBuilder.cpp | 12 + clang/lib/CIR/CodeGen/CIRGenBuilder.h | 41 + clang/lib/CIR/CodeGen/CIRGenCall.cpp | 99 +- clang/lib/CIR/CodeGen/CIRGenClass.cpp | 139 + clang/lib/CIR/CodeGen/CIRGenExpr.cpp | 140 +- clang/lib/CIR/CodeGen/CIRGenExprAggregate.cpp | 6 + clang/lib/CIR/CodeGen/CIRGenExprConstant.cpp | 29 +- clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp | 48 +- clang/lib/CIR/CodeGen/CIRGenFunction.cpp | 22 + clang/lib/CIR/CodeGen/CIRGenFunction.h | 57 + clang/lib/CIR/CodeGen/CIRGenFunctionInfo.h | 6 +- clang/lib/CIR/CodeGen/CIRGenModule.cpp | 368 +- clang/lib/CIR/CodeGen/CIRGenModule.h | 62 + clang/lib/CIR/CodeGen/CIRGenOpenACCClause.cpp | 141 +- clang/lib/CIR/CodeGen/CIRGenRecordLayout.h | 16 +- .../CIR/CodeGen/CIRGenRecordLayoutBuilder.cpp | 108 +- clang/lib/CIR/CodeGen/CIRGenStmtOpenACC.cpp | 16 +- clang/lib/CIR/CodeGen/CIRGenTypes.cpp | 53 +- clang/lib/CIR/CodeGen/CIRGenTypes.h | 10 + clang/lib/CIR/CodeGen/CIRGenValue.h | 85 +- clang/lib/CIR/CodeGen/CIRGenerator.cpp | 47 + clang/lib/CIR/CodeGen/CMakeLists.txt | 2 + clang/lib/CIR/Dialect/IR/CIRAttrs.cpp | 20 + clang/lib/CIR/Dialect/IR/CIRDataLayout.cpp | 22 + clang/lib/CIR/Dialect/IR/CIRDialect.cpp | 156 +- clang/lib/CIR/Dialect/IR/CIRMemorySlot.cpp | 2 +- clang/lib/CIR/Dialect/IR/CIRTypes.cpp | 29 +- clang/lib/CIR/Dialect/IR/CMakeLists.txt | 1 + .../Dialect/Transforms/CIRCanonicalize.cpp | 5 +- clang/lib/CIR/FrontendAction/CIRGenAction.cpp | 7 + .../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 183 +- .../CIR/Lowering/DirectToLLVM/LowerToLLVM.h | 30 + clang/lib/CodeGen/BackendUtil.cpp | 5 +- clang/lib/CodeGen/CGBuiltin.cpp | 28 +- clang/lib/CodeGen/CGCUDANV.cpp | 3 +- clang/lib/CodeGen/CGCall.cpp | 39 +- clang/lib/CodeGen/CGClass.cpp | 18 +- clang/lib/CodeGen/CGDebugInfo.cpp | 110 +- clang/lib/CodeGen/CGDebugInfo.h | 12 + clang/lib/CodeGen/CGDecl.cpp | 7 +- clang/lib/CodeGen/CGExpr.cpp | 335 +- clang/lib/CodeGen/CGExprCXX.cpp | 2 - clang/lib/CodeGen/CGExprConstant.cpp | 8 +- clang/lib/CodeGen/CGExprScalar.cpp | 100 +- clang/lib/CodeGen/CGHLSLBuiltins.cpp | 5 + clang/lib/CodeGen/CGHLSLRuntime.cpp | 42 +- clang/lib/CodeGen/CGHLSLRuntime.h | 1 + clang/lib/CodeGen/CGObjC.cpp | 7 +- clang/lib/CodeGen/CGOpenMPRuntime.cpp | 315 +- clang/lib/CodeGen/CGOpenMPRuntime.h | 12 + clang/lib/CodeGen/CGPointerAuth.cpp | 5 + clang/lib/CodeGen/CGStmtOpenMP.cpp | 11 +- clang/lib/CodeGen/CGVTables.cpp | 2 +- clang/lib/CodeGen/CodeGenFunction.cpp | 29 +- clang/lib/CodeGen/CodeGenFunction.h | 8 +- clang/lib/CodeGen/CodeGenModule.cpp | 22 +- clang/lib/CodeGen/CodeGenTBAA.cpp | 7 + clang/lib/CodeGen/CodeGenTypes.cpp | 2 +- clang/lib/CodeGen/CoverageMappingGen.cpp | 5 +- clang/lib/CodeGen/ItaniumCXXABI.cpp | 33 +- clang/lib/CodeGen/TargetBuiltins/ARM.cpp | 10 +- clang/lib/CodeGen/TargetInfo.cpp | 2 +- clang/lib/CodeGen/Targets/AArch64.cpp | 28 + clang/lib/CodeGen/Targets/AMDGPU.cpp | 6 +- clang/lib/CodeGen/Targets/NVPTX.cpp | 45 +- clang/lib/CodeGen/Targets/SPIR.cpp | 2 +- clang/lib/CodeGen/Targets/TCE.cpp | 2 +- clang/lib/Driver/Driver.cpp | 59 +- clang/lib/Driver/MultilibBuilder.cpp | 2 +- clang/lib/Driver/ToolChain.cpp | 2 +- clang/lib/Driver/ToolChains/AIX.cpp | 2 +- clang/lib/Driver/ToolChains/AMDGPU.cpp | 2 +- clang/lib/Driver/ToolChains/AVR.cpp | 2 +- clang/lib/Driver/ToolChains/Arch/AArch64.cpp | 2 +- .../lib/Driver/ToolChains/Arch/LoongArch.cpp | 2 +- clang/lib/Driver/ToolChains/Arch/Mips.cpp | 2 +- clang/lib/Driver/ToolChains/Arch/PPC.cpp | 2 +- clang/lib/Driver/ToolChains/Arch/RISCV.cpp | 2 +- clang/lib/Driver/ToolChains/BareMetal.cpp | 2 +- clang/lib/Driver/ToolChains/CSKYToolChain.cpp | 2 +- clang/lib/Driver/ToolChains/Clang.cpp | 199 +- clang/lib/Driver/ToolChains/CommonArgs.cpp | 165 +- clang/lib/Driver/ToolChains/CrossWindows.cpp | 2 +- clang/lib/Driver/ToolChains/Cuda.cpp | 2 +- clang/lib/Driver/ToolChains/Cygwin.cpp | 2 +- clang/lib/Driver/ToolChains/Darwin.cpp | 386 +- clang/lib/Driver/ToolChains/DragonFly.cpp | 2 +- clang/lib/Driver/ToolChains/Flang.cpp | 6 +- clang/lib/Driver/ToolChains/FreeBSD.cpp | 2 +- clang/lib/Driver/ToolChains/Fuchsia.cpp | 2 +- clang/lib/Driver/ToolChains/Gnu.cpp | 2 +- clang/lib/Driver/ToolChains/HIPAMD.cpp | 2 +- clang/lib/Driver/ToolChains/HIPSPV.cpp | 2 +- clang/lib/Driver/ToolChains/HIPUtility.cpp | 2 +- clang/lib/Driver/ToolChains/HLSL.cpp | 2 +- clang/lib/Driver/ToolChains/Haiku.cpp | 2 +- clang/lib/Driver/ToolChains/Hexagon.cpp | 2 +- clang/lib/Driver/ToolChains/Hurd.cpp | 2 +- .../lib/Driver/ToolChains/InterfaceStubs.cpp | 2 +- clang/lib/Driver/ToolChains/Linux.cpp | 2 +- clang/lib/Driver/ToolChains/MSP430.cpp | 2 +- clang/lib/Driver/ToolChains/MSVC.cpp | 2 +- clang/lib/Driver/ToolChains/MinGW.cpp | 2 +- clang/lib/Driver/ToolChains/NaCl.cpp | 2 +- clang/lib/Driver/ToolChains/NetBSD.cpp | 2 +- clang/lib/Driver/ToolChains/OHOS.cpp | 2 +- clang/lib/Driver/ToolChains/OpenBSD.cpp | 2 +- clang/lib/Driver/ToolChains/PS4CPU.cpp | 2 +- .../lib/Driver/ToolChains/RISCVToolchain.cpp | 2 +- clang/lib/Driver/ToolChains/SPIRV.cpp | 2 +- clang/lib/Driver/ToolChains/SPIRVOpenMP.cpp | 2 +- clang/lib/Driver/ToolChains/SYCL.cpp | 2 +- clang/lib/Driver/ToolChains/Solaris.cpp | 2 +- clang/lib/Driver/ToolChains/UEFI.cpp | 2 +- clang/lib/Driver/ToolChains/VEToolchain.cpp | 2 +- clang/lib/Driver/ToolChains/WebAssembly.cpp | 2 +- clang/lib/Driver/ToolChains/XCore.cpp | 2 +- clang/lib/Driver/ToolChains/ZOS.cpp | 2 +- clang/lib/Driver/XRayArgs.cpp | 2 +- clang/lib/Format/ContinuationIndenter.cpp | 1 - clang/lib/Format/TokenAnnotator.cpp | 55 +- clang/lib/Format/UnwrappedLineParser.cpp | 3 +- clang/lib/Frontend/FrontendAction.cpp | 2 +- clang/lib/Frontend/InitPreprocessor.cpp | 8 + clang/lib/Headers/amxmovrstransposeintrin.h | 2 +- .../lib/Headers/hlsl/hlsl_alias_intrinsics.h | 4 + clang/lib/Headers/hlsl/hlsl_spirv.h | 2 +- clang/lib/Headers/module.modulemap | 8 + clang/lib/Headers/movrsintrin.h | 2 +- clang/lib/Lex/DependencyDirectivesScanner.cpp | 9 + clang/lib/Lex/LiteralSupport.cpp | 20 +- clang/lib/Parse/ParseDecl.cpp | 9 +- clang/lib/Parse/ParseDeclCXX.cpp | 4 +- clang/lib/Parse/ParseHLSL.cpp | 1 + clang/lib/Sema/ParsedAttr.cpp | 3 +- clang/lib/Sema/Sema.cpp | 3 +- clang/lib/Sema/SemaCUDA.cpp | 17 +- clang/lib/Sema/SemaChecking.cpp | 45 + clang/lib/Sema/SemaDecl.cpp | 23 +- clang/lib/Sema/SemaDeclAttr.cpp | 117 +- clang/lib/Sema/SemaDeclCXX.cpp | 52 +- clang/lib/Sema/SemaExpr.cpp | 37 +- clang/lib/Sema/SemaExprCXX.cpp | 11 +- clang/lib/Sema/SemaExprObjC.cpp | 11 +- clang/lib/Sema/SemaHLSL.cpp | 27 + clang/lib/Sema/SemaInit.cpp | 2 +- clang/lib/Sema/SemaOpenMP.cpp | 43 +- clang/lib/Sema/SemaOverload.cpp | 54 +- clang/lib/Sema/SemaRISCV.cpp | 60 +- clang/lib/Sema/SemaSYCL.cpp | 2 +- clang/lib/Sema/SemaTemplate.cpp | 2 + .../lib/Sema/SemaTemplateInstantiateDecl.cpp | 10 +- clang/lib/Sema/SemaType.cpp | 65 +- clang/lib/Sema/SemaTypeTraits.cpp | 255 +- clang/lib/Serialization/ASTWriterDecl.cpp | 2 +- .../Checkers/CallAndMessageChecker.cpp | 7 +- .../Checkers/DynamicTypePropagation.cpp | 16 +- .../Checkers/GenericTaintChecker.cpp | 3 +- .../Checkers/LocalizationChecker.cpp | 4 +- .../Checkers/MPI-Checker/MPIChecker.cpp | 6 +- .../Checkers/MacOSKeychainAPIChecker.cpp | 3 +- .../StaticAnalyzer/Checkers/MallocChecker.cpp | 3 +- .../Checkers/NullabilityChecker.cpp | 13 +- .../RetainCountChecker/RetainCountChecker.cpp | 42 +- .../RetainCountChecker/RetainCountChecker.h | 19 +- .../Checkers/UnreachableCodeChecker.cpp | 2 +- .../Checkers/WebKit/ASTUtils.cpp | 25 + .../StaticAnalyzer/Checkers/WebKit/ASTUtils.h | 4 + .../Checkers/WebKit/PtrTypesSemantics.cpp | 13 + .../Checkers/WebKit/PtrTypesSemantics.h | 2 + .../WebKit/RawPtrRefCallArgsChecker.cpp | 4 + .../WebKit/RawPtrRefLocalVarsChecker.cpp | 3 + .../WebKit/RawPtrRefMemberChecker.cpp | 75 +- clang/lib/StaticAnalyzer/Core/BugReporter.cpp | 1 + clang/lib/StaticAnalyzer/Core/Checker.cpp | 8 - .../StaticAnalyzer/Core/CheckerHelpers.cpp | 16 +- clang/lib/Support/RISCVVIntrinsicUtils.cpp | 44 +- .../DependencyScanningFilesystem.cpp | 2 +- clang/test/AST/ast-dump-aarch64-neon-types.c | 22 +- clang/test/AST/ast-dump-type-callingconv.cpp | 11 + .../Checkers/WebKit/call-args-checked.cpp | 43 + .../WebKit/call-args-safe-functions.cpp | 27 +- .../Checkers/WebKit/objc-mock-types.h | 1 + .../Checkers/WebKit/unchecked-local-vars.cpp | 22 + .../Checkers/WebKit/unretained-members-arc.mm | 36 + .../Checkers/WebKit/unretained-members.mm | 25 + clang/test/Analysis/pch_crash.cpp | 28 - clang/test/Analysis/pch_macro.cpp | 50 + clang/test/C/C23/n3006.c | 113 + clang/test/C/C2y/n3353.c | 31 + clang/test/CIR/CodeGen/class.cpp | 102 + clang/test/CIR/CodeGen/complex.cpp | 29 + clang/test/CIR/CodeGen/ctor.cpp | 19 + clang/test/CIR/CodeGen/deferred-defs.cpp | 22 + clang/test/CIR/CodeGen/deferred-fn-defs.cpp | 38 + clang/test/CIR/CodeGen/dlti.c | 23 + clang/test/CIR/CodeGen/dlti_be.c | 23 + clang/test/CIR/CodeGen/enum.cpp | 16 + clang/test/CIR/CodeGen/forward-decls.cpp | 124 + clang/test/CIR/CodeGen/forward-enum.c | 16 + clang/test/CIR/CodeGen/namespace.cpp | 43 + .../CIR/CodeGen/template-specialization.cpp | 103 + clang/test/CIR/CodeGen/vector-ext.cpp | 50 + clang/test/CIR/CodeGen/vector.cpp | 107 +- clang/test/CIR/CodeGenOpenACC/combined-copy.c | 439 +- .../test/CIR/CodeGenOpenACC/combined-copy.cpp | 418 + clang/test/CIR/CodeGenOpenACC/combined.cpp | 174 + clang/test/CIR/CodeGenOpenACC/compute-copy.c | 361 +- .../test/CIR/CodeGenOpenACC/compute-copy.cpp | 346 + clang/test/CIR/CodeGenOpenACC/host_data.c | 55 + clang/test/CIR/CodeGenOpenACC/kernels.c | 90 + clang/test/CIR/CodeGenOpenACC/parallel.c | 91 + clang/test/CIR/CodeGenOpenACC/serial.c | 88 + clang/test/CIR/IR/complex.cir | 16 + clang/test/CIR/IR/invalid-complex.cir | 23 + clang/test/CIR/IR/invalid-vector.cir | 38 + clang/test/CIR/IR/struct.cir | 4 + clang/test/CIR/Lowering/func-simple.cpp | 8 +- .../vector-shuffle-dynamic-fold.cir | 31 + .../CIR/Transforms/vector-shuffle-fold.cir | 59 + .../CIR/Transforms/vector-ternary-fold.cir | 20 + clang/test/CXX/class.access/p4.cpp | 16 +- clang/test/CXX/drs/cwg24xx.cpp | 31 + clang/test/CXX/drs/cwg25xx.cpp | 20 + .../expr.prim.req/nested-requirement.cpp | 12 +- .../expr.prim.req/simple-requirement.cpp | 6 +- clang/test/CodeGen/AArch64/mixed-neon-types.c | 559 +- .../AArch64/struct-coerce-using-ptr.cpp | 50 +- clang/test/CodeGen/LoongArch/bfloat-abi.c | 532 + .../test/CodeGen/LoongArch/bfloat-mangle.cpp | 12 + .../zvfhmin-error.c | 2 +- clang/test/CodeGen/X86/cygwin-varargs.c | 35 + clang/test/CodeGen/arm-mve-intrinsics/vrnd.c | 4 +- .../CodeGen/attr-arm-sve-vector-bits-cast.c | 23 +- .../attr-availability-aligned-versions.c | 28 + clang/test/CodeGen/builtins-nvptx.c | 7 + ...ecked-callee-attribute-member-function.cpp | 53 + .../cfi-unchecked-callee-attribute.cpp | 77 + .../backend-skip.ll} | 2 +- .../basic.ll} | 0 .../cfi-devirt.ll} | 2 +- .../cfi.ll} | 2 +- .../CodeGen/distributed-thin-lto/cs-irpgo.c | 8 + .../newpm.ll} | 0 .../objc-contract-pass.ll} | 0 .../supports-hot-cold-new.ll} | 0 clang/test/CodeGen/openmp-prefix-map.c | 21 + clang/test/CodeGen/ptrauth-in-c-struct.c | 2 +- clang/test/CodeGen/tbaa-array.cpp | 47 +- clang/test/CodeGen/ubsan-function-debuginfo.c | 35 +- clang/test/CodeGen/unique-source-file-names.c | 5 +- .../CodeGen/unsigned-promotion-debuginfo.c | 29 +- .../CodeGenCXX/dependent-template-alias.cpp | 7 +- clang/test/CodeGenCXX/gnu-asm-constexpr.cpp | 8 +- .../CodeGenCXX/ptrauth-qualifier-struct.cpp | 2 +- clang/test/CodeGenCXX/tmp-md-nodes2.cpp | 2 - clang/test/CodeGenCXX/trivial_abi.cpp | 13 +- clang/test/CodeGenHLSL/RootSignature.hlsl | 36 +- .../builtins/wave_get_lane_count.hlsl | 32 + clang/test/CodeGenHLSL/group_shared.hlsl | 4 + .../CodeGenHLSL/semantics/SV_Position.ps.hlsl | 10 + clang/test/Driver/darwin-debug-flags.c | 2 +- .../Driver/darwin-infer-simulator-sdkroot.c | 4 +- .../test/Driver/darwin-invalid-os-versions.c | 22 + .../Driver/darwin-ld-platform-version-macos.c | 5 + .../darwin-ld-platform-version-watchos.c | 48 + clang/test/Driver/darwin-ld.c | 11 +- clang/test/Driver/darwin-version.c | 8 +- clang/test/Driver/hip-binding.hip | 6 +- clang/test/Driver/hip-phases.hip | 51 +- clang/test/Driver/hip-toolchain-no-rdc.hip | 81 +- clang/test/Driver/unique-source-file-names.c | 12 +- clang/test/ExtractAPI/availability.c | 8 +- .../test/ExtractAPI/inherited_availability.m | 16 +- .../aarch64-print-enabled-extensions-cc1.c | 139 + .../cfi-unchecked-callee-attribute-n3037.c | 31 + .../Frontend/cfi-unchecked-callee-attribute.c | 71 + .../cfi-unchecked-callee-attribute.cpp | 235 + clang/test/Interpreter/lambda.cpp | 4 +- ...a-attribute-supported-attributes-list.test | 1 - .../test/Misc/target-invalid-cpu-note/riscv.c | 2 + .../constexpr-initialization-failure.cpp | 44 + .../OpenMP/distribute_simd_misc_messages.c | 3 +- .../OpenMP/for_private_reduction_codegen.cpp | 710 + clang/test/OpenMP/for_reduction_messages.cpp | 2 + .../OpenMP/for_simd_reduction_messages.cpp | 2 +- .../OpenMP/sections_reduction_messages.cpp | 2 +- clang/test/Preprocessor/init-x86.c | 428 + clang/test/Preprocessor/init.c | 6 - .../Preprocessor/line-directive-suppressed.c | 16 + .../Sema/Inputs/XROS.sdk/SDKSettings.json | 9 + .../attr-availability-invalid-os-versions.c | 35 + .../attr-availability-ios-aligned-versions.c | 116 + ...ailability-ios-fallback-aligned-versions.c | 32 + ...ttr-availability-iosmac-infer-from-macos.c | 2 +- .../test/Sema/rvv-required-features-invalid.c | 37 +- clang/test/Sema/warn-unreachable_crash.cpp | 16 + clang/test/Sema/zvk-invalid-features.c | 58 +- clang/test/Sema/zvk-invalid-zvknha.c | 8 +- clang/test/Sema/zvk-target-attributes.c | 24 + clang/test/SemaCUDA/bad-attributes.cu | 8 + clang/test/SemaCXX/attr-trivial-abi.cpp | 16 +- .../SemaCXX/builtin-is-constant-evaluated.cpp | 11 + .../SemaCXX/constant-expression-cxx11.cpp | 7 + .../SemaCXX/cxx2b-deducing-this-constexpr.cpp | 29 + .../SemaCXX/cxx2c-trivially-relocatable.cpp | 25 + clang/test/SemaCXX/destructor.cpp | 8 +- clang/test/SemaCXX/gh139818.cpp | 36 + clang/test/SemaCXX/paren-list-init-expr.cpp | 23 + .../type-traits-unsatisfied-diags-std.cpp | 93 + .../SemaCXX/type-traits-unsatisfied-diags.cpp | 321 + .../test/SemaHLSL/Semantics/position.ps.hlsl | 7 + .../SemaHLSL/Semantics/position.ps.size.hlsl | 10 + .../test/SemaHLSL/Semantics/position.vs.hlsl | 6 + clang/test/SemaObjCXX/attr-trivial-abi.mm | 5 +- clang/test/SemaTemplate/concepts.cpp | 54 + clang/tools/cir-opt/cir-opt.cpp | 4 +- clang/tools/clang-installapi/Options.cpp | 5 +- .../ClangOffloadPackager.cpp | 1 - clang/tools/libclang/CXType.cpp | 4 +- clang/tools/scan-build/bin/scan-build | 2 +- .../DirectoryWatcher/DirectoryWatcherTest.cpp | 8 +- .../unittests/Driver/MultilibBuilderTest.cpp | 2 +- clang/unittests/Driver/MultilibTest.cpp | 2 +- .../unittests/Format/FormatTestRawStrings.cpp | 2 + clang/unittests/Format/TokenAnnotatorTest.cpp | 28 + .../Lex/DependencyDirectivesScannerTest.cpp | 17 +- .../BlockEntranceCallbackTest.cpp | 4 +- clang/unittests/Tooling/ToolingTest.cpp | 19 - clang/utils/TableGen/RISCVVEmitter.cpp | 36 +- clang/utils/analyzer/requirements.txt | 4 +- clang/utils/perf-training/perf-helper.py | 1 + clang/www/c_status.html | 2 +- clang/www/cxx_dr_status.html | 4 +- compiler-rt/include/profile/InstrProfData.inc | 20 +- compiler-rt/lib/builtins/CMakeLists.txt | 1 + compiler-rt/lib/builtins/arm/aeabi_cdcmp.S | 27 +- compiler-rt/lib/builtins/arm/aeabi_cfcmp.S | 27 +- compiler-rt/lib/builtins/arm/aeabi_dcmp.S | 20 +- compiler-rt/lib/builtins/arm/aeabi_fcmp.S | 20 +- compiler-rt/lib/builtins/arm/aeabi_idivmod.S | 10 + compiler-rt/lib/builtins/arm/aeabi_ldivmod.S | 10 + compiler-rt/lib/builtins/arm/aeabi_memcpy.S | 3 + compiler-rt/lib/builtins/arm/aeabi_memmove.S | 3 + compiler-rt/lib/builtins/arm/aeabi_memset.S | 6 + compiler-rt/lib/builtins/arm/aeabi_uidivmod.S | 10 + compiler-rt/lib/builtins/arm/aeabi_uldivmod.S | 14 +- compiler-rt/lib/builtins/assembly.h | 11 + compiler-rt/lib/builtins/cpu_model/riscv.c | 6 + compiler-rt/lib/lsan/lsan_common.cpp | 3 +- .../sanitizer_procmaps_solaris.cpp | 3 - .../lib/tsan/rtl/tsan_interceptors_posix.cpp | 4 + .../lib/tsan/rtl/tsan_platform_linux.cpp | 23 +- compiler-rt/lib/tsan/rtl/tsan_rtl.cpp | 6 + compiler-rt/lib/tsan/rtl/tsan_rtl.h | 2 + compiler-rt/lib/tsan/rtl/tsan_rtl_report.cpp | 11 +- compiler-rt/test/cfi/CMakeLists.txt | 2 +- .../test/hwasan/TestCases/Posix/dlerror.cpp | 33 + compiler-rt/test/lit.common.configured.in | 1 + compiler-rt/test/tysan/CMakeLists.txt | 4 +- .../include/flang-rt/runtime/environment.h | 3 + flang-rt/include/flang-rt/runtime/stat.h | 10 +- flang-rt/include/flang-rt/runtime/type-info.h | 2 + .../include/flang-rt/runtime/work-queue.h | 548 + flang-rt/lib/cuda/memory.cpp | 5 + flang-rt/lib/runtime/CMakeLists.txt | 2 + flang-rt/lib/runtime/assign.cpp | 623 +- flang-rt/lib/runtime/derived.cpp | 517 +- flang-rt/lib/runtime/descriptor-io.cpp | 651 +- flang-rt/lib/runtime/descriptor-io.h | 620 +- flang-rt/lib/runtime/environment.cpp | 4 + flang-rt/lib/runtime/namelist.cpp | 1 + flang-rt/lib/runtime/tools.cpp | 4 +- flang-rt/lib/runtime/type-info.cpp | 6 +- flang-rt/lib/runtime/work-queue.cpp | 161 + flang-rt/unittests/Runtime/CUDA/Memory.cpp | 26 + flang-rt/unittests/Runtime/ExternalIOTest.cpp | 2 +- flang/docs/CMakeLists.txt | 82 +- flang/docs/CommandGuide/index.rst | 22 + flang/docs/Extensions.md | 10 + flang/docs/FIR/CreateFIRLangRef.py | 4 +- flang/docs/conf.py | 22 +- flang/include/flang/Common/enum-class.h | 13 +- flang/include/flang/Common/optional.h | 1 - flang/include/flang/Frontend/CodeGenOptions.h | 5 +- .../Lower/Support}/PrivateReductionUtils.h | 15 +- flang/include/flang/Lower/Support/Utils.h | 4 +- .../Optimizer/Builder/DirectivesCommon.h | 88 +- .../flang/Optimizer/Builder/FIRBuilder.h | 18 +- .../flang/Optimizer/Builder/HLFIRTools.h | 8 +- .../flang/Optimizer/Builder/MutableBox.h | 12 + .../include/flang/Optimizer/Dialect/FIROps.td | 6 + .../include/flang/Optimizer/Dialect/FIRType.h | 9 + flang/include/flang/Optimizer/HLFIR/Passes.td | 4 + .../flang/Optimizer/Transforms/Passes.td | 3 + flang/include/flang/Parser/tools.h | 3 + flang/include/flang/Runtime/assign.h | 2 +- flang/include/flang/Semantics/symbol.h | 39 +- flang/include/flang/Semantics/tools.h | 33 +- .../include/flang/Support/Fortran-features.h | 61 +- flang/include/flang/Tools/CrossToolHelpers.h | 3 + flang/lib/Frontend/CompilerInvocation.cpp | 82 +- flang/lib/Frontend/FrontendActions.cpp | 1 + flang/lib/Lower/Bridge.cpp | 39 +- flang/lib/Lower/CMakeLists.txt | 2 +- flang/lib/Lower/OpenACC.cpp | 4 +- .../lib/Lower/OpenMP/DataSharingProcessor.cpp | 78 +- flang/lib/Lower/OpenMP/DataSharingProcessor.h | 15 +- flang/lib/Lower/OpenMP/OpenMP.cpp | 4 +- flang/lib/Lower/OpenMP/ReductionProcessor.cpp | 2 +- .../PrivateReductionUtils.cpp | 71 +- flang/lib/Lower/Support/Utils.cpp | 72 +- flang/lib/Optimizer/Builder/FIRBuilder.cpp | 52 +- flang/lib/Optimizer/Builder/HLFIRTools.cpp | 86 +- flang/lib/Optimizer/Builder/MutableBox.cpp | 22 +- flang/lib/Optimizer/CodeGen/CodeGen.cpp | 25 +- .../Optimizer/CodeGen/LowerRepackArrays.cpp | 8 +- flang/lib/Optimizer/Dialect/FIROps.cpp | 15 +- flang/lib/Optimizer/Dialect/FIRType.cpp | 25 +- flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp | 57 +- .../HLFIR/Transforms/BufferizeHLFIR.cpp | 48 +- .../Optimizer/HLFIR/Transforms/CMakeLists.txt | 1 + .../HLFIR/Transforms/ConvertToFIR.cpp | 2 +- .../HLFIR/Transforms/InlineHLFIRAssign.cpp | 9 +- .../HLFIR/Transforms/InlineHLFIRCopyIn.cpp | 183 + .../Transforms/OptimizedBufferization.cpp | 43 +- .../OpenMP/DoConcurrentConversion.cpp | 76 +- .../Optimizer/OpenMP/MapInfoFinalization.cpp | 90 +- .../OpenMP/MapsForPrivatizedSymbols.cpp | 44 +- flang/lib/Optimizer/Passes/Pipelines.cpp | 8 +- .../lib/Optimizer/Transforms/AddAliasTags.cpp | 11 +- flang/lib/Optimizer/Transforms/FIRToSCF.cpp | 39 +- .../lib/Optimizer/Transforms/FunctionAttr.cpp | 4 + flang/lib/Parser/tools.cpp | 5 + flang/lib/Parser/unparse.cpp | 8 + flang/lib/Semantics/assignment.cpp | 10 + flang/lib/Semantics/assignment.h | 3 + flang/lib/Semantics/check-call.cpp | 7 + flang/lib/Semantics/check-cuda.cpp | 125 +- flang/lib/Semantics/check-omp-structure.cpp | 97 +- flang/lib/Semantics/mod-file.cpp | 23 + flang/lib/Semantics/mod-file.h | 1 + flang/lib/Semantics/resolve-directives.cpp | 33 +- flang/lib/Semantics/resolve-names-utils.h | 6 + flang/lib/Semantics/resolve-names.cpp | 137 +- flang/lib/Semantics/runtime-type-info.cpp | 8 +- flang/lib/Semantics/symbol.cpp | 13 +- flang/lib/Semantics/tools.cpp | 46 + flang/lib/Support/Fortran-features.cpp | 146 +- flang/module/__fortran_type_info.f90 | 3 +- flang/test/Driver/darwin-version.f90 | 107 + flang/test/Driver/disable-diagnostic.f90 | 20 + flang/test/Driver/mrecip.f90 | 52 + flang/test/Driver/prefer-vector-width.f90 | 2 +- flang/test/Driver/werror-wrong.f90 | 7 +- flang/test/Driver/wextra-ok.f90 | 2 +- flang/test/Fir/FirToSCF/if.fir | 56 + flang/test/Fir/box-offset-codegen.fir | 10 + flang/test/Fir/box-offset.fir | 5 + .../Fir/convert-to-llvm-openmp-and-fir.fir | 27 + flang/test/Fir/invalid.fir | 10 +- flang/test/Fir/tbaa-codegen2.fir | 7 +- .../HLFIR/as_expr-codegen-polymorphic.fir | 23 +- flang/test/HLFIR/as_expr-codegen.fir | 8 +- flang/test/HLFIR/assign-side-effects.fir | 9 +- flang/test/HLFIR/associate-codegen.fir | 28 +- flang/test/HLFIR/bufferize-poly-expr.fir | 126 +- flang/test/HLFIR/declare-alloc-target.fir | 21 + .../HLFIR/element-codegen-issue-118922.fir | 2 +- flang/test/HLFIR/elemental-codegen.fir | 262 +- flang/test/HLFIR/inline-hlfir-assign.fir | 10 +- flang/test/HLFIR/inline-hlfir-copy-in.fir | 206 + flang/test/HLFIR/memory-effects.fir | 93 +- ...t-bufferization-elemental-assign-shape.fir | 54 + flang/test/HLFIR/opt-bufferization-tonto.fir | 59 + flang/test/HLFIR/reshape-lowering.fir | 16 +- flang/test/Integration/debug-local-var-2.f90 | 5 +- flang/test/Lower/HLFIR/assumed-rank-entry.f90 | 2 +- .../Lower/HLFIR/function-return-as-expr.f90 | 8 +- .../HLFIR/poly_expr_for_nonpoly_dummy.f90 | 12 +- .../Lower/HLFIR/polymorphic-expressions.f90 | 13 +- .../test/Lower/HLFIR/select-type-selector.f90 | 4 +- .../Lower/HLFIR/vector-subscript-as-value.f90 | 7 +- .../target-private-multiple-variables.f90 | 2 +- flang/test/Lower/OpenMP/atomic-privatize.f90 | 25 + ...elayed-privatization-allocatable-array.f90 | 2 +- .../OpenMP/delayed-privatization-array.f90 | 6 +- flang/test/Lower/OpenMP/map-character.f90 | 23 +- .../Lower/OpenMP/optional-argument-map-2.f90 | 63 +- .../parallel-reduction-allocatable-array.f90 | 2 +- .../OpenMP/parallel-reduction-array-lb.f90 | 2 +- .../Lower/OpenMP/parallel-reduction-array.f90 | 2 +- .../OpenMP/parallel-reduction-array2.f90 | 2 +- .../parallel-reduction-pointer-array.f90 | 2 +- .../test/Lower/OpenMP/parallel-reduction3.f90 | 2 +- .../OpenMP/reduction-array-intrinsic.f90 | 2 +- .../OpenMP/sections-predetermined-private.f90 | 2 +- ...oop-reduction-allocatable-array-minmax.f90 | 4 +- .../wsloop-reduction-array-assumed-shape.f90 | 2 +- .../Lower/OpenMP/wsloop-reduction-array.f90 | 2 +- .../Lower/OpenMP/wsloop-reduction-array2.f90 | 2 +- .../wsloop-reduction-multiple-clauses.f90 | 2 +- .../Lower/do_concurrent_delayed_locality.f90 | 2 +- .../do_concurrent_local_assoc_entity.f90 | 28 +- .../do_concurrent_local_default_init.f90 | 39 +- flang/test/Lower/loops.f90 | 2 +- flang/test/Lower/loops3.f90 | 2 +- flang/test/Lower/volatile-allocatable.f90 | 10 +- flang/test/Lower/volatile-openmp.f90 | 8 +- flang/test/Lower/volatile-openmp2.f03 | 34 + .../Parser/OpenMP/declare-reduction-multi.f90 | 134 + .../OpenMP/declare-reduction-operator.f90 | 59 + flang/test/Semantics/OpenMP/common-block.f90 | 6 +- .../OpenMP/declare-reduction-bad-operator.f90 | 6 + .../declare-reduction-bad-operator2.f90 | 28 + .../OpenMP/declare-reduction-dupsym.f90 | 15 + .../OpenMP/declare-reduction-error.f90 | 2 +- .../OpenMP/declare-reduction-functions.f90 | 203 + .../OpenMP/declare-reduction-logical.f90 | 32 + .../OpenMP/declare-reduction-mangled.f90 | 51 + .../OpenMP/declare-reduction-modfile.f90 | 65 + .../OpenMP/declare-reduction-operator.f90 | 36 + .../OpenMP/declare-reduction-operators.f90 | 84 + .../OpenMP/declare-reduction-renamedop.f90 | 47 + .../OpenMP/declare-reduction-typeerror.f90 | 34 + .../Semantics/OpenMP/declare-reduction.f90 | 4 +- .../OpenMP/declare-target-common-block.f90 | 4 +- flang/test/Semantics/OpenMP/implicit-dsa.f90 | 75 + flang/test/Semantics/OpenMP/symbol01.f90 | 4 +- flang/test/Semantics/OpenMP/task-depend.f90 | 8 + flang/test/Semantics/cuf21.cuf | 11 +- flang/test/Semantics/cuf22.cuf | 8 + flang/test/Semantics/offsets03.f90 | 10 +- flang/test/Semantics/resolve121.f90 | 4 +- flang/test/Semantics/symbol33.f90 | 2 +- flang/test/Semantics/typeinfo01.f90 | 30 +- flang/test/Semantics/typeinfo03.f90 | 2 +- flang/test/Semantics/typeinfo04.f90 | 8 +- flang/test/Semantics/typeinfo05.f90 | 4 +- flang/test/Semantics/typeinfo06.f90 | 4 +- flang/test/Semantics/typeinfo07.f90 | 8 +- flang/test/Semantics/typeinfo08.f90 | 2 +- flang/test/Semantics/typeinfo11.f90 | 2 +- flang/test/Semantics/typeinfo12.f90 | 67 + flang/test/Semantics/typeinfo13.f90 | 26 + .../locality_specifiers_init_dealloc.mlir | 51 + .../locality_specifiers_simple.mlir | 48 + flang/test/Transforms/lower-repack-arrays.fir | 496 +- .../Transforms/omp-map-info-finalization.fir | 59 + .../Transforms/tbaa-with-dummy-scope2.fir | 23 +- flang/test/Transforms/tbaa2.fir | 59 +- flang/test/Transforms/tbaa3.fir | 10 +- flang/tools/bbc/bbc.cpp | 10 + flang/unittests/Common/CMakeLists.txt | 3 + flang/unittests/Common/EnumClassTests.cpp | 34 + .../unittests/Common/FortranFeaturesTest.cpp | 561 + libc/cmake/modules/LLVMLibCLibraryRules.cmake | 9 +- libc/cmake/modules/LLVMLibCObjectRules.cmake | 14 +- libc/cmake/modules/LLVMLibCTestRules.cmake | 4 - libc/config/gpu/amdgpu/entrypoints.txt | 10 - libc/config/gpu/nvptx/entrypoints.txt | 10 - libc/docs/headers/time.rst | 132 +- .../llvm-libc-macros/baremetal/CMakeLists.txt | 5 + .../llvm-libc-macros/baremetal/time-macros.h | 26 + libc/include/llvm-libc-macros/time-macros.h | 6 + libc/src/__support/GPU/allocator.cpp | 34 +- libc/src/math/amdgpu/CMakeLists.txt | 168 - libc/src/math/amdgpu/acos.cpp | 19 - libc/src/math/amdgpu/acosf.cpp | 19 - libc/src/math/amdgpu/acosh.cpp | 19 - libc/src/math/amdgpu/acoshf.cpp | 19 - libc/src/math/amdgpu/asin.cpp | 19 - libc/src/math/amdgpu/asinf.cpp | 19 - libc/src/math/amdgpu/asinh.cpp | 19 - libc/src/math/amdgpu/asinhf.cpp | 19 - libc/src/math/amdgpu/atan.cpp | 19 - libc/src/math/amdgpu/atan2.cpp | 21 - libc/src/math/amdgpu/atan2f.cpp | 21 - libc/src/math/amdgpu/atanf.cpp | 19 - libc/src/math/amdgpu/atanh.cpp | 19 - libc/src/math/amdgpu/atanhf.cpp | 19 - libc/src/math/amdgpu/cos.cpp | 19 - libc/src/math/amdgpu/cosf.cpp | 19 - libc/src/math/amdgpu/cosh.cpp | 19 - libc/src/math/amdgpu/coshf.cpp | 19 - libc/src/math/amdgpu/declarations.h | 91 - libc/src/math/amdgpu/erf.cpp | 19 - libc/src/math/amdgpu/erff.cpp | 19 - libc/src/math/amdgpu/exp.cpp | 19 - libc/src/math/amdgpu/exp10.cpp | 19 - libc/src/math/amdgpu/exp10f.cpp | 19 - libc/src/math/amdgpu/exp2.cpp | 19 - libc/src/math/amdgpu/exp2f.cpp | 19 - libc/src/math/amdgpu/expf.cpp | 19 - libc/src/math/amdgpu/expm1.cpp | 19 - libc/src/math/amdgpu/expm1f.cpp | 19 - libc/src/math/amdgpu/fdim.cpp | 21 - libc/src/math/amdgpu/fdimf.cpp | 21 - libc/src/math/amdgpu/frexp.cpp | 1 - libc/src/math/amdgpu/frexpf.cpp | 1 - libc/src/math/amdgpu/hypot.cpp | 21 - libc/src/math/amdgpu/hypotf.cpp | 21 - libc/src/math/amdgpu/ilogb.cpp | 19 - libc/src/math/amdgpu/ilogbf.cpp | 19 - libc/src/math/amdgpu/ldexp.cpp | 1 - libc/src/math/amdgpu/ldexpf.cpp | 1 - libc/src/math/amdgpu/lgamma.cpp | 4 +- libc/src/math/amdgpu/lgamma_r.cpp | 9 +- libc/src/math/amdgpu/llrint.cpp | 1 - libc/src/math/amdgpu/llrintf.cpp | 1 - libc/src/math/amdgpu/log.cpp | 19 - libc/src/math/amdgpu/log10.cpp | 19 - libc/src/math/amdgpu/log10f.cpp | 19 - libc/src/math/amdgpu/log1p.cpp | 19 - libc/src/math/amdgpu/log1pf.cpp | 19 - libc/src/math/amdgpu/log2.cpp | 19 - libc/src/math/amdgpu/log2f.cpp | 19 - libc/src/math/amdgpu/logb.cpp | 19 - libc/src/math/amdgpu/logbf.cpp | 19 - libc/src/math/amdgpu/logf.cpp | 19 - libc/src/math/amdgpu/lrint.cpp | 1 - libc/src/math/amdgpu/lrintf.cpp | 1 - libc/src/math/amdgpu/nextafter.cpp | 21 - libc/src/math/amdgpu/nextafterf.cpp | 21 - libc/src/math/amdgpu/platform.h | 55 - libc/src/math/amdgpu/powf.cpp | 21 - libc/src/math/amdgpu/powi.cpp | 21 - libc/src/math/amdgpu/powif.cpp | 21 - libc/src/math/amdgpu/remquo.cpp | 24 - libc/src/math/amdgpu/remquof.cpp | 24 - libc/src/math/amdgpu/scalbn.cpp | 1 - libc/src/math/amdgpu/scalbnf.cpp | 1 - libc/src/math/amdgpu/sin.cpp | 19 - libc/src/math/amdgpu/sincos.cpp | 21 - libc/src/math/amdgpu/sincosf.cpp | 21 - libc/src/math/amdgpu/sinf.cpp | 19 - libc/src/math/amdgpu/sinh.cpp | 19 - libc/src/math/amdgpu/sinhf.cpp | 19 - libc/src/math/amdgpu/tan.cpp | 19 - libc/src/math/amdgpu/tanf.cpp | 19 - libc/src/math/amdgpu/tanh.cpp | 19 - libc/src/math/amdgpu/tanhf.cpp | 19 - libc/src/math/amdgpu/tgamma.cpp | 3 +- libc/src/math/amdgpu/tgammaf.cpp | 3 +- libc/src/math/generic/CMakeLists.txt | 20 +- libc/src/math/generic/exp_utils.cpp | 128 - libc/src/math/generic/exp_utils.h | 34 - libc/src/math/nvptx/CMakeLists.txt | 181 - libc/src/math/nvptx/acos.cpp | 19 - libc/src/math/nvptx/acosf.cpp | 19 - libc/src/math/nvptx/acosh.cpp | 19 - libc/src/math/nvptx/acoshf.cpp | 19 - libc/src/math/nvptx/asin.cpp | 19 - libc/src/math/nvptx/asinf.cpp | 19 - libc/src/math/nvptx/asinh.cpp | 19 - libc/src/math/nvptx/asinhf.cpp | 19 - libc/src/math/nvptx/atan.cpp | 19 - libc/src/math/nvptx/atan2.cpp | 21 - libc/src/math/nvptx/atan2f.cpp | 21 - libc/src/math/nvptx/atanf.cpp | 19 - libc/src/math/nvptx/atanh.cpp | 19 - libc/src/math/nvptx/atanhf.cpp | 19 - libc/src/math/nvptx/cos.cpp | 19 - libc/src/math/nvptx/cosf.cpp | 19 - libc/src/math/nvptx/cosh.cpp | 19 - libc/src/math/nvptx/coshf.cpp | 19 - libc/src/math/nvptx/declarations.h | 94 - libc/src/math/nvptx/erf.cpp | 19 - libc/src/math/nvptx/erff.cpp | 19 - libc/src/math/nvptx/exp.cpp | 19 - libc/src/math/nvptx/exp10.cpp | 19 - libc/src/math/nvptx/exp10f.cpp | 19 - libc/src/math/nvptx/exp2.cpp | 19 - libc/src/math/nvptx/exp2f.cpp | 19 - libc/src/math/nvptx/expf.cpp | 19 - libc/src/math/nvptx/expm1.cpp | 19 - libc/src/math/nvptx/expm1f.cpp | 19 - libc/src/math/nvptx/fdim.cpp | 21 - libc/src/math/nvptx/fdimf.cpp | 21 - libc/src/math/nvptx/frexp.cpp | 21 - libc/src/math/nvptx/frexpf.cpp | 21 - libc/src/math/nvptx/hypot.cpp | 21 - libc/src/math/nvptx/hypotf.cpp | 21 - libc/src/math/nvptx/ilogb.cpp | 19 - libc/src/math/nvptx/ilogbf.cpp | 19 - libc/src/math/nvptx/ldexp.cpp | 21 - libc/src/math/nvptx/ldexpf.cpp | 21 - libc/src/math/nvptx/lgamma.cpp | 3 +- libc/src/math/nvptx/lgamma_r.cpp | 8 +- libc/src/math/nvptx/llrint.cpp | 1 - libc/src/math/nvptx/llrintf.cpp | 1 - libc/src/math/nvptx/log.cpp | 19 - libc/src/math/nvptx/log10.cpp | 19 - libc/src/math/nvptx/log10f.cpp | 19 - libc/src/math/nvptx/log1p.cpp | 19 - libc/src/math/nvptx/log1pf.cpp | 19 - libc/src/math/nvptx/log2.cpp | 19 - libc/src/math/nvptx/log2f.cpp | 19 - libc/src/math/nvptx/logb.cpp | 19 - libc/src/math/nvptx/logbf.cpp | 19 - libc/src/math/nvptx/logf.cpp | 19 - libc/src/math/nvptx/lrint.cpp | 1 - libc/src/math/nvptx/lrintf.cpp | 19 - libc/src/math/nvptx/nextafter.cpp | 21 - libc/src/math/nvptx/nextafterf.cpp | 21 - libc/src/math/nvptx/nvptx.h | 103 - libc/src/math/nvptx/powf.cpp | 19 - libc/src/math/nvptx/powi.cpp | 19 - libc/src/math/nvptx/powif.cpp | 19 - libc/src/math/nvptx/remquo.cpp | 21 - libc/src/math/nvptx/remquof.cpp | 21 - libc/src/math/nvptx/scalbn.cpp | 21 - libc/src/math/nvptx/scalbnf.cpp | 21 - libc/src/math/nvptx/sin.cpp | 19 - libc/src/math/nvptx/sincos.cpp | 21 - libc/src/math/nvptx/sincosf.cpp | 21 - libc/src/math/nvptx/sinf.cpp | 19 - libc/src/math/nvptx/sinh.cpp | 19 - libc/src/math/nvptx/sinhf.cpp | 19 - libc/src/math/nvptx/tan.cpp | 19 - libc/src/math/nvptx/tanf.cpp | 19 - libc/src/math/nvptx/tanh.cpp | 19 - libc/src/math/nvptx/tanhf.cpp | 19 - libc/src/math/nvptx/tgamma.cpp | 3 +- libc/src/math/nvptx/tgammaf.cpp | 3 +- libc/src/stdio/gpu/CMakeLists.txt | 9 +- libc/src/stdio/gpu/clearerr.cpp | 4 +- libc/src/stdio/gpu/fclose.cpp | 4 +- libc/src/stdio/gpu/feof.cpp | 4 +- libc/src/stdio/gpu/ferror.cpp | 4 +- libc/src/stdio/gpu/fflush.cpp | 4 +- libc/src/stdio/gpu/fgetc.cpp | 4 +- libc/src/stdio/gpu/fgets.cpp | 9 +- libc/src/stdio/gpu/file.h | 7 +- libc/src/stdio/gpu/fopen.cpp | 7 +- libc/src/stdio/gpu/fprintf.cpp | 1 + libc/src/stdio/gpu/fputc.cpp | 4 +- libc/src/stdio/gpu/fputs.cpp | 7 +- libc/src/stdio/gpu/fread.cpp | 4 +- libc/src/stdio/gpu/fseek.cpp | 4 +- libc/src/stdio/gpu/ftell.cpp | 4 +- libc/src/stdio/gpu/fwrite.cpp | 4 +- libc/src/stdio/gpu/getc.cpp | 4 +- libc/src/stdio/gpu/getchar.cpp | 4 +- libc/src/stdio/gpu/printf.cpp | 1 + libc/src/stdio/gpu/putc.cpp | 4 +- libc/src/stdio/gpu/putchar.cpp | 4 +- libc/src/stdio/gpu/puts.cpp | 11 +- libc/src/stdio/gpu/remove.cpp | 5 +- libc/src/stdio/gpu/rename.cpp | 6 +- libc/src/stdio/gpu/stderr.cpp | 2 +- libc/src/stdio/gpu/stdin.cpp | 2 +- libc/src/stdio/gpu/stdout.cpp | 2 +- libc/src/stdio/gpu/ungetc.cpp | 4 +- libc/src/stdio/gpu/vfprintf.cpp | 2 +- libc/src/stdio/gpu/vfprintf_utils.h | 1 - libc/src/stdio/gpu/vprintf.cpp | 2 +- libc/src/string/CMakeLists.txt | 12 +- libc/src/string/memccpy.cpp | 5 + libc/src/string/memchr.cpp | 3 + libc/src/string/memcmp.cpp | 5 + libc/src/string/memcpy.cpp | 5 + libc/src/string/memmove.cpp | 5 + libc/src/string/mempcpy.cpp | 5 + libc/src/string/memrchr.cpp | 5 + libc/src/string/memset.cpp | 4 + libc/src/string/stpncpy.cpp | 5 + libc/src/string/strcasestr.cpp | 4 + libc/src/string/strcat.cpp | 3 + libc/src/string/strcoll.cpp | 3 + libc/src/string/strcoll_l.cpp | 3 + libc/src/string/strcpy.cpp | 2 + libc/src/string/string_utils.h | 11 +- libc/src/string/strlen.cpp | 2 + libc/src/string/strncat.cpp | 5 + libc/src/string/strncmp.cpp | 5 + libc/src/string/strncpy.cpp | 5 + libc/src/string/strsep.cpp | 5 + libc/src/string/strspn.cpp | 3 + libc/src/string/strstr.cpp | 3 + libc/src/strings/CMakeLists.txt | 4 +- libc/src/strings/rindex.cpp | 2 + libc/src/wchar/wcscmp.cpp | 6 +- .../startup/gpu/rpc_stream_test.cpp | 1 + libc/test/src/string/memchr_test.cpp | 10 + libc/test/src/string/memcmp_test.cpp | 10 + libc/test/src/string/memcpy_test.cpp | 9 + libc/test/src/string/memmove_test.cpp | 10 + libc/test/src/string/mempcpy_test.cpp | 11 +- libc/test/src/string/memrchr_test.cpp | 10 + libc/test/src/string/memset_test.cpp | 10 + libc/test/src/string/stpncpy_test.cpp | 10 + libc/test/src/string/strcat_test.cpp | 10 + libc/test/src/string/strcoll_test.cpp | 10 + libc/test/src/string/strcpy_test.cpp | 10 + libc/test/src/string/strlcpy_test.cpp | 4 +- libc/test/src/string/strsep_test.cpp | 10 + libc/test/src/string/strspn_test.cpp | 10 + libc/test/src/sys/prctl/linux/CMakeLists.txt | 6 + libc/test/src/sys/prctl/linux/prctl_test.cpp | 1 + libc/test/utils/FPUtil/CMakeLists.txt | 3 +- libclc/CMakeLists.txt | 2 +- .../clc/geometric/clc_fast_normalize.h | 22 + .../clc/include/clc/geometric/clc_normalize.h | 20 + libclc/clc/lib/generic/SOURCES | 2 + libclc/clc/lib/generic/geometric/clc_dot.cl | 58 +- libclc/clc/lib/generic/geometric/clc_dot.inc | 25 + .../generic/geometric/clc_fast_normalize.cl | 15 + .../generic/geometric/clc_fast_normalize.inc | 23 + .../lib/generic/geometric/clc_normalize.cl | 22 + .../lib/generic/geometric/clc_normalize.inc | 84 + libclc/opencl/lib/generic/geometric/dot.cl | 60 +- .../lib/generic/geometric/fast_normalize.cl | 9 +- .../lib/generic/geometric/fast_normalize.inc | 19 - .../opencl/lib/generic/geometric/normalize.cl | 133 +- libcxx/docs/ABIGuarantees.rst | 210 + libcxx/docs/Status/Cxx2cIssues.csv | 2 +- libcxx/docs/UserDocumentation.rst | 2 + libcxx/docs/VendorDocumentation.rst | 5 + libcxx/docs/index.rst | 1 + libcxx/include/CMakeLists.txt | 8 +- libcxx/include/__bit/bit_ceil.h | 4 +- libcxx/include/__bit/bit_floor.h | 4 +- libcxx/include/__bit/bit_log2.h | 4 +- libcxx/include/__bit/bit_width.h | 4 +- libcxx/include/__bit/countl.h | 9 +- libcxx/include/__bit/countr.h | 9 +- libcxx/include/__bit/has_single_bit.h | 4 +- libcxx/include/__bit/popcount.h | 7 +- libcxx/include/__bit/rotate.h | 11 +- libcxx/include/__chrono/time_point.h | 13 + libcxx/include/__concepts/arithmetic.h | 13 - libcxx/include/__config | 27 +- libcxx/include/__configuration/abi.h | 126 +- libcxx/include/__debug_utils/sanitizers.h | 10 +- libcxx/include/__flat_map/flat_map.h | 53 +- libcxx/include/__flat_map/flat_multimap.h | 27 +- libcxx/include/__flat_set/flat_multiset.h | 2 +- libcxx/include/__flat_set/flat_set.h | 3 +- libcxx/include/__format/format_arg_store.h | 6 +- libcxx/include/__functional/function.h | 10 +- libcxx/include/__functional/hash.h | 143 +- libcxx/include/__iterator/concepts.h | 41 +- libcxx/include/__iterator/iterator_traits.h | 53 +- libcxx/include/__mdspan/extents.h | 6 +- libcxx/include/__memory/addressof.h | 4 +- .../include/__numeric/saturation_arithmetic.h | 30 +- .../include/__type_traits/container_traits.h | 3 + libcxx/include/__type_traits/integer_traits.h | 73 + libcxx/include/__type_traits/is_integral.h | 24 +- libcxx/include/__type_traits/is_pointer.h | 2 +- libcxx/include/__type_traits/is_scalar.h | 2 +- .../include/__type_traits/is_signed_integer.h | 35 - .../__type_traits/is_unsigned_integer.h | 35 - libcxx/include/__utility/cmp.h | 16 +- libcxx/include/__vector/container_traits.h | 2 + libcxx/include/chrono | 5 + libcxx/include/deque | 28 +- libcxx/include/forward_list | 36 +- libcxx/include/ios | 10 +- libcxx/include/list | 2 + libcxx/include/map | 16 +- libcxx/include/mdspan | 7 +- libcxx/include/module.modulemap.in | 9 +- libcxx/include/regex | 26 +- libcxx/include/set | 4 + libcxx/include/string | 8 +- libcxx/include/syncstream | 11 +- libcxx/include/unordered_map | 4 + libcxx/include/unordered_set | 4 + libcxx/modules/std.compat.cppm.in | 4 +- libcxx/modules/std.cppm.in | 56 +- .../__libcpp_integer.compile.pass.cpp | 62 +- .../__libcpp_signed_integer.compile.pass.cpp | 62 +- ...__libcpp_unsigned_integer.compile.pass.cpp | 62 +- .../extents/assert.ctor_from_span.pass.cpp | 3 +- .../assert.ctor.extents_array.pass.cpp | 3 +- .../assert.ctor.extents_span.pass.cpp | 3 +- .../generate_header_test.sh.py | 1 + ...p => cpp20_iter_concepts.compile.pass.cpp} | 68 +- .../cpp20_iter_traits.compile.pass.cpp | 14 +- .../is_trivially_relocatable.compile.pass.cpp | 2 +- .../flat.map.access/at_transparent.pass.cpp | 7 + .../index_transparent.pass.cpp | 7 + .../erase_key_transparent.pass.cpp | 7 + .../insert_iter_iter.pass.cpp | 9 + .../insert_or_assign_transparent.pass.cpp | 12 + .../insert_transparent.pass.cpp | 10 + .../try_emplace_transparent.pass.cpp | 11 + .../contains_transparent.pass.cpp | 8 + .../count_transparent.pass.cpp | 8 + .../equal_range_transparent.pass.cpp | 9 + .../find_transparent.pass.cpp | 8 + .../lower_bound_transparent.pass.cpp | 8 + .../upper_bound_transparent.pass.cpp | 8 + .../erase_key_transparent.pass.cpp | 7 + .../insert_iter_iter.pass.cpp | 7 + .../insert_transparent.pass.cpp | 9 + .../contains_transparent.pass.cpp | 8 + .../count_transparent.pass.cpp | 8 + .../equal_range_transparent.pass.cpp | 9 + .../find_transparent.pass.cpp | 8 + .../lower_bound_transparent.pass.cpp | 8 + .../upper_bound_transparent.pass.cpp | 8 + .../insert_iter_iter.pass.cpp | 7 + .../erase_key_transparent.pass.cpp | 7 + .../insert_iter_iter.pass.cpp | 7 + .../insert_transparent.pass.cpp | 8 + .../contains_transparent.pass.cpp | 8 + .../count_transparent.pass.cpp | 8 + .../equal_range_transparent.pass.cpp | 9 + .../find_transparent.pass.cpp | 10 + .../lower_bound_transparent.pass.cpp | 10 + .../upper_bound_transparent.pass.cpp | 10 + .../container.adaptors/flat_helpers.h | 7 + .../std/containers/exception_safety_helpers.h | 51 + .../forwardlist/exception_safety.pass.cpp | 73 +- ...ass.cpp => swap_noexcept.compile.pass.cpp} | 4 +- .../views/mdspan/CustomTestLayouts.h | 1 - .../views/mdspan/extents/comparison.pass.cpp | 1 - .../views/mdspan/extents/conversion.pass.cpp | 1 - .../views/mdspan/extents/ctad.pass.cpp | 1 - .../views/mdspan/extents/dextents.pass.cpp | 1 - .../views/mdspan/extents/dims.pass.cpp | 1 - .../mdspan/extents/index_type.verify.cpp | 1 - .../views/mdspan/extents/obs_static.pass.cpp | 1 - .../views/mdspan/extents/types.pass.cpp | 1 - .../mdspan/layout_left/comparison.pass.cpp | 1 - .../mdspan/layout_left/ctor.default.pass.cpp | 1 - .../mdspan/layout_left/ctor.extents.pass.cpp | 1 - .../layout_left/ctor.layout_right.pass.cpp | 1 - .../layout_left/ctor.layout_stride.pass.cpp | 1 - .../mdspan/layout_left/ctor.mapping.pass.cpp | 1 - .../layout_left/index_operator.pass.cpp | 1 - .../mdspan/layout_left/properties.pass.cpp | 1 - .../layout_left/required_span_size.pass.cpp | 1 - .../layout_left/static_requirements.pass.cpp | 1 - .../views/mdspan/layout_left/stride.pass.cpp | 1 - .../mdspan/layout_right/comparison.pass.cpp | 1 - .../mdspan/layout_right/ctor.default.pass.cpp | 1 - .../mdspan/layout_right/ctor.extents.pass.cpp | 1 - .../layout_right/ctor.layout_left.pass.cpp | 1 - .../layout_right/ctor.layout_stride.pass.cpp | 1 - .../mdspan/layout_right/ctor.mapping.pass.cpp | 1 - .../layout_right/index_operator.pass.cpp | 1 - .../mdspan/layout_right/properties.pass.cpp | 1 - .../layout_right/required_span_size.pass.cpp | 1 - .../layout_right/static_requirements.pass.cpp | 1 - .../views/mdspan/layout_right/stride.pass.cpp | 1 - .../mdspan/layout_stride/comparison.pass.cpp | 1 - .../layout_stride/ctor.default.pass.cpp | 1 - .../layout_stride/ctor.extents_array.pass.cpp | 1 - .../ctor.strided_mapping.pass.cpp | 1 - .../layout_stride/index_operator.pass.cpp | 1 - .../is_exhaustive_corner_case.pass.cpp | 1 - .../mdspan/layout_stride/properties.pass.cpp | 1 - .../layout_stride/required_span_size.pass.cpp | 1 - .../static_requirements.pass.cpp | 1 - .../mdspan/layout_stride/stride.pass.cpp | 1 - .../views/mdspan/mdspan/assign.pass.cpp | 1 - .../views/mdspan/mdspan/conversion.pass.cpp | 1 - .../views/mdspan/mdspan/ctor.copy.pass.cpp | 1 - .../views/mdspan/mdspan/ctor.default.pass.cpp | 1 - .../mdspan/mdspan/ctor.dh_array.pass.cpp | 1 - .../mdspan/mdspan/ctor.dh_extents.pass.cpp | 1 - .../mdspan/mdspan/ctor.dh_integers.pass.cpp | 1 - .../views/mdspan/mdspan/ctor.dh_map.pass.cpp | 1 - .../mdspan/mdspan/ctor.dh_map_acc.pass.cpp | 1 - .../views/mdspan/mdspan/ctor.move.pass.cpp | 1 - .../views/mdspan/mdspan/move.pass.cpp | 1 - .../views/mdspan/mdspan/properties.pass.cpp | 1 - .../views/mdspan/mdspan/swap.pass.cpp | 1 - .../views/mdspan/mdspan/types.pass.cpp | 1 - .../string.capacity/shrink_to_fit.pass.cpp | 2 +- .../time.point.arithmetic/op_++.pass.cpp | 35 + .../time.point.arithmetic/op_++int.pass.cpp | 35 + .../time.point.arithmetic/op_--.pass.cpp | 35 + .../time.point.arithmetic/op_--int.pass.cpp | 35 + libcxx/test/support/MinSequenceContainer.h | 12 + libcxx/utils/libcxx/header_information.py | 31 - libunwind/cmake/config-ix.cmake | 56 - libunwind/src/CMakeLists.txt | 12 - lld/COFF/MinGW.cpp | 2 + lld/COFF/TypeMerger.h | 1 + lld/ELF/Arch/RISCV.cpp | 21 +- lld/ELF/Config.h | 3 + lld/ELF/DWARF.h | 1 + lld/ELF/Driver.cpp | 52 +- lld/ELF/InputFiles.cpp | 28 +- lld/ELF/Relocations.cpp | 2 +- lld/ELF/Symbols.h | 2 +- lld/ELF/SyntheticSections.cpp | 21 +- lld/ELF/Writer.cpp | 2 +- lld/MachO/DriverUtils.cpp | 26 +- lld/MachO/SectionPriorities.cpp | 73 +- lld/MachO/SectionPriorities.h | 29 +- lld/MachO/SyntheticSections.cpp | 34 +- lld/test/COFF/lto-late-arm.ll | 39 - lld/test/ELF/ppc64-long-branch-pi.s | 41 +- lld/test/ELF/ppc64-relocs.s | 4 +- lld/test/ELF/riscv-branch.s | 6 +- lld/test/ELF/riscv-feature-zicfilp-func-sig.s | 193 + .../ELF/riscv-feature-zicfilp-unlabeled.s | 221 + lld/test/ELF/riscv-feature-zicfiss.s | 193 + lld/test/ELF/riscv-relax-call-stress.s | 50 + lld/test/ELF/riscv-undefined-weak.s | 4 +- lld/test/MachO/ordre-file-cstring.s | 228 + lldb/CMakeLists.txt | 2 + lldb/cmake/modules/AddLLDB.cmake | 8 +- lldb/cmake/modules/LLDBFramework.cmake | 3 + lldb/docs/use/formatting.rst | 2 + lldb/include/lldb/Core/FormatEntity.h | 1 + lldb/include/lldb/Core/PluginManager.h | 64 + lldb/include/lldb/Core/Telemetry.h | 11 + .../lldb/DataFormatters/TypeSynthetic.h | 2 +- .../Interpreter/CommandOptionArgumentTable.h | 1 + lldb/include/lldb/Symbol/ObjectFile.h | 7 + .../lldb/Target/RegisterContextUnwind.h | 3 + lldb/include/lldb/Target/Statistics.h | 9 + lldb/include/lldb/lldb-enumerations.h | 1 + .../Python/lldbsuite/test/decorators.py | 54 +- .../test/tools/lldb-dap/dap_server.py | 30 +- .../test/tools/lldb-dap/lldbdap_testcase.py | 10 + lldb/source/API/CMakeLists.txt | 4 +- lldb/source/Breakpoint/CMakeLists.txt | 2 + lldb/source/Breakpoint/WatchpointResource.cpp | 3 +- .../Commands/CommandObjectBreakpoint.cpp | 1 - lldb/source/Commands/CommandObjectPlugin.cpp | 277 + lldb/source/Commands/CommandObjectStats.cpp | 7 + lldb/source/Commands/CommandObjectTarget.cpp | 6 +- lldb/source/Commands/Options.td | 13 +- lldb/source/Core/CMakeLists.txt | 5 +- lldb/source/Core/CoreProperties.td | 4 +- lldb/source/Core/FormatEntity.cpp | 6 + lldb/source/Core/PluginManager.cpp | 60 + lldb/source/Core/Statusline.cpp | 4 +- lldb/source/DataFormatters/CMakeLists.txt | 2 + lldb/source/DataFormatters/TypeSynthetic.cpp | 6 +- lldb/source/Expression/CMakeLists.txt | 2 + lldb/source/Expression/DWARFExpression.cpp | 5 +- lldb/source/Expression/FunctionCaller.cpp | 3 +- lldb/source/Host/CMakeLists.txt | 2 + lldb/source/Host/macosx/objcxx/CMakeLists.txt | 2 + lldb/source/Host/windows/ProcessRunLock.cpp | 4 - lldb/source/Initialization/CMakeLists.txt | 2 + lldb/source/Interpreter/CMakeLists.txt | 2 + .../Interpreter/Interfaces/CMakeLists.txt | 2 + .../source/Plugins/ABI/AArch64/ABIAArch64.cpp | 5 +- .../Clang/ClangModulesDeclVendor.cpp | 7 + .../Plugins/Language/CPlusPlus/Coroutines.cpp | 145 +- .../Plugins/Language/CPlusPlus/Coroutines.h | 4 +- .../ObjectFile/COFF/ObjectFileCOFF.cpp | 22 +- .../Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 36 +- .../ObjectFile/Mach-O/ObjectFileMachO.cpp | 83 +- .../ObjectFile/PECOFF/ObjectFilePECOFF.cpp | 17 +- .../ObjectFile/wasm/ObjectFileWasm.cpp | 32 +- .../gdb-server/PlatformRemoteGDBServer.cpp | 5 +- .../GDBRemoteCommunicationServerCommon.cpp | 2 +- .../Process/gdb-remote/ProcessGDBRemote.cpp | 2 +- lldb/source/Symbol/CMakeLists.txt | 2 + lldb/source/Symbol/ObjectFile.cpp | 35 + lldb/source/Symbol/UnwindPlan.cpp | 6 +- lldb/source/Target/CMakeLists.txt | 2 + lldb/source/Target/Process.cpp | 31 +- lldb/source/Target/RegisterContextUnwind.cpp | 563 +- lldb/source/Target/RegisterNumber.cpp | 1 + lldb/source/Target/Statistics.cpp | 6 + lldb/source/Utility/CMakeLists.txt | 2 + lldb/source/Utility/Listener.cpp | 3 +- lldb/source/ValueObject/CMakeLists.txt | 2 + lldb/source/Version/CMakeLists.txt | 15 +- .../platform/connect/TestPlatformConnect.py | 45 + .../API/commands/settings/TestSettings.py | 2 - .../commands/statistics/basic/TestStats.py | 86 + .../target/stop-hooks/TestStopHookScripted.py | 16 +- .../coroutine_handle/TestCoroutineHandle.py | 51 +- .../statusline/TestStatusline.py | 4 +- .../lang/c/forward/TestForwardDeclaration.py | 1 - .../TestDeclFromSubmodule.py | 14 +- .../cpp/forward/TestCPPForwardDeclaration.py | 1 - .../macosx/simulator/TestSimulatorPlatform.py | 12 +- .../attach/TestDAP_attachByPortNum.py | 61 +- .../tools/lldb-dap/launch/TestDAP_launch.py | 2 +- .../stepInTargets/TestDAP_stepInTargets.py | 46 - .../command-plugin-enable+disable.test | 87 + .../Shell/Commands/command-plugin-list.test | 82 + .../Shell/Expr/TestObjCxxEnumConflict.test | 54 + .../Shell/ObjectFile/PECOFF/dwarf-clang.yaml | 151 + .../ObjectFile/PECOFF/dwarf-gcc-mingw.yaml | 151 + .../Shell/Settings/TestFrameFormatName.test | 4 + .../Settings/TestFrameFunctionInlined.test | 39 + lldb/test/Shell/lit.cfg.py | 5 + lldb/test/Shell/lit.site.cfg.py.in | 1 + lldb/test/Unit/lit.cfg.py | 1 + lldb/test/Unit/lit.site.cfg.py.in | 1 + lldb/tools/debugserver/source/RNBRemote.cpp | 2 +- lldb/tools/lldb-dap/CMakeLists.txt | 1 + lldb/tools/lldb-dap/DAP.cpp | 5 +- lldb/tools/lldb-dap/DAP.h | 2 +- lldb/tools/lldb-dap/EventHelper.cpp | 155 +- lldb/tools/lldb-dap/EventHelper.h | 4 +- .../ConfigurationDoneRequestHandler.cpp | 15 +- lldb/tools/lldb-dap/Handler/RequestHandler.h | 28 +- .../Handler/RestartRequestHandler.cpp | 23 +- .../Handler/StepInTargetsRequestHandler.cpp | 198 +- .../Handler/ThreadsRequestHandler.cpp | 77 +- lldb/tools/lldb-dap/JSONUtils.cpp | 64 - lldb/tools/lldb-dap/JSONUtils.h | 24 - lldb/tools/lldb-dap/Protocol/ProtocolBase.h | 4 +- .../lldb-dap/Protocol/ProtocolEvents.cpp | 20 + lldb/tools/lldb-dap/Protocol/ProtocolEvents.h | 46 + .../lldb-dap/Protocol/ProtocolRequests.cpp | 127 +- .../lldb-dap/Protocol/ProtocolRequests.h | 25 +- .../tools/lldb-dap/Protocol/ProtocolTypes.cpp | 37 +- lldb/tools/lldb-dap/Protocol/ProtocolTypes.h | 39 +- lldb/tools/lldb-dap/ProtocolUtils.cpp | 51 + lldb/tools/lldb-dap/ProtocolUtils.h | 26 + lldb/unittests/ABI/AArch64/ABIAArch64Test.cpp | 71 + lldb/unittests/ABI/AArch64/CMakeLists.txt | 9 + lldb/unittests/ABI/CMakeLists.txt | 3 + lldb/unittests/CMakeLists.txt | 1 + lldb/unittests/Core/FormatEntityTest.cpp | 1 + lldb/unittests/Core/MangledTest.cpp | 92 +- lldb/unittests/Core/PluginManagerTest.cpp | 90 + lldb/unittests/DAP/ProtocolTypesTest.cpp | 148 +- .../Symbol/PostfixExpressionTest.cpp | 4 +- .../PdbFPOProgramToDWARFExpressionTests.cpp | 4 +- llvm/CMakeLists.txt | 23 +- llvm/cmake/modules/CrossCompile.cmake | 6 +- llvm/docs/CommandGuide/lit.rst | 8 + llvm/docs/CommandGuide/llvm-addr2line.rst | 3 + .../CommandGuide/llvm-debuginfo-analyzer.rst | 4 +- llvm/docs/LangRef.rst | 3 +- llvm/docs/NVPTXUsage.rst | 23 + llvm/docs/ReleaseNotes.md | 2 + .../BuildingAJIT/Chapter1/KaleidoscopeJIT.h | 4 +- .../BuildingAJIT/Chapter2/KaleidoscopeJIT.h | 4 +- .../BuildingAJIT/Chapter3/KaleidoscopeJIT.h | 4 +- .../BuildingAJIT/Chapter4/KaleidoscopeJIT.h | 4 +- .../Kaleidoscope/include/KaleidoscopeJIT.h | 4 +- .../LLJITWithGDBRegistrationListener.cpp | 2 +- .../SpeculativeJIT/SpeculativeJIT.cpp | 3 +- llvm/include/llvm/ADT/MapVector.h | 7 +- llvm/include/llvm/ADT/STLExtras.h | 22 + llvm/include/llvm/ADT/bit.h | 28 +- llvm/include/llvm/Analysis/AliasAnalysis.h | 2 +- llvm/include/llvm/Analysis/CaptureTracking.h | 6 - llvm/include/llvm/Analysis/IR2Vec.h | 69 +- llvm/include/llvm/Analysis/IVDescriptors.h | 3 +- .../include/llvm/Analysis/MemoryProfileInfo.h | 19 +- llvm/include/llvm/BinaryFormat/Dwarf.def | 3 +- llvm/include/llvm/CGData/CGDataPatchItem.h | 33 + llvm/include/llvm/CGData/CodeGenData.h | 3 + llvm/include/llvm/CGData/CodeGenData.inc | 2 +- llvm/include/llvm/CGData/CodeGenDataWriter.h | 25 +- .../llvm/CGData/StableFunctionMapRecord.h | 10 +- .../CodeGen/GlobalISel/GIMatchTableExecutor.h | 12 + .../GlobalISel/GIMatchTableExecutorImpl.h | 20 + llvm/include/llvm/CodeGen/GlobalISel/Utils.h | 4 + llvm/include/llvm/CodeGen/ISDOpcodes.h | 10 +- llvm/include/llvm/CodeGen/MachinePipeliner.h | 34 +- llvm/include/llvm/CodeGen/MachineScheduler.h | 14 +- llvm/include/llvm/CodeGen/ScheduleDAG.h | 7 + llvm/include/llvm/CodeGen/ScheduleDAGInstrs.h | 10 + .../llvm/CodeGen/ScoreboardHazardRecognizer.h | 2 +- llvm/include/llvm/CodeGen/SelectionDAGNodes.h | 13 + llvm/include/llvm/CodeGen/TargetLowering.h | 6 +- llvm/include/llvm/CodeGen/ValueTypes.td | 357 +- llvm/include/llvm/DebugInfo/BTF/BTFContext.h | 3 +- llvm/include/llvm/DebugInfo/BTF/BTFParser.h | 18 +- .../CodeView/AppendingTypeTableBuilder.h | 3 +- .../llvm/DebugInfo/CodeView/CVSymbolVisitor.h | 16 +- .../llvm/DebugInfo/CodeView/CVTypeVisitor.h | 41 +- .../llvm/DebugInfo/CodeView/CodeView.h | 6 +- .../llvm/DebugInfo/CodeView/CodeViewError.h | 5 +- .../DebugInfo/CodeView/CodeViewRecordIO.h | 34 +- .../CodeView/ContinuationRecordBuilder.h | 9 +- .../CodeView/DebugChecksumsSubsection.h | 11 +- .../CodeView/DebugCrossExSubsection.h | 8 +- .../CodeView/DebugCrossImpSubsection.h | 12 +- .../CodeView/DebugFrameDataSubsection.h | 7 +- .../CodeView/DebugInlineeLinesSubsection.h | 13 +- .../DebugInfo/CodeView/DebugLinesSubsection.h | 13 +- .../CodeView/DebugStringTableSubsection.h | 11 +- .../llvm/DebugInfo/CodeView/DebugSubsection.h | 5 +- .../CodeView/DebugSubsectionRecord.h | 23 +- .../CodeView/DebugSymbolsSubsection.h | 5 +- .../llvm/DebugInfo/CodeView/EnumTables.h | 61 +- .../llvm/DebugInfo/CodeView/Formatters.h | 3 +- llvm/include/llvm/DebugInfo/CodeView/GUID.h | 3 +- .../CodeView/GlobalTypeTableBuilder.h | 3 +- .../CodeView/LazyRandomTypeCollection.h | 3 +- llvm/include/llvm/DebugInfo/CodeView/Line.h | 3 +- .../CodeView/MergingTypeTableBuilder.h | 3 +- .../llvm/DebugInfo/CodeView/RecordName.h | 5 +- .../DebugInfo/CodeView/RecordSerialization.h | 19 +- .../DebugInfo/CodeView/SimpleTypeSerializer.h | 5 +- .../DebugInfo/CodeView/StringsAndChecksums.h | 24 +- .../llvm/DebugInfo/CodeView/SymbolDumper.h | 5 +- .../llvm/DebugInfo/CodeView/SymbolRecord.h | 5 +- .../DebugInfo/CodeView/SymbolRecordHelpers.h | 9 +- .../DebugInfo/CodeView/SymbolRecordMapping.h | 3 +- .../DebugInfo/CodeView/SymbolSerializer.h | 3 +- .../llvm/DebugInfo/CodeView/TypeDumpVisitor.h | 3 +- .../llvm/DebugInfo/CodeView/TypeHashing.h | 18 +- .../llvm/DebugInfo/CodeView/TypeIndex.h | 7 +- .../DebugInfo/CodeView/TypeIndexDiscovery.h | 29 +- .../DebugInfo/CodeView/TypeRecordHelpers.h | 9 +- .../DebugInfo/CodeView/TypeRecordMapping.h | 3 +- .../DebugInfo/CodeView/TypeStreamMerger.h | 55 +- .../DebugInfo/CodeView/TypeTableCollection.h | 3 +- .../DWARF/DWARFAbbreviationDeclaration.h | 31 +- .../DebugInfo/DWARF/DWARFAcceleratorTable.h | 68 +- .../llvm/DebugInfo/DWARF/DWARFAddressRange.h | 8 +- .../llvm/DebugInfo/DWARF/DWARFAttribute.h | 5 +- .../llvm/DebugInfo/DWARF/DWARFCFIProgram.h | 19 +- .../llvm/DebugInfo/DWARF/DWARFCompileUnit.h | 3 +- .../llvm/DebugInfo/DWARF/DWARFContext.h | 11 +- .../llvm/DebugInfo/DWARF/DWARFDataExtractor.h | 84 +- .../DWARF/DWARFDataExtractorSimple.h | 198 + .../llvm/DebugInfo/DWARF/DWARFDebugAbbrev.h | 19 +- .../DebugInfo/DWARF/DWARFDebugArangeSet.h | 11 +- .../llvm/DebugInfo/DWARF/DWARFDebugFrame.h | 63 +- .../DebugInfo/DWARF/DWARFDebugInfoEntry.h | 7 +- .../llvm/DebugInfo/DWARF/DWARFDebugLine.h | 114 +- .../llvm/DebugInfo/DWARF/DWARFDebugLoc.h | 18 +- .../llvm/DebugInfo/DWARF/DWARFDebugPubTable.h | 7 +- .../DebugInfo/DWARF/DWARFDebugRangeList.h | 11 +- .../llvm/DebugInfo/DWARF/DWARFDebugRnglists.h | 12 +- llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h | 96 +- .../llvm/DebugInfo/DWARF/DWARFExpression.h | 98 +- .../llvm/DebugInfo/DWARF/DWARFFormValue.h | 86 +- .../llvm/DebugInfo/DWARF/DWARFListTable.h | 9 +- .../DebugInfo/DWARF/DWARFLocationExpression.h | 4 +- .../llvm/DebugInfo/DWARF/DWARFTypePrinter.h | 8 +- llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h | 38 +- .../llvm/DebugInfo/DWARF/DWARFUnitIndex.h | 26 +- .../llvm/DebugInfo/DWARF/DWARFVerifier.h | 64 +- .../llvm/DebugInfo/GSYM/CallSiteInfo.h | 19 +- .../llvm/DebugInfo/GSYM/DwarfTransformer.h | 5 +- .../llvm/DebugInfo/GSYM/ExtractRanges.h | 24 +- llvm/include/llvm/DebugInfo/GSYM/FileWriter.h | 25 +- .../llvm/DebugInfo/GSYM/FunctionInfo.h | 14 +- .../include/llvm/DebugInfo/GSYM/GsymCreator.h | 38 +- llvm/include/llvm/DebugInfo/GSYM/GsymReader.h | 54 +- llvm/include/llvm/DebugInfo/GSYM/Header.h | 11 +- llvm/include/llvm/DebugInfo/GSYM/InlineInfo.h | 19 +- llvm/include/llvm/DebugInfo/GSYM/LineTable.h | 13 +- .../llvm/DebugInfo/GSYM/LookupResult.h | 7 +- .../llvm/DebugInfo/GSYM/MergedFunctionsInfo.h | 14 +- .../DebugInfo/GSYM/ObjectFileTransformer.h | 6 +- .../DebugInfo/LogicalView/Core/LVCompare.h | 11 +- .../DebugInfo/LogicalView/Core/LVElement.h | 7 +- .../llvm/DebugInfo/LogicalView/Core/LVLine.h | 7 +- .../DebugInfo/LogicalView/Core/LVLocation.h | 11 +- .../DebugInfo/LogicalView/Core/LVObject.h | 13 +- .../DebugInfo/LogicalView/Core/LVOptions.h | 37 +- .../llvm/DebugInfo/LogicalView/Core/LVRange.h | 3 +- .../DebugInfo/LogicalView/Core/LVReader.h | 9 +- .../llvm/DebugInfo/LogicalView/Core/LVScope.h | 35 +- .../llvm/DebugInfo/LogicalView/Core/LVSort.h | 20 +- .../LogicalView/Core/LVSourceLanguage.h | 69 + .../DebugInfo/LogicalView/Core/LVSupport.h | 15 +- .../DebugInfo/LogicalView/Core/LVSymbol.h | 3 +- .../llvm/DebugInfo/LogicalView/Core/LVType.h | 13 +- .../DebugInfo/LogicalView/LVReaderHandler.h | 9 +- llvm/include/llvm/DebugInfo/MSF/MSFBuilder.h | 43 +- llvm/include/llvm/DebugInfo/MSF/MSFCommon.h | 9 +- llvm/include/llvm/DebugInfo/MSF/MSFError.h | 5 +- .../llvm/DebugInfo/MSF/MappedBlockStream.h | 5 +- .../include/llvm/DebugInfo/PDB/GenericError.h | 5 +- .../llvm/DebugInfo/PDB/IPDBFrameData.h | 3 +- .../llvm/DebugInfo/PDB/IPDBInjectedSource.h | 3 +- .../llvm/DebugInfo/PDB/IPDBLineNumber.h | 3 +- .../llvm/DebugInfo/PDB/IPDBRawSymbol.h | 11 +- llvm/include/llvm/DebugInfo/PDB/IPDBSession.h | 3 +- .../llvm/DebugInfo/PDB/IPDBSourceFile.h | 3 +- .../PDB/Native/DbiModuleDescriptor.h | 30 +- .../PDB/Native/DbiModuleDescriptorBuilder.h | 37 +- .../llvm/DebugInfo/PDB/Native/DbiModuleList.h | 30 +- .../llvm/DebugInfo/PDB/Native/DbiStream.h | 71 +- .../DebugInfo/PDB/Native/DbiStreamBuilder.h | 54 +- .../llvm/DebugInfo/PDB/Native/FormatUtil.h | 22 +- .../DebugInfo/PDB/Native/GSIStreamBuilder.h | 20 +- .../llvm/DebugInfo/PDB/Native/GlobalsStream.h | 12 +- llvm/include/llvm/DebugInfo/PDB/Native/Hash.h | 7 +- .../llvm/DebugInfo/PDB/Native/HashTable.h | 7 +- .../llvm/DebugInfo/PDB/Native/InfoStream.h | 31 +- .../DebugInfo/PDB/Native/InfoStreamBuilder.h | 24 +- .../llvm/DebugInfo/PDB/Native/InputFile.h | 81 +- .../llvm/DebugInfo/PDB/Native/LinePrinter.h | 50 +- .../DebugInfo/PDB/Native/ModuleDebugStream.h | 31 +- .../DebugInfo/PDB/Native/NamedStreamMap.h | 31 +- .../DebugInfo/PDB/Native/NativeRawSymbol.h | 3 +- .../llvm/DebugInfo/PDB/Native/NativeSession.h | 3 +- .../DebugInfo/PDB/Native/NativeSourceFile.h | 3 +- .../llvm/DebugInfo/PDB/Native/PDBFile.h | 3 +- .../DebugInfo/PDB/Native/PDBFileBuilder.h | 30 +- .../DebugInfo/PDB/Native/PDBStringTable.h | 20 +- .../PDB/Native/PDBStringTableBuilder.h | 21 +- .../llvm/DebugInfo/PDB/Native/PublicsStream.h | 13 +- .../llvm/DebugInfo/PDB/Native/RawError.h | 5 +- .../llvm/DebugInfo/PDB/Native/SymbolCache.h | 38 +- .../llvm/DebugInfo/PDB/Native/SymbolStream.h | 13 +- .../llvm/DebugInfo/PDB/Native/TpiHashing.h | 5 +- .../llvm/DebugInfo/PDB/Native/TpiStream.h | 56 +- .../DebugInfo/PDB/Native/TpiStreamBuilder.h | 22 +- llvm/include/llvm/DebugInfo/PDB/PDB.h | 9 +- llvm/include/llvm/DebugInfo/PDB/PDBExtras.h | 44 +- .../include/llvm/DebugInfo/PDB/PDBSymDumper.h | 3 +- llvm/include/llvm/DebugInfo/PDB/PDBSymbol.h | 3 +- .../llvm/DebugInfo/PDB/PDBSymbolCompiland.h | 3 +- .../llvm/DebugInfo/PDB/PDBSymbolData.h | 3 +- .../include/llvm/DebugInfo/PDB/PDBSymbolExe.h | 3 +- .../llvm/DebugInfo/PDB/PDBSymbolFunc.h | 3 +- .../DebugInfo/PDB/PDBSymbolFuncDebugEnd.h | 3 +- .../DebugInfo/PDB/PDBSymbolFuncDebugStart.h | 3 +- .../llvm/DebugInfo/PDB/PDBSymbolLabel.h | 3 +- .../DebugInfo/PDB/PDBSymbolPublicSymbol.h | 3 +- .../llvm/DebugInfo/PDB/PDBSymbolThunk.h | 3 +- .../llvm/DebugInfo/PDB/PDBSymbolTypeArray.h | 3 +- .../DebugInfo/PDB/PDBSymbolTypeBaseClass.h | 3 +- .../llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h | 3 +- .../llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h | 3 +- .../DebugInfo/PDB/PDBSymbolTypeFunctionArg.h | 3 +- .../DebugInfo/PDB/PDBSymbolTypeFunctionSig.h | 3 +- .../llvm/DebugInfo/PDB/PDBSymbolTypePointer.h | 3 +- .../llvm/DebugInfo/PDB/PDBSymbolTypeTypedef.h | 3 +- .../llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h | 3 +- .../llvm/DebugInfo/PDB/PDBSymbolTypeVTable.h | 3 +- .../DebugInfo/PDB/PDBSymbolTypeVTableShape.h | 3 +- .../llvm/DebugInfo/PDB/PDBSymbolUnknown.h | 3 +- .../DebugInfo/PDB/PDBSymbolUsingNamespace.h | 3 +- llvm/include/llvm/DebugInfo/PDB/UDTLayout.h | 40 +- .../llvm/DebugInfo/Symbolize/DIPrinter.h | 10 +- .../include/llvm/DebugInfo/Symbolize/Markup.h | 9 +- .../llvm/DebugInfo/Symbolize/MarkupFilter.h | 13 +- .../llvm/DebugInfo/Symbolize/Symbolize.h | 62 +- .../Orc/Debugging/DebugInfoSupport.h | 2 +- .../Orc/Debugging/PerfSupportPlugin.h | 2 +- .../Orc/RTDyldObjectLinkingLayer.h | 3 +- .../Orc/Shared/PerfSharedStructs.h | 2 +- .../Orc/TargetProcess/JITLoaderPerf.h | 2 +- .../llvm/Frontend/Directive/DirectiveBase.td | 41 +- .../llvm/Frontend/Directive/Spelling.h | 40 + .../Frontend/HLSL/HLSLRootSignatureUtils.h | 1 + llvm/include/llvm/Frontend/OpenACC/ACC.td | 146 +- llvm/include/llvm/Frontend/OpenMP/OMP.td | 496 +- llvm/include/llvm/IR/BasicBlock.h | 3 +- .../include/llvm/IR/DebugProgramInstruction.h | 19 - llvm/include/llvm/IR/DerivedTypes.h | 2 + llvm/include/llvm/IR/Function.h | 19 + llvm/include/llvm/IR/GlobalObject.h | 8 +- llvm/include/llvm/IR/GlobalVariable.h | 17 + llvm/include/llvm/IR/IRBuilder.h | 11 +- llvm/include/llvm/IR/InstrTypes.h | 3 +- llvm/include/llvm/IR/IntrinsicInst.h | 2 +- llvm/include/llvm/IR/Intrinsics.td | 7 +- llvm/include/llvm/IR/IntrinsicsARM.td | 2 - llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsLoongArch.td | 7 +- llvm/include/llvm/IR/IntrinsicsNVVM.td | 5 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 2 + llvm/include/llvm/IR/PassManagerImpl.h | 6 - llvm/include/llvm/IR/PatternMatch.h | 31 +- llvm/include/llvm/IR/RuntimeLibcalls.def | 20 +- llvm/include/llvm/IR/RuntimeLibcalls.h | 19 +- llvm/include/llvm/MC/MCAsmBackend.h | 3 +- llvm/include/llvm/MC/MCAsmInfo.h | 7 +- llvm/include/llvm/MC/MCAsmMacro.h | 9 +- llvm/include/llvm/MC/MCAssembler.h | 50 +- llvm/include/llvm/MC/MCCodeEmitter.h | 4 +- llvm/include/llvm/MC/MCContext.h | 202 +- llvm/include/llvm/MC/MCDecoderOps.h | 33 +- .../llvm/MC/MCDisassembler/MCDisassembler.h | 5 +- .../llvm/MC/MCDisassembler/MCRelocationInfo.h | 4 +- .../llvm/MC/MCDisassembler/MCSymbolizer.h | 3 +- llvm/include/llvm/MC/MCDwarf.h | 80 +- llvm/include/llvm/MC/MCExpr.h | 95 +- llvm/include/llvm/MC/MCFragment.h | 9 +- llvm/include/llvm/MC/MCInst.h | 27 +- llvm/include/llvm/MC/MCInstPrinter.h | 11 +- llvm/include/llvm/MC/MCInstrAnalysis.h | 3 +- llvm/include/llvm/MC/MCInstrDesc.h | 13 +- llvm/include/llvm/MC/MCInstrInfo.h | 5 +- .../llvm/MC/MCLinkerOptimizationHint.h | 7 +- llvm/include/llvm/MC/MCMachObjectWriter.h | 7 +- llvm/include/llvm/MC/MCObjectFileInfo.h | 3 +- llvm/include/llvm/MC/MCObjectWriter.h | 7 +- llvm/include/llvm/MC/MCParser/AsmLexer.h | 14 +- llvm/include/llvm/MC/MCParser/MCAsmParser.h | 14 +- .../llvm/MC/MCParser/MCAsmParserExtension.h | 3 +- .../llvm/MC/MCParser/MCParsedAsmOperand.h | 3 +- .../llvm/MC/MCParser/MCTargetAsmParser.h | 3 +- llvm/include/llvm/MC/MCPseudoProbe.h | 51 +- llvm/include/llvm/MC/MCRegisterInfo.h | 3 +- llvm/include/llvm/MC/MCSchedule.h | 36 +- llvm/include/llvm/MC/MCSection.h | 3 +- llvm/include/llvm/MC/MCSectionMachO.h | 3 +- llvm/include/llvm/MC/MCStreamer.h | 9 +- llvm/include/llvm/MC/MCSubtargetInfo.h | 3 +- llvm/include/llvm/MC/MCSymbol.h | 12 +- llvm/include/llvm/MC/MCTargetOptions.h | 7 +- .../llvm/MC/MCTargetOptionsCommandFlags.h | 45 +- llvm/include/llvm/MC/MCWinEH.h | 3 +- llvm/include/llvm/MC/StringTableBuilder.h | 19 +- llvm/include/llvm/MC/TargetRegistry.h | 143 +- llvm/include/llvm/MCA/CodeEmitter.h | 3 +- llvm/include/llvm/MCA/Context.h | 13 +- llvm/include/llvm/MCA/CustomBehaviour.h | 5 +- llvm/include/llvm/MCA/HWEventListener.h | 3 +- .../llvm/MCA/HardwareUnits/HardwareUnit.h | 4 +- llvm/include/llvm/MCA/HardwareUnits/LSUnit.h | 5 +- .../llvm/MCA/HardwareUnits/ResourceManager.h | 44 +- .../llvm/MCA/HardwareUnits/Scheduler.h | 34 +- llvm/include/llvm/MCA/IncrementalSourceMgr.h | 7 +- llvm/include/llvm/MCA/InstrBuilder.h | 11 +- llvm/include/llvm/MCA/Instruction.h | 33 +- llvm/include/llvm/MCA/Pipeline.h | 7 +- llvm/include/llvm/MCA/Stages/EntryStage.h | 3 +- .../llvm/MCA/Stages/InstructionTables.h | 3 +- llvm/include/llvm/MCA/Stages/Stage.h | 5 +- llvm/include/llvm/MCA/Support.h | 14 +- llvm/include/llvm/MCA/View.h | 3 +- llvm/include/llvm/ObjCopy/COFF/COFFObjcopy.h | 8 +- llvm/include/llvm/ObjCopy/CommonConfig.h | 3 +- llvm/include/llvm/ObjCopy/ConfigManager.h | 5 +- llvm/include/llvm/ObjCopy/ELF/ELFObjcopy.h | 21 +- .../include/llvm/ObjCopy/MachO/MachOObjcopy.h | 11 +- llvm/include/llvm/ObjCopy/ObjCopy.h | 9 +- llvm/include/llvm/ObjCopy/wasm/WasmObjcopy.h | 8 +- llvm/include/llvm/Object/Archive.h | 55 +- llvm/include/llvm/Object/ArchiveWriter.h | 42 +- llvm/include/llvm/Object/Binary.h | 15 +- llvm/include/llvm/Object/BuildID.h | 7 +- llvm/include/llvm/Object/COFF.h | 123 +- llvm/include/llvm/Object/COFFImportFile.h | 11 +- .../llvm/Object/COFFModuleDefinition.h | 3 +- llvm/include/llvm/Object/DXContainer.h | 17 +- llvm/include/llvm/Object/Decompressor.h | 7 +- llvm/include/llvm/Object/ELF.h | 9 +- llvm/include/llvm/Object/ELFObjectFile.h | 6 +- llvm/include/llvm/Object/Error.h | 10 +- llvm/include/llvm/Object/FaultMapParser.h | 11 +- llvm/include/llvm/Object/GOFFObjectFile.h | 3 +- llvm/include/llvm/Object/IRObjectFile.h | 6 +- llvm/include/llvm/Object/IRSymtab.h | 8 +- llvm/include/llvm/Object/MachO.h | 131 +- llvm/include/llvm/Object/MachOUniversal.h | 12 +- .../llvm/Object/MachOUniversalWriter.h | 23 +- llvm/include/llvm/Object/Minidump.h | 18 +- llvm/include/llvm/Object/ModuleSymbolTable.h | 11 +- llvm/include/llvm/Object/ObjectFile.h | 7 +- llvm/include/llvm/Object/OffloadBinary.h | 22 +- llvm/include/llvm/Object/OffloadBundle.h | 21 +- llvm/include/llvm/Object/RelocationResolver.h | 8 +- llvm/include/llvm/Object/SymbolSize.h | 6 +- llvm/include/llvm/Object/SymbolicFile.h | 3 +- llvm/include/llvm/Object/TapiFile.h | 3 +- llvm/include/llvm/Object/TapiUniversal.h | 5 +- llvm/include/llvm/Object/Wasm.h | 11 +- llvm/include/llvm/Object/WindowsMachineFlag.h | 5 +- llvm/include/llvm/Object/WindowsResource.h | 28 +- llvm/include/llvm/Object/XCOFFObjectFile.h | 110 +- llvm/include/llvm/Option/Arg.h | 26 +- llvm/include/llvm/Option/ArgList.h | 64 +- llvm/include/llvm/Option/OptSpecifier.h | 2 +- llvm/include/llvm/Option/OptTable.h | 9 +- llvm/include/llvm/Option/Option.h | 14 +- .../ProfileData/Coverage/CoverageMapping.h | 50 +- .../Coverage/CoverageMappingReader.h | 19 +- .../Coverage/CoverageMappingWriter.h | 9 +- .../include/llvm/ProfileData/DataAccessProf.h | 19 +- llvm/include/llvm/ProfileData/GCOV.h | 39 +- .../llvm/ProfileData/IndexedMemProfData.h | 3 +- llvm/include/llvm/ProfileData/InstrProf.h | 197 +- .../llvm/ProfileData/InstrProfCorrelator.h | 13 +- .../llvm/ProfileData/InstrProfData.inc | 20 +- .../llvm/ProfileData/InstrProfReader.h | 29 +- .../llvm/ProfileData/InstrProfWriter.h | 76 +- .../ItaniumManglingCanonicalizer.h | 13 +- llvm/include/llvm/ProfileData/MemProf.h | 37 +- llvm/include/llvm/ProfileData/MemProfCommon.h | 8 +- .../llvm/ProfileData/MemProfRadixTree.h | 7 + llvm/include/llvm/ProfileData/MemProfReader.h | 14 +- .../include/llvm/ProfileData/MemProfSummary.h | 8 +- .../llvm/ProfileData/MemProfSummaryBuilder.h | 7 +- .../llvm/ProfileData/PGOCtxProfReader.h | 6 +- .../llvm/ProfileData/PGOCtxProfWriter.h | 5 +- llvm/include/llvm/ProfileData/ProfileCommon.h | 41 +- llvm/include/llvm/ProfileData/SampleProf.h | 81 +- .../llvm/ProfileData/SampleProfReader.h | 36 +- .../llvm/ProfileData/SampleProfWriter.h | 19 +- .../llvm/ProfileData/SymbolRemappingReader.h | 5 +- llvm/include/llvm/Remarks/Remark.h | 13 +- llvm/include/llvm/Remarks/RemarkFormat.h | 5 +- llvm/include/llvm/Remarks/RemarkLinker.h | 15 +- llvm/include/llvm/Remarks/RemarkParser.h | 15 +- llvm/include/llvm/Remarks/RemarkSerializer.h | 5 +- llvm/include/llvm/Remarks/RemarkStringTable.h | 11 +- .../llvm/Remarks/YAMLRemarkSerializer.h | 9 +- llvm/include/llvm/SandboxIR/Constant.h | 38 +- llvm/include/llvm/SandboxIR/Function.h | 10 + llvm/include/llvm/Support/Compiler.h | 6 + llvm/include/llvm/Support/DebugCounter.h | 2 +- llvm/include/llvm/Support/MathExtras.h | 3 +- llvm/include/llvm/TableGen/DirectiveEmitter.h | 148 +- llvm/include/llvm/Target/TargetOptions.h | 892 +- .../include/llvm/Target/TargetSelectionDAG.td | 6 +- llvm/include/llvm/TargetParser/Host.h | 106 +- llvm/include/llvm/TargetParser/Triple.h | 34 +- llvm/include/llvm/Transforms/Coroutines/ABI.h | 9 +- .../llvm/Transforms/Coroutines/CoroInstr.h | 9 +- .../llvm/Transforms/Coroutines/CoroShape.h | 27 +- .../llvm/Transforms/Coroutines/CoroSplit.h | 14 +- .../Coroutines/MaterializationUtils.h | 8 +- .../Coroutines/SuspendCrossingInfo.h | 9 +- .../llvm/Transforms/HipStdPar/HipStdPar.h | 5 +- llvm/include/llvm/Transforms/IPO.h | 10 +- .../llvm/Transforms/IPO/AlwaysInliner.h | 6 +- llvm/include/llvm/Transforms/IPO/Attributor.h | 624 +- .../llvm/Transforms/IPO/BlockExtractor.h | 4 +- .../llvm/Transforms/IPO/EmbedBitcodePass.h | 3 +- llvm/include/llvm/Transforms/IPO/ExtractGV.h | 7 +- .../llvm/Transforms/IPO/FunctionAttrs.h | 18 +- .../llvm/Transforms/IPO/FunctionImport.h | 47 +- .../Transforms/IPO/FunctionSpecialization.h | 11 +- llvm/include/llvm/Transforms/IPO/GlobalDCE.h | 8 +- llvm/include/llvm/Transforms/IPO/Inliner.h | 20 +- .../include/llvm/Transforms/IPO/Internalize.h | 7 +- .../llvm/Transforms/IPO/LowerTypeTests.h | 22 +- .../llvm/Transforms/IPO/MergeFunctions.h | 7 +- .../llvm/Transforms/IPO/ModuleInliner.h | 3 +- .../Transforms/IPO/SampleContextTracker.h | 86 +- .../llvm/Transforms/IPO/SampleProfile.h | 17 +- .../llvm/Transforms/IPO/SampleProfileProbe.h | 15 +- .../llvm/Transforms/IPO/StripDeadPrototypes.h | 3 +- .../llvm/Transforms/IPO/StripSymbols.h | 11 +- .../Transforms/IPO/ThinLTOBitcodeWriter.h | 3 +- .../llvm/Transforms/IPO/WholeProgramDevirt.h | 40 +- .../llvm/Transforms/InstCombine/InstCombine.h | 14 +- .../Instrumentation/AddressSanitizer.h | 14 +- .../Instrumentation/BoundsChecking.h | 8 +- .../Instrumentation/DataFlowSanitizer.h | 3 +- .../Transforms/Instrumentation/GCOVProfiler.h | 3 +- .../Instrumentation/HWAddressSanitizer.h | 8 +- .../Instrumentation/InstrProfiling.h | 3 +- .../llvm/Transforms/Instrumentation/KCFI.h | 3 +- .../Instrumentation/LowerAllowCheckPass.h | 10 +- .../Instrumentation/MemProfInstrumentation.h | 48 + .../{MemProfiler.h => MemProfUse.h} | 44 +- .../Instrumentation/MemorySanitizer.h | 12 +- .../NumericalStabilitySanitizer.h | 3 +- .../Instrumentation/PGOInstrumentation.h | 26 +- .../Instrumentation/RealtimeSanitizer.h | 3 +- .../Instrumentation/SanitizerBinaryMetadata.h | 5 +- .../Instrumentation/SanitizerCoverage.h | 3 +- .../Instrumentation/ThreadSanitizer.h | 5 +- .../Instrumentation/TypeSanitizer.h | 3 +- llvm/include/llvm/Transforms/ObjCARC.h | 13 +- llvm/include/llvm/Transforms/Scalar.h | 67 +- .../include/llvm/Transforms/Scalar/EarlyCSE.h | 8 +- llvm/include/llvm/Transforms/Scalar/GVN.h | 71 +- .../llvm/Transforms/Scalar/JumpThreading.h | 100 +- .../llvm/Transforms/Scalar/LoopPassManager.h | 40 +- .../Transforms/Scalar/LowerExpectIntrinsic.h | 3 +- llvm/include/llvm/Transforms/Scalar/SCCP.h | 3 +- .../llvm/Transforms/Scalar/Scalarizer.h | 5 +- .../llvm/Transforms/Scalar/SimplifyCFG.h | 12 +- llvm/include/llvm/Transforms/Utils.h | 36 +- .../llvm/Transforms/Utils/AMDGPUEmitPrintf.h | 5 +- .../Transforms/Utils/ASanStackFrameLayout.h | 9 +- .../Transforms/Utils/AssumeBundleBuilder.h | 29 +- .../llvm/Transforms/Utils/BasicBlockUtils.h | 235 +- .../llvm/Transforms/Utils/BuildLibCalls.h | 251 +- .../llvm/Transforms/Utils/CallGraphUpdater.h | 11 +- .../Transforms/Utils/CallPromotionUtils.h | 30 +- llvm/include/llvm/Transforms/Utils/Cloning.h | 181 +- .../llvm/Transforms/Utils/CodeExtractor.h | 41 +- .../llvm/Transforms/Utils/CodeLayout.h | 20 +- .../llvm/Transforms/Utils/CodeMoverUtils.h | 63 +- llvm/include/llvm/Transforms/Utils/Debugify.h | 49 +- .../Transforms/Utils/FunctionComparator.h | 35 +- .../Transforms/Utils/FunctionImportUtils.h | 12 +- .../llvm/Transforms/Utils/Instrumentation.h | 30 +- .../llvm/Transforms/Utils/IntegerDivision.h | 66 +- llvm/include/llvm/Transforms/Utils/LCSSA.h | 3 +- llvm/include/llvm/Transforms/Utils/Local.h | 271 +- .../llvm/Transforms/Utils/LoopRotationUtils.h | 13 +- .../llvm/Transforms/Utils/LoopSimplify.h | 9 +- .../include/llvm/Transforms/Utils/LoopUtils.h | 260 +- .../Transforms/Utils/LowerMemIntrinsics.h | 23 +- .../llvm/Transforms/Utils/ModuleUtils.h | 63 +- .../llvm/Transforms/Utils/PredicateInfo.h | 17 +- .../llvm/Transforms/Utils/PromoteMemToReg.h | 6 +- .../llvm/Transforms/Utils/SCCPSolver.h | 99 +- .../llvm/Transforms/Utils/SSAUpdaterBulk.h | 12 +- .../llvm/Transforms/Utils/SanitizerStats.h | 7 +- .../Utils/ScalarEvolutionExpander.h | 82 +- llvm/include/llvm/Transforms/Utils/SizeOpts.h | 33 +- .../llvm/Transforms/Utils/SplitModule.h | 9 +- .../llvm/Transforms/Utils/SymbolRewriter.h | 10 +- .../llvm/Transforms/Utils/UnrollLoop.h | 84 +- .../llvm/Transforms/Utils/ValueMapper.h | 72 +- .../Vectorize/LoadStoreVectorizer.h | 6 +- .../llvm/Transforms/Vectorize/LoopVectorize.h | 24 +- .../SandboxVectorizer/DependencyGraph.h | 41 +- .../Vectorize/SandboxVectorizer/Interval.h | 4 + .../Vectorize/SandboxVectorizer/Legality.h | 7 +- .../SandboxVectorizer/Passes/BottomUpVec.h | 5 +- .../SandboxVectorizer/Passes/PackReuse.h | 36 + .../SandboxVectorizer/SandboxVectorizer.h | 9 +- .../Vectorize/SandboxVectorizer/Scheduler.h | 14 +- .../SandboxVectorizer/SeedCollector.h | 17 +- .../Vectorize/SandboxVectorizer/VecUtils.h | 91 +- llvm/lib/Analysis/AliasAnalysis.cpp | 4 +- llvm/lib/Analysis/BasicAliasAnalysis.cpp | 12 +- llvm/lib/Analysis/CFG.cpp | 2 +- llvm/lib/Analysis/CaptureTracking.cpp | 24 - llvm/lib/Analysis/ConstantFolding.cpp | 10 +- llvm/lib/Analysis/IR2Vec.cpp | 69 +- llvm/lib/Analysis/IVDescriptors.cpp | 6 +- llvm/lib/Analysis/LoopAccessAnalysis.cpp | 2 +- llvm/lib/Analysis/MemoryProfileInfo.cpp | 48 +- llvm/lib/Analysis/ModuleSummaryAnalysis.cpp | 25 +- llvm/lib/Analysis/ValueTracking.cpp | 35 +- llvm/lib/AsmParser/LLParser.cpp | 4 +- llvm/lib/BinaryFormat/MsgPackReader.cpp | 1 - llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 16 +- llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 28 +- llvm/lib/Bitcode/Writer/BitcodeWriterPass.cpp | 8 +- llvm/lib/CGData/CodeGenData.cpp | 4 +- llvm/lib/CGData/CodeGenDataReader.cpp | 9 +- llvm/lib/CGData/CodeGenDataWriter.cpp | 36 +- llvm/lib/CGData/StableFunctionMapRecord.cpp | 51 +- llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 6 +- llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 2 +- llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 3 +- llvm/lib/CodeGen/AtomicExpandPass.cpp | 13 +- llvm/lib/CodeGen/CodeGenPrepare.cpp | 13 +- llvm/lib/CodeGen/ExpandVectorPredication.cpp | 3 +- .../CodeGen/GlobalISel/GISelValueTracking.cpp | 31 +- .../CodeGen/GlobalISel/LegalizerHelper.cpp | 6 +- llvm/lib/CodeGen/GlobalISel/Utils.cpp | 11 + llvm/lib/CodeGen/GlobalMergeFunctions.cpp | 6 +- llvm/lib/CodeGen/IndirectBrExpandPass.cpp | 4 +- llvm/lib/CodeGen/MIRParser/MIRParser.cpp | 28 +- llvm/lib/CodeGen/MIRPrinter.cpp | 9 - llvm/lib/CodeGen/MachinePipeliner.cpp | 248 +- llvm/lib/CodeGen/MachineScheduler.cpp | 82 +- llvm/lib/CodeGen/MacroFusion.cpp | 12 + llvm/lib/CodeGen/ScheduleDAG.cpp | 3 + llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 164 +- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 16 +- .../SelectionDAG/LegalizeFloatTypes.cpp | 33 +- .../SelectionDAG/LegalizeIntegerTypes.cpp | 15 +- llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h | 1 + .../SelectionDAG/LegalizeVectorOps.cpp | 2 + .../SelectionDAG/LegalizeVectorTypes.cpp | 10 +- .../lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 16 +- .../SelectionDAG/SelectionDAGBuilder.cpp | 5 + .../SelectionDAG/SelectionDAGDumper.cpp | 2 + .../CodeGen/SelectionDAG/TargetLowering.cpp | 22 +- llvm/lib/CodeGen/TargetOptionsImpl.cpp | 5 +- .../lib/DWARFLinker/Classic/DWARFStreamer.cpp | 1 - .../Parallel/DWARFLinkerCompileUnit.cpp | 1 - .../DWARFLinker/Parallel/DWARFLinkerImpl.cpp | 1 - .../Parallel/DWARFLinkerTypeUnit.cpp | 1 - .../DWARFLinker/Parallel/OutputSections.cpp | 1 - .../Parallel/SyntheticTypeNameBuilder.cpp | 1 - llvm/lib/DWP/DWP.cpp | 2 - .../CodeView/ContinuationRecordBuilder.cpp | 3 +- .../CodeView/SimpleTypeSerializer.cpp | 5 +- llvm/lib/DebugInfo/DWARF/CMakeLists.txt | 1 - llvm/lib/DebugInfo/DWARF/DWARFCFIProgram.cpp | 3 +- llvm/lib/DebugInfo/DWARF/DWARFContext.cpp | 9 - .../DebugInfo/DWARF/DWARFDataExtractor.cpp | 137 - llvm/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp | 4 +- llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp | 3 +- llvm/lib/DebugInfo/DWARF/DWARFDie.cpp | 4 +- llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp | 153 +- llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp | 219 +- llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp | 31 +- llvm/lib/DebugInfo/GSYM/CallSiteInfo.cpp | 3 - llvm/lib/DebugInfo/GSYM/DwarfTransformer.cpp | 19 +- llvm/lib/DebugInfo/LogicalView/CMakeLists.txt | 1 + .../DebugInfo/LogicalView/Core/LVOptions.cpp | 1 + .../DebugInfo/LogicalView/Core/LVScope.cpp | 18 +- .../LogicalView/Core/LVSourceLanguage.cpp | 33 + .../LogicalView/Readers/LVCodeViewVisitor.cpp | 6 + .../LogicalView/Readers/LVDWARFReader.cpp | 9 +- .../ExecutionEngine/JITLink/COFFOptions.td | 2 +- llvm/lib/ExecutionEngine/Orc/LLJIT.cpp | 13 +- .../ExecutionEngine/Orc/OrcV2CBindings.cpp | 13 +- .../Orc/RTDyldObjectLinkingLayer.cpp | 5 +- llvm/lib/FileCheck/FileCheck.cpp | 1 - llvm/lib/Frontend/CMakeLists.txt | 1 + llvm/lib/Frontend/Directive/CMakeLists.txt | 6 + llvm/lib/Frontend/Directive/Spelling.cpp | 38 + .../Frontend/HLSL/HLSLRootSignatureUtils.cpp | 83 +- llvm/lib/Frontend/OpenACC/CMakeLists.txt | 2 +- llvm/lib/Frontend/OpenMP/CMakeLists.txt | 1 + llvm/lib/FuzzMutate/IRMutator.cpp | 68 +- llvm/lib/FuzzMutate/RandomIRBuilder.cpp | 1 - llvm/lib/IR/AutoUpgrade.cpp | 6 + llvm/lib/IR/BasicBlock.cpp | 26 +- llvm/lib/IR/ConstantFold.cpp | 7 +- llvm/lib/IR/Core.cpp | 8 +- llvm/lib/IR/Function.cpp | 16 +- llvm/lib/IR/IRBuilder.cpp | 35 +- llvm/lib/IR/IRPrintingPasses.cpp | 11 +- llvm/lib/IR/Instruction.cpp | 13 +- llvm/lib/IR/Instructions.cpp | 19 +- llvm/lib/IR/LLVMContextImpl.cpp | 1 - llvm/lib/IR/LLVMContextImpl.h | 20 +- llvm/lib/IR/LegacyPassManager.cpp | 6 - llvm/lib/IR/Module.cpp | 4 +- llvm/lib/IR/RuntimeLibcalls.cpp | 289 +- llvm/lib/IR/Type.cpp | 26 +- llvm/lib/IR/Value.cpp | 41 +- llvm/lib/IR/Verifier.cpp | 16 +- llvm/lib/IRPrinter/IRPrintingPasses.cpp | 11 +- llvm/lib/LTO/LTO.cpp | 4 +- llvm/lib/LTO/LTOModule.cpp | 7 +- llvm/lib/Linker/IRMover.cpp | 5 - llvm/lib/MC/MCContext.cpp | 3 - llvm/lib/MC/MCExpr.cpp | 47 +- llvm/lib/MC/MCParser/AsmParser.cpp | 2 + llvm/lib/MC/MCStreamer.cpp | 4 + llvm/lib/MC/StringTableBuilder.cpp | 2 +- llvm/lib/MCA/Stages/DispatchStage.cpp | 1 - llvm/lib/MCA/View.cpp | 2 - llvm/lib/ObjCopy/MachO/MachOObject.h | 2 +- llvm/lib/Object/ELF.cpp | 22 + llvm/lib/Object/ELFObjectFile.cpp | 3 +- llvm/lib/Object/OffloadBundle.cpp | 3 - llvm/lib/Object/XCOFFObjectFile.cpp | 12 +- llvm/lib/ObjectYAML/MachOEmitter.cpp | 2 +- llvm/lib/ObjectYAML/MachOYAML.cpp | 2 +- llvm/lib/Option/ArgList.cpp | 5 +- llvm/lib/Passes/PassBuilder.cpp | 14 +- llvm/lib/Passes/PassBuilderPipelines.cpp | 8 +- llvm/lib/Passes/PassRegistry.def | 1 + llvm/lib/Passes/StandardInstrumentations.cpp | 5 - llvm/lib/ProfileData/DataAccessProf.cpp | 2 - llvm/lib/ProfileData/InstrProfWriter.cpp | 1 - llvm/lib/ProfileData/MemProfCommon.cpp | 9 +- llvm/lib/ProfileData/MemProfRadixTree.cpp | 17 +- llvm/lib/SandboxIR/Constant.cpp | 18 +- llvm/lib/SandboxIR/Function.cpp | 7 + llvm/lib/SandboxIR/Pass.cpp | 1 - llvm/lib/SandboxIR/Tracker.cpp | 2 - llvm/lib/Support/CrashRecoveryContext.cpp | 1 - llvm/lib/Support/DebugCounter.cpp | 5 + llvm/lib/Support/DynamicLibrary.cpp | 8 +- llvm/lib/Support/ELFAttrParserExtended.cpp | 1 - llvm/lib/Support/LockFileManager.cpp | 2 - llvm/lib/Support/TextEncoding.cpp | 3 - llvm/lib/Support/Timer.cpp | 1 - llvm/lib/Support/Unix/DynamicLibrary.inc | 2 +- llvm/lib/Support/Unix/Threading.inc | 1 + llvm/lib/Support/Windows/DynamicLibrary.inc | 6 +- llvm/lib/Support/Windows/Path.inc | 2 +- llvm/lib/TableGen/JSONBackend.cpp | 1 - llvm/lib/TableGen/TGLexer.cpp | 2 - llvm/lib/Target/AArch64/AArch64.td | 5 +- .../AArch64/AArch64AdvSIMDScalarPass.cpp | 10 +- llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp | 6 +- llvm/lib/Target/AArch64/AArch64CollectLOH.cpp | 4 +- llvm/lib/Target/AArch64/AArch64Combine.td | 22 +- .../AArch64/AArch64ConditionalCompares.cpp | 6 +- .../AArch64DeadRegisterDefinitionsPass.cpp | 4 +- llvm/lib/Target/AArch64/AArch64FastISel.cpp | 2 +- .../Target/AArch64/AArch64FrameLowering.cpp | 18 +- .../Target/AArch64/AArch64ISelDAGToDAG.cpp | 12 +- .../Target/AArch64/AArch64ISelLowering.cpp | 389 +- llvm/lib/Target/AArch64/AArch64ISelLowering.h | 13 +- .../lib/Target/AArch64/AArch64InstrFormats.td | 8 +- llvm/lib/Target/AArch64/AArch64InstrInfo.cpp | 6 +- llvm/lib/Target/AArch64/AArch64InstrInfo.h | 2 +- llvm/lib/Target/AArch64/AArch64InstrInfo.td | 56 +- .../AArch64/AArch64LoadStoreOptimizer.cpp | 16 +- .../AArch64LowerHomogeneousPrologEpilog.cpp | 2 +- llvm/lib/Target/AArch64/AArch64Processors.td | 5 +- .../Target/AArch64/AArch64RegisterInfo.cpp | 2 +- .../lib/Target/AArch64/AArch64RegisterInfo.td | 2 +- .../Target/AArch64/AArch64SIMDInstrOpt.cpp | 2 +- .../Target/AArch64/AArch64SLSHardening.cpp | 2 +- .../lib/Target/AArch64/AArch64SVEInstrInfo.td | 17 +- llvm/lib/Target/AArch64/AArch64SchedA53.td | 2 +- .../Target/AArch64/AArch64SchedNeoverseV2.td | 4 +- llvm/lib/Target/AArch64/AArch64SchedOryon.td | 10 +- .../AArch64/AArch64SpeculationHardening.cpp | 2 +- llvm/lib/Target/AArch64/AArch64Subtarget.h | 4 +- .../Target/AArch64/AArch64SystemOperands.td | 4 +- .../AArch64/AArch64TargetTransformInfo.cpp | 40 +- .../AArch64/AsmParser/AArch64AsmParser.cpp | 16 +- llvm/lib/Target/AArch64/CMakeLists.txt | 3 +- .../AArch64ExternalSymbolizer.cpp | 4 +- .../AArch64/GISel/AArch64CallLowering.cpp | 51 +- .../GISel/AArch64InstructionSelector.cpp | 5 +- .../AArch64/GISel/AArch64RegisterBankInfo.cpp | 6 +- .../AArch64/GISel/AArch64RegisterBankInfo.h | 2 +- .../MCTargetDesc/AArch64AddressingModes.h | 6 +- .../MCTargetDesc/AArch64ELFStreamer.cpp | 8 +- .../MCTargetDesc/AArch64InstPrinter.cpp | 4 +- .../AArch64/MCTargetDesc/AArch64MCExpr.cpp | 16 - .../AArch64/MCTargetDesc/AArch64MCExpr.h | 38 +- .../MCTargetDesc/AArch64MCTargetDesc.cpp | 2 +- .../MCTargetDesc/AArch64TargetStreamer.cpp | 16 +- .../MCTargetDesc/AArch64TargetStreamer.h | 10 +- llvm/lib/Target/AArch64/SMEPeepholeOpt.cpp | 2 +- llvm/lib/Target/AArch64/SVEInstrFormats.td | 18 +- llvm/lib/Target/AMDGPU/AMDGPUCallLowering.cpp | 24 +- .../AMDGPU/AMDGPUInstCombineIntrinsic.cpp | 2 + .../lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp | 10 +- .../Target/AMDGPU/AMDGPUMCResourceInfo.cpp | 6 +- llvm/lib/Target/AMDGPU/AMDGPUMemoryUtils.cpp | 7 - .../lib/Target/AMDGPU/AMDGPUTargetMachine.cpp | 4 +- llvm/lib/Target/AMDGPU/FLATInstructions.td | 39 +- .../lib/Target/AMDGPU/GCNHazardRecognizer.cpp | 3 +- llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp | 22 +- .../MCTargetDesc/AMDGPUMCCodeEmitter.cpp | 1 + .../AMDGPU/MCTargetDesc/AMDGPUMCExpr.cpp | 41 +- .../Target/AMDGPU/MCTargetDesc/AMDGPUMCExpr.h | 2 +- .../AMDGPU/R600OptimizeVectorRegisters.cpp | 7 +- llvm/lib/Target/AMDGPU/SIFoldOperands.cpp | 6 + llvm/lib/Target/AMDGPU/SIISelLowering.cpp | 63 +- llvm/lib/Target/AMDGPU/SIISelLowering.h | 1 + llvm/lib/Target/AMDGPU/SIInstrInfo.cpp | 33 +- llvm/lib/Target/AMDGPU/SIInstrInfo.td | 72 +- llvm/lib/Target/AMDGPU/SIInstructions.td | 19 +- llvm/lib/Target/AMDGPU/SIMachineScheduler.cpp | 9 +- llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp | 6 +- .../Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp | 65 - llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.h | 87 +- llvm/lib/Target/AMDGPU/VOP3Instructions.td | 29 +- llvm/lib/Target/AMDGPU/VOP3PInstructions.td | 5 +- llvm/lib/Target/AMDGPU/VOPInstructions.td | 15 +- llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp | 1 - llvm/lib/Target/ARM/ARMISelLowering.cpp | 57 +- llvm/lib/Target/ARM/ARMInstrMVE.td | 2 +- llvm/lib/Target/ARM/ARMSubtarget.h | 30 +- .../Target/ARM/MCTargetDesc/ARMAsmBackend.cpp | 4 +- .../ARM/MCTargetDesc/ARMELFStreamer.cpp | 2 +- .../ARM/MCTargetDesc/ARMMCCodeEmitter.cpp | 2 +- .../lib/Target/ARM/MCTargetDesc/ARMMCExpr.cpp | 4 - llvm/lib/Target/ARM/MCTargetDesc/ARMMCExpr.h | 34 +- .../AVR/MCTargetDesc/AVRMCCodeEmitter.cpp | 2 +- .../lib/Target/AVR/MCTargetDesc/AVRMCExpr.cpp | 7 +- llvm/lib/Target/AVR/MCTargetDesc/AVRMCExpr.h | 22 +- .../Target/BPF/BPFAbstractMemberAccess.cpp | 4 +- llvm/lib/Target/BPF/BTFDebug.cpp | 2 +- llvm/lib/Target/BPF/BTFDebug.h | 3 +- llvm/lib/Target/CSKY/CSKYInstrAlias.td | 2 +- llvm/lib/Target/DirectX/DXILLegalizePass.cpp | 213 +- llvm/lib/Target/DirectX/DXILRootSignature.cpp | 132 +- llvm/lib/Target/DirectX/DXILRootSignature.h | 5 +- .../Target/Hexagon/HexagonISelLowering.cpp | 43 - .../Target/Lanai/AsmParser/LanaiAsmParser.cpp | 34 +- llvm/lib/Target/Lanai/LanaiISelLowering.cpp | 5 +- llvm/lib/Target/Lanai/LanaiMCInstLower.cpp | 2 +- .../Lanai/MCTargetDesc/LanaiMCCodeEmitter.cpp | 2 +- .../Target/Lanai/MCTargetDesc/LanaiMCExpr.cpp | 16 +- .../Target/Lanai/MCTargetDesc/LanaiMCExpr.h | 29 +- llvm/lib/Target/LoongArch/LoongArch.h | 3 +- .../LoongArchExpandAtomicPseudoInsts.cpp | 89 +- .../LoongArch/LoongArchISelDAGToDAG.cpp | 10 +- .../Target/LoongArch/LoongArchISelDAGToDAG.h | 8 +- .../LoongArch/LoongArchISelLowering.cpp | 451 +- .../Target/LoongArch/LoongArchISelLowering.h | 14 +- .../Target/LoongArch/LoongArchInstrInfo.td | 57 +- .../LoongArch/LoongArchLASXInstrInfo.td | 23 + .../Target/LoongArch/LoongArchLSXInstrInfo.td | 25 + .../LoongArch/LoongArchTargetMachine.cpp | 2 +- .../MCTargetDesc/LoongArchMCCodeEmitter.cpp | 2 +- .../MCTargetDesc/LoongArchMCExpr.cpp | 18 - .../LoongArch/MCTargetDesc/LoongArchMCExpr.h | 18 +- .../Target/M68k/MCTargetDesc/M68kMCExpr.cpp | 11 - .../lib/Target/M68k/MCTargetDesc/M68kMCExpr.h | 17 +- llvm/lib/Target/MSP430/MSP430ISelLowering.cpp | 119 - .../Target/Mips/AsmParser/MipsAsmParser.cpp | 8 +- .../Mips/MCTargetDesc/MipsMCCodeEmitter.cpp | 4 +- .../Target/Mips/MCTargetDesc/MipsMCExpr.cpp | 4 - .../lib/Target/Mips/MCTargetDesc/MipsMCExpr.h | 24 +- llvm/lib/Target/Mips/MipsDelaySlotFiller.cpp | 6 +- llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp | 69 +- llvm/lib/Target/NVPTX/NVPTXIntrinsics.td | 10 + .../Target/PowerPC/AsmParser/PPCAsmParser.cpp | 13 +- .../Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp | 4 - .../Target/PowerPC/MCTargetDesc/PPCMCExpr.h | 30 +- llvm/lib/Target/PowerPC/PPC.td | 3 +- llvm/lib/Target/PowerPC/PPCISelLowering.cpp | 104 +- llvm/lib/Target/PowerPC/PPCMIPeephole.cpp | 7 +- .../Target/PowerPC/PPCMachineScheduler.cpp | 18 +- llvm/lib/Target/PowerPC/PPCTargetMachine.cpp | 3 +- .../RISCV/MCTargetDesc/RISCVAsmBackend.cpp | 66 +- .../MCTargetDesc/RISCVELFObjectWriter.cpp | 14 +- .../RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp | 5 +- .../Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp | 14 - .../Target/RISCV/MCTargetDesc/RISCVMCExpr.h | 21 +- .../Target/RISCV/MCTargetDesc/RISCVMatInt.h | 8 +- llvm/lib/Target/RISCV/RISCVFeatures.td | 10 +- llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp | 226 +- llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h | 11 +- llvm/lib/Target/RISCV/RISCVISelLowering.cpp | 281 +- llvm/lib/Target/RISCV/RISCVISelLowering.h | 3 + llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp | 22 +- llvm/lib/Target/RISCV/RISCVInstrFormats.td | 2 + llvm/lib/Target/RISCV/RISCVInstrInfo.cpp | 4 + llvm/lib/Target/RISCV/RISCVInstrInfo.td | 41 +- .../Target/RISCV/RISCVInstrInfoVVLPatterns.td | 6 +- llvm/lib/Target/RISCV/RISCVInstrInfoXCV.td | 4 +- llvm/lib/Target/RISCV/RISCVInstrInfoXSf.td | 4 +- llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td | 31 +- llvm/lib/Target/RISCV/RISCVInstrInfoZb.td | 4 + .../lib/Target/RISCV/RISCVInstrInfoZvqdotq.td | 8 +- llvm/lib/Target/RISCV/RISCVProcessors.td | 3 + llvm/lib/Target/RISCV/RISCVRegisterInfo.td | 1 + llvm/lib/Target/RISCV/RISCVSchedSiFive7.td | 64 +- .../Target/RISCV/RISCVTargetTransformInfo.cpp | 3 +- llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp | 21 +- llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp | 2 + .../Target/SPIRV/SPIRVPrepareFunctions.cpp | 7 +- .../Target/Sparc/AsmParser/SparcAsmParser.cpp | 3 + .../Sparc/MCTargetDesc/SparcAsmBackend.cpp | 305 +- .../Target/Sparc/MCTargetDesc/SparcMCExpr.cpp | 13 - .../Target/Sparc/MCTargetDesc/SparcMCExpr.h | 19 +- .../MCTargetDesc/SystemZInstPrinterCommon.cpp | 2 +- .../SystemZ/MCTargetDesc/SystemZMCExpr.cpp | 4 +- .../SystemZ/MCTargetDesc/SystemZMCExpr.h | 32 +- .../Target/SystemZ/SystemZISelLowering.cpp | 14 + llvm/lib/Target/SystemZ/SystemZISelLowering.h | 1 + llvm/lib/Target/SystemZ/SystemZSubtarget.cpp | 8 +- llvm/lib/Target/VE/AsmParser/VEAsmParser.cpp | 4 +- .../VE/MCTargetDesc/VEMCCodeEmitter.cpp | 2 +- llvm/lib/Target/VE/MCTargetDesc/VEMCExpr.cpp | 10 +- llvm/lib/Target/VE/MCTargetDesc/VEMCExpr.h | 39 +- .../WebAssemblyFixIrreducibleControlFlow.cpp | 2 +- llvm/lib/Target/X86/X86ExpandPseudo.cpp | 9 +- llvm/lib/Target/X86/X86FixupInstTuning.cpp | 12 +- llvm/lib/Target/X86/X86FrameLowering.cpp | 3 +- llvm/lib/Target/X86/X86ISelLowering.cpp | 436 +- llvm/lib/Target/X86/X86InstrInfo.cpp | 1 + llvm/lib/Target/X86/X86MachineFunctionInfo.h | 2 +- llvm/lib/Target/X86/X86RegisterInfo.cpp | 2 +- .../lib/Target/X86/X86SuppressAPXForReloc.cpp | 2 +- .../lib/Target/X86/X86TargetTransformInfo.cpp | 15 +- .../Xtensa/MCTargetDesc/XtensaMCExpr.cpp | 12 - .../Target/Xtensa/MCTargetDesc/XtensaMCExpr.h | 20 +- llvm/lib/Target/Xtensa/XtensaISelDAGToDAG.cpp | 7 +- llvm/lib/TargetParser/Triple.cpp | 120 +- llvm/lib/Testing/Support/SupportHelpers.cpp | 1 - llvm/lib/TextAPI/BinaryReader/DylibReader.cpp | 1 - llvm/lib/TextAPI/InterfaceFile.cpp | 2 - llvm/lib/TextAPI/Platform.cpp | 4 +- llvm/lib/TextAPI/RecordsSlice.cpp | 2 +- llvm/lib/TextAPI/TextStub.cpp | 1 - llvm/lib/Transforms/Coroutines/CoroFrame.cpp | 41 +- llvm/lib/Transforms/Coroutines/CoroSplit.cpp | 32 +- .../Transforms/IPO/AttributorAttributes.cpp | 29 +- llvm/lib/Transforms/IPO/LowerTypeTests.cpp | 128 +- .../IPO/MemProfContextDisambiguation.cpp | 11 +- llvm/lib/Transforms/IPO/OpenMPOpt.cpp | 3 +- llvm/lib/Transforms/IPO/SCCP.cpp | 6 +- llvm/lib/Transforms/IPO/StripSymbols.cpp | 2 +- .../Transforms/IPO/ThinLTOBitcodeWriter.cpp | 4 +- .../lib/Transforms/IPO/WholeProgramDevirt.cpp | 2 +- .../InstCombine/InstCombineAddSub.cpp | 139 +- .../InstCombine/InstCombineCalls.cpp | 8 +- .../InstCombine/InstCombineCasts.cpp | 24 +- .../InstCombine/InstCombineSelect.cpp | 106 +- .../InstCombine/InstructionCombining.cpp | 3 +- .../Transforms/Instrumentation/CMakeLists.txt | 3 +- .../Instrumentation/InstrProfiling.cpp | 9 +- .../MemProfInstrumentation.cpp | 656 + .../{MemProfiler.cpp => MemProfUse.cpp} | 657 +- .../Instrumentation/MemorySanitizer.cpp | 51 +- .../Instrumentation/PGOInstrumentation.cpp | 4 +- llvm/lib/Transforms/ObjCARC/BlotMapVector.h | 3 +- .../Transforms/Scalar/ConstantHoisting.cpp | 4 +- .../Scalar/ConstraintElimination.cpp | 4 +- llvm/lib/Transforms/Scalar/GVN.cpp | 8 + llvm/lib/Transforms/Scalar/LICM.cpp | 4 +- .../lib/Transforms/Scalar/LoopInterchange.cpp | 8 + .../Transforms/Scalar/LoopStrengthReduce.cpp | 2 +- .../Scalar/LowerMatrixIntrinsics.cpp | 321 +- .../lib/Transforms/Scalar/MemCpyOptimizer.cpp | 74 +- llvm/lib/Transforms/Scalar/SROA.cpp | 165 +- .../Transforms/Utils/AssumeBundleBuilder.cpp | 3 +- llvm/lib/Transforms/Utils/Debugify.cpp | 2 +- llvm/lib/Transforms/Utils/Local.cpp | 31 +- llvm/lib/Transforms/Utils/LoopPeel.cpp | 9 +- llvm/lib/Transforms/Utils/LoopUtils.cpp | 6 +- .../Utils/LowerVectorIntrinsics.cpp | 16 +- llvm/lib/Transforms/Utils/ModuleUtils.cpp | 10 +- .../Utils/ScalarEvolutionExpander.cpp | 2 +- llvm/lib/Transforms/Utils/SimplifyIndVar.cpp | 14 +- llvm/lib/Transforms/Vectorize/CMakeLists.txt | 1 + .../Vectorize/LoopIdiomVectorize.cpp | 2 +- .../Transforms/Vectorize/LoopVectorize.cpp | 108 +- .../Transforms/Vectorize/SLPVectorizer.cpp | 9 +- .../Vectorize/SandboxVectorizer/Interval.cpp | 5 +- .../SandboxVectorizer/Passes/BottomUpVec.cpp | 28 +- .../SandboxVectorizer/Passes/PackReuse.cpp | 53 + .../SandboxVectorizer/Passes/PassRegistry.def | 1 + .../Passes/RegionsFromMetadata.cpp | 5 +- .../SandboxVectorizerPassBuilder.cpp | 1 + .../SandboxVectorizer/SeedCollector.cpp | 6 +- llvm/lib/Transforms/Vectorize/VPlan.cpp | 2 - llvm/lib/Transforms/Vectorize/VPlan.h | 6 +- .../Transforms/Vectorize/VPlanAnalysis.cpp | 5 + .../lib/Transforms/Vectorize/VPlanRecipes.cpp | 98 +- .../Transforms/Vectorize/VPlanTransforms.cpp | 10 + llvm/lib/Transforms/Vectorize/VPlanUnroll.cpp | 19 +- llvm/lib/Transforms/Vectorize/VPlanValue.h | 7 - llvm/lib/XRay/InstrumentationMap.cpp | 1 - llvm/lib/XRay/Profile.cpp | 1 - llvm/num.txt | 53 + llvm/runtimes/CMakeLists.txt | 2 +- llvm/test/Analysis/BasicAA/captures.ll | 39 + llvm/test/Analysis/CostModel/AArch64/div.ll | 36 +- llvm/test/Analysis/CostModel/AArch64/rem.ll | 36 +- .../Analysis/CostModel/AArch64/sve-div.ll | 72 +- .../Analysis/CostModel/AArch64/sve-rem.ll | 72 +- .../AArch64/Atomics/aarch64-atomicrmw-lsfe.ll | 35 +- .../Atomics/aarch64-atomicrmw-v8a_fp.ll | 210 +- .../Atomics/aarch64_be-atomicrmw-lse2.ll | 275 - .../aarch64_be-atomicrmw-lse2_lse128.ll | 25 - .../Atomics/aarch64_be-atomicrmw-lsfe.ll | 140 +- .../aarch64_be-atomicrmw-outline_atomics.ll | 125 - .../Atomics/aarch64_be-atomicrmw-rcpc.ll | 275 - .../Atomics/aarch64_be-atomicrmw-rcpc3.ll | 275 - .../Atomics/aarch64_be-atomicrmw-v8_1a.ll | 25 - .../Atomics/aarch64_be-atomicrmw-v8a.ll | 275 - .../Atomics/aarch64_be-atomicrmw-v8a_fp.ll | 840 +- .../GlobalISel/combine-build-vector.mir | 8 +- .../GlobalISel/combine-extract-vec-elt.mir | 4 +- .../GlobalISel/combine-insert-vec-elt.mir | 2 +- .../legalize-shuffle-vector-widen-crash.ll | 2 +- .../postlegalizer-combiner-unmergedup.mir | 91 + ...legalizer-lowering-build-vector-to-dup.mir | 11 +- .../GlobalISel/postlegalizer-lowering-ext.mir | 7 +- .../GlobalISel/postlegalizer-lowering-rev.mir | 7 +- llvm/test/CodeGen/AArch64/aarch64-bif-gen.ll | 3 +- llvm/test/CodeGen/AArch64/aarch64-bit-gen.ll | 3 +- .../AArch64/aarch64-matrix-umull-smull.ll | 2 +- .../CodeGen/AArch64/aarch64-mull-masks.ll | 612 +- llvm/test/CodeGen/AArch64/aarch64-smull.ll | 112 +- llvm/test/CodeGen/AArch64/abs.ll | 3 +- .../argument-blocks-array-of-struct.ll | 3 +- .../AArch64/arm64-dagcombiner-load-slicing.ll | 12 +- llvm/test/CodeGen/AArch64/arm64-dup.ll | 71 +- .../AArch64/arm64-extract-insert-varidx.ll | 2 +- llvm/test/CodeGen/AArch64/arm64-fp128.ll | 14 +- .../test/CodeGen/AArch64/arm64-neon-2velem.ll | 784 +- .../AArch64/arm64-neon-add-pairwise.ll | 2 +- llvm/test/CodeGen/AArch64/arm64-neon-copy.ll | 82 +- .../CodeGen/AArch64/arm64-neon-mul-div-cte.ll | 12 +- .../CodeGen/AArch64/arm64-neon-v1i1-setcc.ll | 22 +- llvm/test/CodeGen/AArch64/arm64-neon-v8.1a.ll | 208 +- llvm/test/CodeGen/AArch64/arm64-rev.ll | 62 +- .../CodeGen/AArch64/arm64-vector-insertion.ll | 69 +- llvm/test/CodeGen/AArch64/atomicrmw-O0.ll | 36 +- llvm/test/CodeGen/AArch64/bcmp.ll | 7 +- llvm/test/CodeGen/AArch64/bitcast-extend.ll | 36 +- llvm/test/CodeGen/AArch64/bitcast.ll | 51 +- llvm/test/CodeGen/AArch64/bswap.ll | 3 +- .../CodeGen/AArch64/build-vector-dup-simd.ll | 378 + llvm/test/CodeGen/AArch64/concat-vector.ll | 28 +- llvm/test/CodeGen/AArch64/ctlz.ll | 22 +- llvm/test/CodeGen/AArch64/cttz.ll | 18 +- llvm/test/CodeGen/AArch64/darwinpcs-tail.ll | 4 +- llvm/test/CodeGen/AArch64/dup.ll | 959 +- llvm/test/CodeGen/AArch64/extbinopload.ll | 30 +- llvm/test/CodeGen/AArch64/fcmp.ll | 208 +- llvm/test/CodeGen/AArch64/fcopysign.ll | 4 +- .../CodeGen/AArch64/fp-conversion-to-tbl.ll | 30 +- llvm/test/CodeGen/AArch64/fptoi.ll | 20 +- .../test/CodeGen/AArch64/fptosi-sat-vector.ll | 613 +- .../test/CodeGen/AArch64/fptoui-sat-vector.ll | 425 +- llvm/test/CodeGen/AArch64/fptrunc.ll | 28 +- llvm/test/CodeGen/AArch64/freeze.ll | 5 +- llvm/test/CodeGen/AArch64/fsh.ll | 674 +- .../AArch64/get-active-lane-mask-extract.ll | 137 +- .../CodeGen/AArch64/i128_with_overflow.ll | 16 +- llvm/test/CodeGen/AArch64/icmp.ll | 16 +- llvm/test/CodeGen/AArch64/insertextract.ll | 26 +- llvm/test/CodeGen/AArch64/itofp.ll | 228 +- llvm/test/CodeGen/AArch64/mul.ll | 58 +- .../AArch64/neon-bitwise-instructions.ll | 4 +- .../AArch64/neon-compare-instructions.ll | 2 +- llvm/test/CodeGen/AArch64/neon-dotreduce.ll | 4768 +-- .../neon-partial-reduce-dot-product.ll | 128 +- llvm/test/CodeGen/AArch64/nzcv-save.ll | 18 +- llvm/test/CodeGen/AArch64/phi.ll | 29 +- llvm/test/CodeGen/AArch64/popcount.ll | 22 +- llvm/test/CodeGen/AArch64/ptradd.ll | 41 +- llvm/test/CodeGen/AArch64/rem.ll | 620 +- .../CodeGen/AArch64/scavenge-large-call.ll | 2 +- llvm/test/CodeGen/AArch64/select_cc.ll | 2 +- llvm/test/CodeGen/AArch64/sext.ll | 90 +- llvm/test/CodeGen/AArch64/shift.ll | 9 +- llvm/test/CodeGen/AArch64/shufflevector.ll | 23 +- .../sms-loop-carried-fp-exceptions1.mir | 109 + .../sms-loop-carried-fp-exceptions2.mir | 99 + .../sve-fixed-length-frame-offests-crash.ll | 102 +- .../AArch64/sve-partial-reduce-dot-product.ll | 168 +- ...sve-streaming-mode-fixed-length-bitcast.ll | 19 +- ...e-streaming-mode-fixed-length-ext-loads.ll | 260 +- ...-streaming-mode-fixed-length-fp-convert.ll | 16 +- ...aming-mode-fixed-length-fp-extend-trunc.ll | 234 +- ...-streaming-mode-fixed-length-fp-vselect.ll | 24 +- ...streaming-mode-fixed-length-int-extends.ll | 3956 +-- ...ve-streaming-mode-fixed-length-int-mulh.ll | 24 +- ...e-streaming-mode-fixed-length-int-to-fp.ll | 376 +- ...streaming-mode-fixed-length-int-vselect.ll | 48 +- ...-streaming-mode-fixed-length-ld2-alloca.ll | 20 +- ...g-mode-fixed-length-permute-zip-uzp-trn.ll | 84 +- .../sve-streaming-mode-fixed-length-ptest.ll | 12 +- .../CodeGen/AArch64/sve2-intrinsics-crypto.ll | 22 + .../test/CodeGen/AArch64/sve2p2-intrinsics.ll | 52 + .../CodeGen/AArch64/tail-call-stack-args.ll | 67 + llvm/test/CodeGen/AArch64/trunc.ll | 22 +- .../AArch64/vec-combine-compare-to-bitmask.ll | 52 +- llvm/test/CodeGen/AArch64/vecreduce-add.ll | 262 +- llvm/test/CodeGen/AArch64/xtn.ll | 79 +- llvm/test/CodeGen/AArch64/zext-to-tbl.ll | 185 +- llvm/test/CodeGen/AArch64/zext.ll | 86 +- .../CodeGen/AMDGPU/GlobalISel/add.vni16.ll | 54 +- .../shufflevector-pointer-crash.mir | 36 + llvm/test/CodeGen/AMDGPU/aa-as-infer.ll | 25 + .../CodeGen/AMDGPU/amdgcn.bitcast.1024bit.ll | 25706 ++++++++-------- .../CodeGen/AMDGPU/amdgcn.bitcast.320bit.ll | 484 +- .../CodeGen/AMDGPU/amdgcn.bitcast.512bit.ll | 8408 ++--- .../CodeGen/AMDGPU/amdgcn.bitcast.576bit.ll | 98 +- .../CodeGen/AMDGPU/amdgcn.bitcast.640bit.ll | 524 +- .../CodeGen/AMDGPU/amdgcn.bitcast.704bit.ll | 1449 +- .../CodeGen/AMDGPU/amdgcn.bitcast.768bit.ll | 676 +- .../CodeGen/AMDGPU/amdgcn.bitcast.832bit.ll | 1584 +- .../CodeGen/AMDGPU/amdgcn.bitcast.896bit.ll | 1936 +- .../CodeGen/AMDGPU/amdgcn.bitcast.960bit.ll | 2910 +- llvm/test/CodeGen/AMDGPU/ashr64_reduce.ll | 592 + llvm/test/CodeGen/AMDGPU/atomicrmw-expand.ll | 152 +- llvm/test/CodeGen/AMDGPU/bf16.ll | 353 +- llvm/test/CodeGen/AMDGPU/bfi_int.ll | 30 +- .../AMDGPU/bit-op-reduce-width-known-bits.ll | 161 + .../buffer-fat-pointer-atomicrmw-fadd.ll | 42 +- .../buffer-fat-pointer-atomicrmw-fmax.ll | 27 +- .../buffer-fat-pointer-atomicrmw-fmin.ll | 27 +- .../AMDGPU/constant-fold-imm-immreg.mir | 22 + llvm/test/CodeGen/AMDGPU/ctlz_zero_undef.ll | 40 +- llvm/test/CodeGen/AMDGPU/cttz_zero_undef.ll | 40 +- llvm/test/CodeGen/AMDGPU/cvt_f32_ubyte.ll | 42 +- llvm/test/CodeGen/AMDGPU/ds-alignment.ll | 84 +- llvm/test/CodeGen/AMDGPU/ds_read2.ll | 133 +- llvm/test/CodeGen/AMDGPU/fabs.bf16.ll | 1201 + .../fast-unaligned-load-store.global.ll | 6 +- .../fast-unaligned-load-store.private.ll | 6 +- llvm/test/CodeGen/AMDGPU/fcopysign.f32.ll | 7 +- .../CodeGen/AMDGPU/flat-atomicrmw-fadd.ll | 456 +- llvm/test/CodeGen/AMDGPU/flat_atomics.ll | 2710 ++ llvm/test/CodeGen/AMDGPU/fneg-fabs.bf16.ll | 1217 + llvm/test/CodeGen/AMDGPU/fneg.bf16.ll | 987 + .../CodeGen/AMDGPU/fold-freeze-fmul-to-fma.ll | 130 + llvm/test/CodeGen/AMDGPU/fold-imm-copy.mir | 3 +- .../fold-zero-high-bits-skips-non-reg.mir | 4 +- llvm/test/CodeGen/AMDGPU/fp-classify.ll | 2 +- .../AMDGPU/fptrunc.v2f16.no.fast.math.ll | 268 +- llvm/test/CodeGen/AMDGPU/freeze.ll | 229 +- llvm/test/CodeGen/AMDGPU/frem.ll | 893 + llvm/test/CodeGen/AMDGPU/function-args.ll | 498 +- .../CodeGen/AMDGPU/gep-const-address-space.ll | 43 +- .../AMDGPU/gfx-callable-return-types.ll | 41 +- llvm/test/CodeGen/AMDGPU/global_atomics.ll | 2203 +- llvm/test/CodeGen/AMDGPU/idot4s.ll | 18 +- llvm/test/CodeGen/AMDGPU/idot4u.ll | 18 +- .../AMDGPU/infer-addrspace-flat-atomic.ll | 39 +- .../CodeGen/AMDGPU/insert_vector_dynelt.ll | 42 +- llvm/test/CodeGen/AMDGPU/insert_vector_elt.ll | 169 +- .../CodeGen/AMDGPU/insert_vector_elt.v2i16.ll | 42 +- llvm/test/CodeGen/AMDGPU/kernel-args.ll | 18 +- .../CodeGen/AMDGPU/llvm.amdgcn.permlane.ll | 68 + .../AMDGPU/llvm.amdgcn.permlane64.ptr.ll | 21 +- .../CodeGen/AMDGPU/llvm.amdgcn.rcp.f16.ll | 101 +- .../AMDGPU/llvm.amdgcn.readfirstlane.ll | 16 +- .../CodeGen/AMDGPU/llvm.amdgcn.rsq.f16.ll | 101 +- llvm/test/CodeGen/AMDGPU/llvm.maximum.f64.ll | 47 +- llvm/test/CodeGen/AMDGPU/llvm.minimum.f64.ll | 47 +- llvm/test/CodeGen/AMDGPU/llvm.sqrt.f16.ll | 88 +- llvm/test/CodeGen/AMDGPU/load-constant-i16.ll | 72 +- .../AMDGPU/load-local-redundant-copies.ll | 42 +- llvm/test/CodeGen/AMDGPU/load-local.128.ll | 68 +- llvm/test/CodeGen/AMDGPU/load-local.96.ll | 50 +- llvm/test/CodeGen/AMDGPU/max.i16.ll | 6 +- llvm/test/CodeGen/AMDGPU/memcpy-libcall.ll | 118 +- .../AMDGPU/memcpy-param-combinations.ll | 78 +- .../CodeGen/AMDGPU/memintrinsic-unroll.ll | 948 +- .../AMDGPU/memmove-param-combinations.ll | 205 +- ...-to-valu-pseudo-scalar-trans-f16-fake16.ll | 113 + ...-to-valu-pseudo-scalar-trans-f16-true16.ll | 123 + .../move-to-valu-pseudo-scalar-trans.ll | 112 +- llvm/test/CodeGen/AMDGPU/mul.ll | 36 +- llvm/test/CodeGen/AMDGPU/or.ll | 4 +- llvm/test/CodeGen/AMDGPU/permute_i8.ll | 12 +- llvm/test/CodeGen/AMDGPU/pr51516.mir | 4 + .../preload-implicit-kernargs-debug-info.ll | 2 +- .../AMDGPU/promote-constOffset-to-imm.ll | 118 +- .../AMDGPU/sched-image-sample-post-RA.mir | 161 + llvm/test/CodeGen/AMDGPU/sdiv64.ll | 7 +- llvm/test/CodeGen/AMDGPU/select.f16.ll | 7 +- llvm/test/CodeGen/AMDGPU/shl.ll | 10 +- llvm/test/CodeGen/AMDGPU/sra.ll | 20 +- llvm/test/CodeGen/AMDGPU/srem64.ll | 7 +- llvm/test/CodeGen/AMDGPU/srl.ll | 10 +- llvm/test/CodeGen/AMDGPU/srl64_reduce.ll | 598 + llvm/test/CodeGen/AMDGPU/store-local.128.ll | 53 +- llvm/test/CodeGen/AMDGPU/store-local.96.ll | 29 +- llvm/test/CodeGen/AMDGPU/sub.ll | 30 +- llvm/test/CodeGen/AMDGPU/udiv64.ll | 3 +- llvm/test/CodeGen/AMDGPU/udivrem.ll | 8 +- ...unfold-masked-merge-scalar-variablemask.ll | 42 +- llvm/test/CodeGen/AMDGPU/urem64.ll | 7 +- llvm/test/CodeGen/ARM/fpcmp_ueq.ll | 13 +- ...Parameters-Invalid-ParameterIsNotString.ll | 19 + .../ContainerData/RootSignature-Parameters.ll | 10 +- ...tSignature-RootDescriptor-Invalid-Flags.ll | 18 + ...ure-RootDescriptor-Invalid-RegisterKind.ll | 18 + ...re-RootDescriptor-Invalid-RegisterSpace.ll | 18 + ...re-RootDescriptor-Invalid-RegisterValue.ll | 18 + .../RootSignature-RootDescriptor.ll | 34 + .../legalize-i64-high-low-vec-split.ll | 18 + llvm/test/CodeGen/DirectX/legalize-i8.ll | 72 + .../Hexagon/swp-loop-carried-order-dep1.mir | 110 + .../Hexagon/swp-loop-carried-order-dep2.mir | 105 + .../Hexagon/swp-loop-carried-order-dep3.mir | 109 + .../Hexagon/swp-loop-carried-order-dep4.mir | 109 + .../Hexagon/swp-loop-carried-order-dep5.mir | 111 + .../Hexagon/swp-loop-carried-order-dep6.mir | 154 + llvm/test/CodeGen/LoongArch/O0-pipeline.ll | 8 - llvm/test/CodeGen/LoongArch/bf16-promote.ll | 172 + llvm/test/CodeGen/LoongArch/bf16.ll | 1048 + .../ir-instruction/atomicrmw-minmax.ll | 2624 +- llvm/test/CodeGen/LoongArch/isel-optnone.ll | 10 + .../lasx/shuffle-as-permute-and-shuffle.ll | 172 +- llvm/test/CodeGen/LoongArch/lasx/xvmskcond.ll | 658 + llvm/test/CodeGen/LoongArch/lsx/vmskcond.ll | 606 + .../LoongArch/spill-ra-without-kill.ll | 1 + .../virtreg-uses-unallocatable-class.mir | 7 +- llvm/test/CodeGen/MSP430/fake_use_float.ll | 31 + llvm/test/CodeGen/MSP430/fcmp.ll | 761 + llvm/test/CodeGen/Mips/jumptable_labels.ll | 58 + llvm/test/CodeGen/NVPTX/pm-event.ll | 15 + ...unfold-masked-merge-vector-variablemask.ll | 167 +- .../CodeGen/PowerPC/build-vector-tests.ll | 120 +- llvm/test/CodeGen/PowerPC/dmr-spill.ll | 6 +- .../test/CodeGen/PowerPC/mmaplus-acc-spill.ll | 2 - llvm/test/CodeGen/PowerPC/mul-const-vector.ll | 18 +- .../PowerPC/p10-splatImm-CPload-pcrel.ll | 5 +- llvm/test/CodeGen/PowerPC/pre-inc-disable.ll | 32 +- llvm/test/CodeGen/PowerPC/splat-extend.ll | 50 + .../CodeGen/PowerPC/vec_add_sub_doubleword.ll | 5 +- .../CodeGen/PowerPC/vector-extend-sign.ll | 5 +- .../PowerPC/vector-popcnt-128-ult-ugt.ll | 904 +- llvm/test/CodeGen/PowerPC/vsx-fma-m-early.ll | 12 +- ...lar-shift-by-byte-multiple-legalization.ll | 130 +- llvm/test/CodeGen/RISCV/abds-neg.ll | 60 +- llvm/test/CodeGen/RISCV/abds.ll | 800 +- llvm/test/CodeGen/RISCV/abdu-neg.ll | 52 +- llvm/test/CodeGen/RISCV/add-before-shl.ll | 20 +- .../CodeGen/RISCV/add_sext_shl_constant.ll | 97 + llvm/test/CodeGen/RISCV/add_shl_constant.ll | 77 + llvm/test/CodeGen/RISCV/and-shl.ll | 18 + llvm/test/CodeGen/RISCV/double-fcmp-strict.ll | 40 +- llvm/test/CodeGen/RISCV/double-fcmp.ll | 20 +- llvm/test/CodeGen/RISCV/float-fcmp-strict.ll | 40 +- llvm/test/CodeGen/RISCV/float-fcmp.ll | 20 +- llvm/test/CodeGen/RISCV/fold-masked-merge.ll | 302 + llvm/test/CodeGen/RISCV/fold-mem-offset.ll | 16 +- llvm/test/CodeGen/RISCV/fpenv-xlen.ll | 37 + llvm/test/CodeGen/RISCV/frm-write-in-loop.ll | 31 + llvm/test/CodeGen/RISCV/legalize-fneg.ll | 10 +- llvm/test/CodeGen/RISCV/memcmp-optsize.ll | 192 +- llvm/test/CodeGen/RISCV/memcmp.ll | 192 +- .../CodeGen/RISCV/reassoc-shl-addi-add.ll | 195 +- llvm/test/CodeGen/RISCV/rv32xandesperf.ll | 78 + llvm/test/CodeGen/RISCV/rv32zbb.ll | 2 +- .../test/CodeGen/RISCV/rv64-trampoline-cfi.ll | 99 + llvm/test/CodeGen/RISCV/rv64xandesperf.ll | 138 + llvm/test/CodeGen/RISCV/rv64zba.ll | 170 +- .../CodeGen/RISCV/rvv/fixed-vectors-elen.ll | 34 +- .../RISCV/rvv/fixed-vectors-int-buildvec.ll | 318 +- .../RISCV/rvv/fixed-vectors-masked-gather.ll | 40 +- .../fixed-vectors-shuffle-deinterleave2.ll | 94 +- .../RISCV/rvv/fixed-vectors-zvqdotq.ll | 655 +- llvm/test/CodeGen/RISCV/rvv/pr141907.ll | 56 + .../test/CodeGen/RISCV/rvv/vsetvli-insert.mir | 23 +- llvm/test/CodeGen/RISCV/rvv/zvqdotq-sdnode.ll | 60 +- llvm/test/CodeGen/RISCV/scmp.ll | 2 +- llvm/test/CodeGen/RISCV/select-cond.ll | 1018 + llvm/test/CodeGen/RISCV/srem-vector-lkk.ll | 48 +- llvm/test/CodeGen/RISCV/ucmp.ll | 2 +- .../CodeGen/RISCV/unaligned-load-store.ll | 64 +- ...unfold-masked-merge-scalar-variablemask.ll | 62 +- llvm/test/CodeGen/RISCV/urem-vector-lkk.ll | 36 +- ...lar-shift-by-byte-multiple-legalization.ll | 1000 +- .../RISCV/wide-scalar-shift-legalization.ll | 604 +- llvm/test/CodeGen/RISCV/xqcibm-extract.ll | 148 + llvm/test/CodeGen/RISCV/xtheadmempair.ll | 14 +- llvm/test/CodeGen/RISCV/zilsd.ll | 32 +- .../CodeGen/SPIRV/ExecutionMode_Fragment.ll | 12 + .../CodeGen/SPIRV/ExecutionMode_Vertex.ll | 12 + .../test/CodeGen/SystemZ/fold-masked-merge.ll | 277 + llvm/test/CodeGen/Thumb2/float-cmp.ll | 7 +- llvm/test/CodeGen/Thumb2/mve-frint.ll | 89 +- .../CodeGen/Thumb2/mve-intrinsics/vrintn.ll | 2 + llvm/test/CodeGen/WebAssembly/simd-arith.ll | 600 +- llvm/test/CodeGen/X86/addr-mode-matcher-3.ll | 16 +- ...d_vector_inreg_of_broadcast_from_memory.ll | 20 +- ...op2-disabled-with-small-stack-alignment.ll | 117 + llvm/test/CodeGen/X86/apx/reloc-opt.ll | 8 +- llvm/test/CodeGen/X86/atomic-idempotent.ll | 329 + llvm/test/CodeGen/X86/avx-insertelt.ll | 7 +- llvm/test/CodeGen/X86/avx512-scalar_mask.ll | 8 +- llvm/test/CodeGen/X86/avx512fp16-fmaxnum.ll | 475 +- llvm/test/CodeGen/X86/avx512fp16-fminnum.ll | 475 +- llvm/test/CodeGen/X86/avx512fp16-novl.ll | 224 + llvm/test/CodeGen/X86/avx512vl-intrinsics.ll | 72 +- llvm/test/CodeGen/X86/bitselect.ll | 50 +- llvm/test/CodeGen/X86/bmi-select-distrib.ll | 865 + llvm/test/CodeGen/X86/bsf.ll | 452 + llvm/test/CodeGen/X86/bsr.ll | 492 + .../CodeGen/X86/buildvec-widen-dotproduct.ll | 16 +- llvm/test/CodeGen/X86/fold-masked-merge.ll | 54 +- .../test/CodeGen/X86/fp128-libcalls-strict.ll | 4 - llvm/test/CodeGen/X86/fpcmp-soft-fp.ll | 2 - llvm/test/CodeGen/X86/isel-fabs-x87.ll | 21 + llvm/test/CodeGen/X86/isel-fabs.ll | 50 + llvm/test/CodeGen/X86/matrix-multiply.ll | 6 +- llvm/test/CodeGen/X86/mul-constant-i64.ll | 20 +- llvm/test/CodeGen/X86/musttail-varargs.ll | 1 + llvm/test/CodeGen/X86/oddshuffles.ll | 24 +- llvm/test/CodeGen/X86/pr142513.ll | 3 +- llvm/test/CodeGen/X86/pr142937.ll | 64 + llvm/test/CodeGen/X86/pr40090.ll | 22 + llvm/test/CodeGen/X86/pr62145.ll | 19 +- llvm/test/CodeGen/X86/rex-profile-test.ll | 18 + ...unfold-masked-merge-scalar-variablemask.ll | 26 +- ...unfold-masked-merge-vector-variablemask.ll | 598 +- .../X86/vec-strict-fptoint-128-fp16.ll | 310 + .../X86/vec-strict-fptoint-256-fp16.ll | 104 + llvm/test/CodeGen/X86/vector-idiv-sdiv-128.ll | 487 +- llvm/test/CodeGen/X86/vector-idiv-sdiv-256.ll | 364 +- llvm/test/CodeGen/X86/vector-idiv-sdiv-512.ll | 284 +- .../vector-interleaved-load-i16-stride-2.ll | 84 +- .../vector-interleaved-load-i8-stride-7.ll | 402 +- .../vector-interleaved-store-i16-stride-2.ll | 432 +- .../vector-interleaved-store-i32-stride-3.ll | 318 +- .../vector-interleaved-store-i32-stride-4.ll | 1490 +- .../vector-interleaved-store-i32-stride-5.ll | 1396 +- .../vector-interleaved-store-i32-stride-6.ll | 28 +- .../vector-interleaved-store-i32-stride-7.ll | 53 +- .../vector-interleaved-store-i32-stride-8.ll | 72 +- .../vector-interleaved-store-i64-stride-2.ll | 382 +- .../vector-interleaved-store-i8-stride-2.ll | 144 +- .../vector-interleaved-store-i8-stride-3.ll | 277 +- .../test/CodeGen/X86/vector-shuffle-256-v8.ll | 8 +- .../X86/vector-shuffle-combining-avx512vl.ll | 120 + .../CodeGen/X86/x86-interleaved-access.ll | 11 +- .../zero_extend_vector_inreg_of_broadcast.ll | 184 +- ...d_vector_inreg_of_broadcast_from_memory.ll | 38 +- .../DebugInfo/X86/file-index-across-cu.ll | 78 + ...chive-with-duplicate-member-filenames.test | 7 +- .../Generic/all-load-multifile-archive.test | 9 +- .../JITLink/Generic/sectcreate.test | 2 +- .../JITLink/RISCV/ELF_branch.s | 6 +- .../MCJIT/remote/cross-module-a.ll | 2 +- llvm/test/ExecutionEngine/MCJIT/remote/eh.ll | 2 +- .../MCJIT/remote/multi-module-a.ll | 2 +- .../MCJIT/remote/simpletest-remote.ll | 2 +- .../MCJIT/remote/stubs-remote.ll | 2 +- .../remote/test-common-symbols-remote.ll | 2 +- .../MCJIT/remote/test-data-align-remote.ll | 2 +- .../test-fp-no-external-funcs-remote.ll | 2 +- .../remote/test-global-init-nonzero-remote.ll | 2 +- .../remote/test-global-init-nonzero-sm-pic.ll | 2 +- .../MCJIT/remote/test-ptr-reloc-remote.ll | 2 +- .../MCJIT/remote/test-ptr-reloc-sm-pic.ll | 2 +- .../AddressSanitizer/vector-load-store.ll | 64 +- .../Instrumentation/BoundsChecking/simple.ll | 208 +- .../MemorySanitizer/X86/avx-intrinsics-x86.ll | 132 +- .../X86/avx512-intrinsics-upgrade.ll | 198 +- .../MemorySanitizer/X86/avx512-intrinsics.ll | 204 +- .../i386/avx-intrinsics-i386.ll | 134 +- .../MemorySanitizer/vector-load-store.ll | 50 +- .../Instrumentation/MemorySanitizer/vscale.ll | 20 +- .../AArch64/SME2p1/directive-arch-negative.s | 4 +- .../directive-arch_extension-negative.s | 4 +- llvm/test/MC/AArch64/SVE2p1/aesd.s | 14 +- llvm/test/MC/AArch64/SVE2p1/aesdimc.s | 14 +- llvm/test/MC/AArch64/SVE2p1/aese.s | 14 +- llvm/test/MC/AArch64/SVE2p1/aesemc.s | 14 +- .../AArch64/SVE2p1/directive-arch-negative.s | 4 +- llvm/test/MC/AArch64/SVE2p1/pmlal.s | 8 +- llvm/test/MC/AArch64/SVE2p1/pmull.s | 8 +- llvm/test/MC/AMDGPU/gfx11_asm_vop3_dpp16.s | 12 + llvm/test/MC/AMDGPU/gfx11_asm_vop3_dpp8.s | 6 + llvm/test/MC/AMDGPU/gfx12_asm_vop3_dpp16.s | 12 + llvm/test/MC/AMDGPU/gfx12_asm_vop3_dpp8.s | 6 + .../AMDGPU/gfx11_dasm_vop3p_dpp16.txt | 3 + .../AMDGPU/gfx11_dasm_vop3p_dpp8.txt | 3 + .../AMDGPU/gfx12_dasm_vop3p_dpp16.txt | 6 + .../AMDGPU/gfx12_dasm_vop3p_dpp8.txt | 3 + ...lax.s => option-exact-long-jump-disable.s} | 10 +- llvm/test/MC/RISCV/rv32-relaxation-xqci.s | 170 + llvm/test/MC/RISCV/rvv/xsfvfwmacc.s | 6 + llvm/test/MC/RISCV/rvv/xsfvqmacc.s | 6 + .../MC/RISCV/xqcibi-long-conditional-jump.s | 92 +- llvm/test/MC/RISCV/xqcibi-relocations.s | 11 + llvm/test/MC/RISCV/xqcibi-valid.s | 60 +- llvm/test/MC/RISCV/xqcilb-relocations.s | 18 + llvm/test/MC/RISCV/xqcili-relocations.s | 29 + llvm/test/MC/Sparc/sparc-vis2.s | 32 +- llvm/test/MC/Sparc/sparcv9-instructions.s | 423 +- .../Other/new-pm-thinlto-postlink-defaults.ll | 1 + .../new-pm-thinlto-postlink-pgo-defaults.ll | 1 + ...-pm-thinlto-postlink-samplepgo-defaults.ll | 1 + .../GlobalISelEmitter/GlobalISelEmitter.td | 66 +- .../TableGen/GlobalISelEmitter/HwModes.td | 1 + llvm/test/TableGen/VarLenDecoder.td | 21 +- llvm/test/TableGen/directive1.td | 74 +- llvm/test/TableGen/directive2.td | 63 +- llvm/test/TableGen/directive3.td | 10 +- llvm/test/TableGen/trydecode-emission.td | 20 +- llvm/test/TableGen/trydecode-emission2.td | 32 +- llvm/test/TableGen/trydecode-emission3.td | 20 +- llvm/test/TableGen/trydecode-emission4.td | 20 +- llvm/test/ThinLTO/X86/cfi-devirt.ll | 2 +- .../X86/memprof-report-hinted-partial.ll | 73 + .../AMDGPU/expand-atomic-rmw-fadd.ll | 703 +- ...expand-atomicrmw-flat-noalias-addrspace.ll | 28 +- llvm/test/Transforms/Attributor/nofpclass.ll | 4 +- .../X86/sink-addrmode-reg-does-not-geps.ll | 76 + ...coro-debug-dbg.values-not_used_in_frame.ll | 6 +- .../Coroutines/coro-debug-dbg.values.ll | 10 +- .../Coroutines/coro-debug-frame-variable.ll | 10 +- llvm/test/Transforms/Coroutines/coro-debug.ll | 18 +- llvm/test/Transforms/GVN/captures.ll | 93 + .../test/Transforms/GVN/trunc-nuw-equality.ll | 28 + .../Transforms/IndVarSimplify/iv-cmp-sext.ll | 66 + .../InstCombine/AArch64/aes-intrinsics.ll | 70 + .../InstCombine/AMDGPU/amdgcn-intrinsics.ll | 18 +- .../InstCombine/AMDGPU/trivially-uniform.ll | 163 + .../InstCombine/canonicalize-const-to-bop.ll | 51 + .../Transforms/InstCombine/fcmp-select.ll | 35 + llvm/test/Transforms/InstCombine/icmp.ll | 3 +- .../Transforms/InstCombine/minmax-fold.ll | 244 + .../Transforms/InstCombine/select-and-or.ll | 28 + .../InstCombine/simple_phi_condition.ll | 563 +- llvm/test/Transforms/InstCombine/sub-gep.ll | 147 +- .../InstSimplify/ConstProp/atan-intrinsic.ll | 88 + .../InstSimplify/fp-undef-poison.ll | 50 + .../Transforms/InstSimplify/shufflevector.ll | 16 + .../LoopInterchange/confused-dependence.ll | 41 + .../pr43326-ideal-access-pattern.ll | 4 +- .../LoopInterchange/unique-dep-matrix.ll | 2 +- .../LoopStrengthReduce/X86/ivchain-X86.ll | 28 +- .../LoopUnroll/peel-last-iteration-minmax.ll | 137 + .../peel-last-iteration-with-guards.ll | 28 +- ...last-iteration-with-variable-trip-count.ll | 153 +- .../unroll-and-peel-last-iteration.ll | 98 + .../AArch64/eliminate-tail-predication.ll | 10 +- .../AArch64/epilog-iv-select-cmp.ll | 16 +- .../gather-do-not-vectorize-addressing.ll | 52 + .../partial-reduce-dot-product-epilogue.ll | 2 +- .../AArch64/scalable-strict-fadd.ll | 876 +- .../LoopVectorize/AArch64/select-index.ll | 338 + .../LoopVectorize/AArch64/sve-widen-gep.ll | 26 +- .../AArch64/sve2-histcnt-vplan.ll | 4 +- .../AArch64/synthesize-mask-for-call.ll | 12 +- .../LoopVectorize/AArch64/vplan-printing.ll | 14 +- .../widen-call-with-intrinsic-or-libfunc.ll | 4 +- .../LoopVectorize/PowerPC/exit-branch-cost.ll | 2 +- .../RISCV/interleaved-masked-access.ll | 408 + .../RISCV/partial-reduce-dot-product.ll | 439 +- .../RISCV/riscv-vector-reverse.ll | 16 +- ...rize-force-tail-with-evl-cond-reduction.ll | 6 +- ...ze-force-tail-with-evl-inloop-reduction.ll | 70 +- ...vectorize-force-tail-with-evl-reduction.ll | 74 +- ...-force-tail-with-evl-reverse-load-store.ll | 10 +- ...e-force-tail-with-evl-safe-dep-distance.ll | 18 +- .../RISCV/vectorize-vp-intrinsics.ll | 2 +- .../RISCV/vplan-vp-intrinsics-reduction.ll | 20 +- .../LoopVectorize/X86/cost-model.ll | 2 +- .../LoopVectorize/X86/reduction-small-size.ll | 2 +- .../LoopVectorize/epilog-iv-select-cmp.ll | 48 +- .../first-order-recurrence-chains-vplan.ll | 26 +- ...-order-recurrence-sink-replicate-region.ll | 3 +- .../LoopVectorize/if-pred-stores.ll | 2 +- .../Transforms/LoopVectorize/induction.ll | 10 +- .../interleave-and-scalarize-only.ll | 8 +- ...eref-pred-poison-ub-ops-feeding-pointer.ll | 386 + .../scalable-reduction-inloop.ll | 59 +- .../select-index-interleaving.ll | 338 + .../LoopVectorize/select-min-index.ll | 1084 - .../LoopVectorize/select-smax-last-index.ll | 555 + .../LoopVectorize/select-smin-last-index.ll | 557 + .../LoopVectorize/select-umax-last-index.ll | 555 + .../LoopVectorize/select-umin-first-index.ll | 557 + .../LoopVectorize/select-umin-last-index.ll | 557 + .../uncountable-early-exit-vplan.ll | 6 +- .../LoopVectorize/vplan-dot-printing.ll | 2 +- .../LoopVectorize/vplan-iv-transforms.ll | 2 +- .../LoopVectorize/vplan-predicate-switch.ll | 2 +- .../vplan-printing-before-execute.ll | 8 +- .../vplan-printing-reductions.ll | 34 +- .../LoopVectorize/vplan-printing.ll | 26 +- .../vplan-sink-scalars-and-merge-vf1.ll | 4 +- .../vplan-sink-scalars-and-merge.ll | 4 +- .../Transforms/LowerMatrixIntrinsics/binop.ll | 182 +- .../LowerMatrixIntrinsics/flatten.ll | 61 + .../Transforms/LowerMatrixIntrinsics/unary.ll | 250 + .../LowerTypeTests/aarch64-jumptable.ll | 2 +- llvm/test/Transforms/LowerTypeTests/asm.ll | 19 + .../LowerTypeTests/export-allones.ll | 8 +- .../LowerTypeTests/export-bytearray.ll | 8 +- .../Transforms/LowerTypeTests/export-icall.ll | 4 +- .../LowerTypeTests/export-inline.ll | 29 +- .../Transforms/LowerTypeTests/function.ll | 42 +- llvm/test/Transforms/LowerTypeTests/import.ll | 82 +- llvm/test/Transforms/LowerTypeTests/simple.ll | 8 +- .../Transforms/LowerTypeTests/simplify.ll | 15 +- .../MemCpyOpt/memset-memcpy-oversized.ll | 47 + .../MemCpyOpt/memset-memcpy-to-2x-memset.ll | 3 +- llvm/test/Transforms/MemCpyOpt/mixed-sizes.ll | 2 +- .../MemCpyOpt/variable-sized-memset-memcpy.ll | 2 +- .../duplicate-context-ids.ll | 8 +- .../tailcall-nonunique.ll | 9 + .../Transforms/MergeFunc/cfi-thunk-merging.ll | 2 +- .../Transforms/OpenMP/nested_parallelism.ll | 33 +- .../Transforms/OpenMP/remove_globalization.ll | 26 +- .../Transforms/OpenMP/spmdization_guarding.ll | 100 +- ...mdization_guarding_two_reaching_kernels.ll | 17 +- ...zation_no_guarding_two_reaching_kernels.ll | 17 +- .../PGOProfile/ctx-instrumentation-aliases.ll | 25 + .../PGOProfile/ctx-instrumentation.ll | 40 + .../memprof-call-site-at-alloc-site.ll | 1 + .../memprof-dump-matched-alloc-site.ll | 1 + .../memprof-dump-matched-call-sites.ll | 1 + .../PGOProfile/memprof-undrift.test | 1 + .../PGOProfile/memprof_annotate_yaml.test | 1 + .../PGOProfile/memprof_discard_threshold.ll | 2 + .../memprof_match_hot_cold_new_calls.ll | 2 + .../memprof_max_cold_threshold.test | 165 + .../PGOProfile/memprof_missing_leaf.ll | 2 + .../PhaseOrdering/X86/vector-reductions.ll | 50 + .../scalable-vectors-with-known-vscale.ll | 349 + llvm/test/Transforms/SROA/scalable-vectors.ll | 223 +- .../SandboxVectorizer/pack_reuse_basic.ll | 71 + .../pack_reuse_end_to_end.ll | 45 + .../Transforms/SimplifyTypeTests/basic.ll | 46 + .../unique-source-file-names.ll | 3 +- .../VectorCombine/AArch64/ext-extract.ll | 268 + ...l-const-prop-ignore-preferred-alignment.ll | 110 + .../virtual-const-prop-small-alignment-32.ll | 8 +- .../virtual-const-prop-small-alignment-64.ll | 8 +- .../Verifier/target-ext-vector-invalid.ll | 8 + llvm/test/Verifier/target-ext-vector.ll | 20 + llvm/test/tools/llvm-cgdata/empty.test | 4 +- llvm/test/tools/llvm-cgdata/error.test | 4 +- .../merge-combined-funcmap-hashtree.test | 2 +- .../llvm-cgdata/merge-funcmap-archive.test | 4 +- .../llvm-cgdata/merge-funcmap-concat.test | 4 +- .../llvm-cgdata/merge-funcmap-double.test | 4 +- .../llvm-cgdata/merge-funcmap-single.test | 2 +- .../COFF/02-coff-logical-lines.test | 4 +- ...-coff-incorrect-lexical-scope-typedef.test | 4 +- .../04-coff-missing-nested-enumerators.test | 4 +- ...coff-incorrect-lexical-scope-variable.test | 4 +- .../COFF/06-coff-full-logical-view.test | 1 + .../DWARF/02-dwarf-logical-lines.test | 4 +- ...dwarf-incorrect-lexical-scope-typedef.test | 4 +- .../04-dwarf-missing-nested-enumerators.test | 4 +- ...warf-incorrect-lexical-scope-variable.test | 4 +- .../DWARF/06-dwarf-full-logical-view.test | 1 + ...-57040-ignored-DW_FORM_implicit_const.test | 6 +- .../pr-57040-incorrect-function-compare.test | 6 +- .../WebAssembly/02-wasm-logical-lines.test | 3 +- ...-wasm-incorrect-lexical-scope-typedef.test | 4 +- .../04-wasm-missing-nested-enumerators.test | 4 +- ...wasm-incorrect-lexical-scope-variable.test | 4 +- .../06-wasm-full-logical-view.test | 1 + .../llvm-debuginfo-analyzer/cmdline.test | 1 + .../X86/DW_OP_GNU_implicit_pointer.yaml | 87 + .../AArch64/Neoverse/V2-basic-instructions.s | 10 +- .../AArch64/Neoverse/V2-clear-upper-regs.s | 124 +- .../llvm-mca/AArch64/Neoverse/V2-forwarding.s | 692 +- .../AArch64/Neoverse/V2-sve-instructions.s | 18 +- .../llvm-mca/AArch64/Neoverse/V2-writeback.s | 1950 +- .../AArch64/Neoverse/V2-zero-lat-movs.s | 24 +- .../llvm-profdata/memprof-yaml-invalid.test | 1 + llvm/test/tools/llvm-rc/Inputs/parser-expr.rc | 5 + .../Inputs/tag-accelerators-ascii-alt.rc | 4 - .../tools/llvm-rc/Inputs/tag-accelerators.rc | 1 + llvm/test/tools/llvm-rc/Inputs/tokens.rc | 1 + llvm/test/tools/llvm-rc/parser-expr.test | 5 + llvm/test/tools/llvm-rc/tag-accelerators.test | 15 +- llvm/test/tools/llvm-rc/tokenizer.test | 5 + .../ELF/bb-addr-map-compressed-zstd.test | 142 + .../tools/llvm-symbolizer/symbol-search.test | 2 +- llvm/tools/llvm-as/llvm-as.cpp | 7 +- llvm/tools/llvm-cgdata/llvm-cgdata.cpp | 4 +- .../tools/llvm-cov/SourceCoverageViewText.cpp | 4 +- .../tools/llvm-debuginfo-analyzer/Options.cpp | 2 + llvm/tools/llvm-dis/llvm-dis.cpp | 7 +- llvm/tools/llvm-link/llvm-link.cpp | 6 +- llvm/tools/llvm-objdump/SourcePrinter.cpp | 2 +- llvm/tools/llvm-rc/ResourceFileWriter.cpp | 4 +- llvm/tools/llvm-rc/ResourceScriptParser.cpp | 49 +- llvm/tools/llvm-rc/ResourceScriptParser.h | 1 + llvm/tools/llvm-rc/ResourceScriptStmt.h | 24 + llvm/tools/llvm-rc/ResourceScriptToken.cpp | 12 +- llvm/tools/llvm-rc/ResourceScriptToken.h | 7 +- .../tools/llvm-rc/ResourceScriptTokenList.def | 2 + .../deltas/ReduceGlobalObjects.cpp | 16 +- llvm/tools/llvm-remarkutil/RemarkSizeDiff.cpp | 2 +- .../tools/llvm-symbolizer/llvm-symbolizer.cpp | 2 +- llvm/unittests/ADT/STLExtrasTest.cpp | 24 + llvm/unittests/Analysis/IR2VecTest.cpp | 208 +- .../Analysis/IRSimilarityIdentifierTest.cpp | 3 - llvm/unittests/Analysis/ValueTrackingTest.cpp | 9 + .../CGData/StableFunctionMapRecordTest.cpp | 6 +- .../CodeGen/SelectionDAGPatternMatchTest.cpp | 2 +- .../DWARFExpressionCompactPrinterTest.cpp | 2 +- .../LogicalView/CodeViewReaderTest.cpp | 5 + .../DebugInfo/LogicalView/DWARFReaderTest.cpp | 5 + .../Orc/RTDyldObjectLinkingLayerTest.cpp | 76 +- llvm/unittests/IR/DebugInfoTest.cpp | 61 +- llvm/unittests/IR/IRBuilderTest.cpp | 8 - llvm/unittests/IR/InstructionsTest.cpp | 7 +- llvm/unittests/IR/PatternMatch.cpp | 19 - llvm/unittests/IR/ValueTest.cpp | 70 - llvm/unittests/ProfileData/MemProfTest.cpp | 10 +- llvm/unittests/SandboxIR/SandboxIRTest.cpp | 44 +- llvm/unittests/Support/ARMAttributeParser.cpp | 2 +- llvm/unittests/TargetParser/TripleTest.cpp | 146 +- .../Transforms/IPO/LowerTypeTests.cpp | 8 +- .../Instrumentation/MemProfUseTest.cpp | 2 +- .../SandboxVectorizer/VecUtilsTest.cpp | 50 + llvm/utils/TableGen/AsmWriterEmitter.cpp | 4 +- .../utils/TableGen/Basic/DirectiveEmitter.cpp | 227 +- .../utils/TableGen/Basic/IntrinsicEmitter.cpp | 2 +- .../TableGen/Common/CodeGenDAGPatterns.cpp | 35 +- .../TableGen/Common/CodeGenDAGPatterns.h | 5 + .../TableGen/Common/CodeGenRegisters.cpp | 69 +- llvm/utils/TableGen/Common/CodeGenRegisters.h | 7 + .../utils/TableGen/Common/CodeGenSchedule.cpp | 4 +- llvm/utils/TableGen/Common/CodeGenTarget.cpp | 48 - llvm/utils/TableGen/Common/CodeGenTarget.h | 7 - .../GlobalISel/GlobalISelMatchTable.cpp | 15 + .../Common/GlobalISel/GlobalISelMatchTable.h | 23 +- .../GlobalISelMatchTableExecutorEmitter.cpp | 4 + .../GlobalISelMatchTableExecutorEmitter.h | 36 +- .../TableGen/Common/GlobalISel/Patterns.cpp | 4 +- llvm/utils/TableGen/Common/InfoByHwMode.cpp | 8 +- llvm/utils/TableGen/Common/InfoByHwMode.h | 8 +- .../TableGen/Common/VarLenCodeEmitterGen.cpp | 8 +- llvm/utils/TableGen/CompressInstEmitter.cpp | 4 +- llvm/utils/TableGen/DAGISelMatcherEmitter.cpp | 2 +- llvm/utils/TableGen/DAGISelMatcherGen.cpp | 1 - llvm/utils/TableGen/DecoderEmitter.cpp | 261 +- .../TableGen/GlobalISelCombinerEmitter.cpp | 9 +- llvm/utils/TableGen/GlobalISelEmitter.cpp | 48 +- llvm/utils/TableGen/InstrInfoEmitter.cpp | 7 +- llvm/utils/TableGen/OptionParserEmitter.cpp | 4 +- llvm/utils/TableGen/X86RecognizableInstr.cpp | 672 +- .../clang-tools-extra/clang-doc/BUILD.gn | 1 + .../unittests/clang-doc/BUILD.gn | 9 +- .../gn/secondary/compiler-rt/test/BUILD.gn | 1 + .../gn/secondary/libcxx/include/BUILD.gn | 3 +- llvm/utils/gn/secondary/lldb/test/BUILD.gn | 2 + .../gn/secondary/lldb/tools/lldb-dap/BUILD.gn | 1 + .../llvm/lib/DebugInfo/DWARF/BUILD.gn | 1 - .../llvm/lib/DebugInfo/LogicalView/BUILD.gn | 1 + .../llvm/lib/Frontend/Directive/BUILD.gn | 7 + .../llvm/lib/Frontend/OpenACC/BUILD.gn | 5 +- .../lib/Transforms/Instrumentation/BUILD.gn | 3 +- .../llvm/lib/Transforms/Vectorize/BUILD.gn | 1 + llvm/utils/lit/lit/Test.py | 8 +- llvm/utils/lit/lit/TestRunner.py | 4 +- llvm/utils/lit/lit/display.py | 15 +- .../test.py | 2 +- .../allow-retries-test_retry_attempts/test.py | 2 +- .../lit.cfg | 2 +- llvm/utils/lit/tests/allow-retries.py | 20 +- mlir/include/mlir/Conversion/Passes.td | 4 + .../BreakpointManagers/TagBreakpointManager.h | 2 +- .../include/mlir/Dialect/Arith/IR/ArithOps.td | 109 + .../mlir/Dialect/Arith/Transforms/Passes.h | 3 + .../mlir/Dialect/ArmSVE/CMakeLists.txt | 1 + .../TransformOps/ArmSVEVectorTransformOps.h | 31 + .../TransformOps/ArmSVEVectorTransformOps.td | 26 + .../ArmSVE/TransformOps/CMakeLists.txt | 6 + .../Dialect/ArmSVE/Transforms/Transforms.h | 3 + .../include/mlir/Dialect/Async/IR/AsyncOps.td | 4 +- .../IR/BufferDeallocationOpInterface.h | 4 +- .../Bufferization/IR/BufferizationOps.td | 5 +- .../Dialect/Bufferization/Transforms/Passes.h | 6 +- mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td | 1 + .../include/mlir/Dialect/LLVMIR/NVVMDialect.h | 4 + mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td | 74 + .../SCF/Transforms/TileUsingInterface.h | 16 +- .../Dialect/SPIRV/IR/SPIRVArithmeticOps.td | 4 +- .../mlir/Dialect/SPIRV/IR/SPIRVGLOps.td | 101 + .../mlir/Dialect/SPIRV/IR/SPIRVTypes.h | 19 +- .../mlir/Dialect/Tensor/IR/TensorOps.td | 1 - .../Tensor/Transforms/RuntimeOpVerification.h | 21 + .../mlir/Dialect/Transform/IR/TransformOps.td | 29 +- .../mlir/Dialect/Vector/IR/VectorOps.td | 1 + mlir/include/mlir/IR/Builders.h | 1 + mlir/include/mlir/IR/Location.h | 10 + mlir/include/mlir/InitAllDialects.h | 2 + mlir/include/mlir/InitAllExtensions.h | 2 + .../mlir/Interfaces/TilingInterface.td | 3 +- mlir/include/mlir/Pass/Pass.h | 5 +- mlir/include/mlir/Pass/PassManager.h | 6 +- .../mlir/Tools/lsp-server-support/Protocol.h | 6 + mlir/lib/Bytecode/Writer/IRNumbering.cpp | 4 +- .../Conversion/GPUCommon/GPUOpsLowering.cpp | 14 +- mlir/lib/Conversion/GPUToSPIRV/GPUToSPIRV.cpp | 45 +- .../Conversion/VectorToLLVM/CMakeLists.txt | 1 + .../VectorToLLVM/ConvertVectorToLLVMPass.cpp | 7 + .../Dialect/Affine/Analysis/LoopAnalysis.cpp | 4 +- mlir/lib/Dialect/Arith/IR/ArithOps.cpp | 26 + .../Dialect/Arith/Transforms/ExpandOps.cpp | 105 +- .../LowerContractionToSMMLAPattern.cpp | 6 +- .../ArmSME/Transforms/TileAllocation.cpp | 3 +- mlir/lib/Dialect/ArmSVE/CMakeLists.txt | 1 + .../TransformOps/ArmSVEVectorTransformOps.cpp | 54 + .../ArmSVE/TransformOps/CMakeLists.txt | 18 + .../Dialect/ArmSVE/Transforms/CMakeLists.txt | 1 + .../LowerContractionToSVEI8MMPattern.cpp | 365 + .../IR/BufferDeallocationOpInterface.cpp | 4 +- .../Transforms/OneShotModuleBufferize.cpp | 28 +- .../OwnershipBasedBufferDeallocation.cpp | 17 +- mlir/lib/Dialect/LLVMIR/IR/NVVMDialect.cpp | 78 + .../TransformOps/LinalgTransformOps.cpp | 10 +- .../Transforms/DataLayoutPropagation.cpp | 10 +- .../Dialect/Linalg/Transforms/Transforms.cpp | 3 +- .../Linalg/Transforms/Vectorization.cpp | 319 +- .../SCF/Transforms/TileUsingInterface.cpp | 62 +- .../SPIRV/IR/SPIRVCanonicalization.cpp | 27 +- mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp | 7 + mlir/lib/Dialect/SPIRV/IR/SPIRVTypes.cpp | 37 +- .../SparseTensor/IR/SparseTensorDialect.cpp | 6 +- .../Tensor/Extensions/AllExtensions.cpp | 2 +- mlir/lib/Dialect/Tensor/IR/CMakeLists.txt | 1 + mlir/lib/Dialect/Tensor/IR/TensorDialect.cpp | 3 + mlir/lib/Dialect/Tensor/IR/TensorOps.cpp | 78 +- .../Dialect/Tensor/Transforms/CMakeLists.txt | 2 + .../Tensor/Transforms/ReshapePatterns.cpp | 6 +- .../Transforms/RuntimeOpVerification.cpp | 208 + mlir/lib/Dialect/Tosa/IR/TosaOps.cpp | 152 +- .../Tosa/Transforms/TosaInferShapes.cpp | 2 +- .../lib/Dialect/Transform/IR/TransformOps.cpp | 176 +- mlir/lib/Dialect/Vector/IR/VectorOps.cpp | 6 +- .../Transforms/LowerVectorShapeCast.cpp | 412 +- .../Vector/Transforms/VectorDistribute.cpp | 39 +- .../Vector/Transforms/VectorUnroll.cpp | 74 +- mlir/lib/Dialect/Vector/Utils/VectorUtils.cpp | 5 +- .../XeGPU/Transforms/XeGPUBlocking.cpp | 6 + mlir/lib/ExecutionEngine/ExecutionEngine.cpp | 3 +- mlir/lib/IR/Builders.cpp | 2 + mlir/lib/IR/MLIRContext.cpp | 2 +- mlir/lib/Interfaces/ViewLikeInterface.cpp | 6 +- mlir/lib/Pass/Pass.cpp | 60 +- mlir/lib/Pass/PassCrashRecovery.cpp | 3 +- mlir/lib/Reducer/OptReductionPass.cpp | 2 +- mlir/lib/Target/LLVMIR/ConvertToLLVMIR.cpp | 10 +- .../OpenMP/OpenMPToLLVMIRTranslation.cpp | 9 +- .../LLVMIR/LoopAnnotationTranslation.cpp | 2 +- mlir/lib/Target/LLVMIR/ModuleImport.cpp | 5 + mlir/lib/Target/LLVMIR/ModuleTranslation.cpp | 7 +- .../SPIRV/Deserialization/Deserializer.cpp | 6 +- .../Target/SPIRV/Serialization/Serializer.cpp | 34 +- .../lib/Tools/lsp-server-support/Protocol.cpp | 5 + mlir/lib/Transforms/Utils/CFGToSCF.cpp | 5 +- mlir/lib/Transforms/Utils/Inliner.cpp | 2 +- .../GPUToNVVM/gpu-to-nvvm-debuginfo.mlir | 25 + .../Conversion/GPUToSPIRV/reductions.mlir | 41 + mlir/test/Dialect/Arith/expand-ops.mlir | 178 +- .../Dialect/Bufferization/side-effects.mlir | 6 +- mlir/test/Dialect/LLVMIR/nvvm.mlir | 23 + .../Linalg/vectorization/insert-slice.mlir | 81 +- .../Linalg/vectorization/linalg-ops.mlir | 1 - mlir/test/Dialect/SPIRV/IR/gl-ops.mlir | 100 + .../SPIRV/IR/khr-cooperative-matrix-ops.mlir | 4 +- mlir/test/Dialect/SPIRV/IR/structure-ops.mlir | 33 + .../SPIRV/Transforms/canonicalize.mlir | 57 +- mlir/test/Dialect/Tensor/canonicalize.mlir | 16 - mlir/test/Dialect/Tosa/availability.mlir | 6 +- mlir/test/Dialect/Tosa/invalid.mlir | 29 +- mlir/test/Dialect/Tosa/invalid_extension.mlir | 6 +- mlir/test/Dialect/Tosa/level_check.mlir | 6 +- mlir/test/Dialect/Tosa/ops.mlir | 38 +- .../Tosa/profile_pro_fp_unsupported.mlir | 6 +- .../Tosa/profile_pro_int_unsupported.mlir | 6 +- mlir/test/Dialect/Tosa/tosa-infer-shapes.mlir | 6 +- mlir/test/Dialect/Tosa/verifier.mlir | 72 + .../Transform/test-pass-application.mlir | 135 +- .../Vector/CPU/ArmSVE/vector-smmla.mlir | 204 + .../Vector/CPU/ArmSVE/vector-summla.mlir | 108 + .../Vector/CPU/ArmSVE/vector-ummla.mlir | 112 + .../Vector/CPU/ArmSVE/vector-usmmla.mlir | 113 + mlir/test/Dialect/Vector/side-effects.mlir | 15 + ...vector-shape-cast-lowering-transforms.mlir | 449 +- .../Dialect/Vector/vector-unroll-options.mlir | 69 +- .../Vector/vector-warp-distribute.mlir | 36 + mlir/test/Dialect/XeGPU/xegpu-blocking.mlir | 110 + mlir/test/IR/test-side-effects.mlir | 8 +- .../Tensor/cast-runtime-verification.mlir | 50 + .../Tensor/dim-runtime-verification.mlir | 21 + .../Tensor/extract-runtime-verification.mlir | 64 + .../extract_slice-runtime-verification.mlir | 95 + mlir/test/Pass/pipeline-options-parsing.mlir | 76 +- mlir/test/Pass/pipeline-parsing.mlir | 4 +- mlir/test/Pass/run-reproducer.mlir | 7 +- mlir/test/Target/LLVMIR/Import/mrecip.ll | 9 + mlir/test/Target/LLVMIR/mrecip.mlir | 8 + mlir/test/Target/LLVMIR/nvvm/prefetch.mlir | 47 + mlir/test/Target/LLVMIR/nvvmir-invalid.mlir | 64 + .../Target/LLVMIR/openmp-barrier-cancel.mlir | 50 + mlir/test/Target/LLVMIR/openmp-llvm.mlir | 88 - mlir/test/Target/LLVMIR/openmp-todo.mlir | 12 + mlir/test/Target/SPIRV/constant.mlir | 30 +- mlir/test/Target/SPIRV/gl-ops.mlir | 10 + mlir/test/Transforms/composite-pass.mlir | 5 +- .../inlining-dump-default-pipeline.mlir | 4 +- .../lib/Dialect/TestIRDLToCpp/CMakeLists.txt | 3 +- .../Dialect/Vector/TestVectorTransforms.cpp | 14 +- .../lib/Dialect/XeGPU/TestXeGPUTransforms.cpp | 2 +- mlir/test/lib/IR/TestSideEffects.cpp | 12 +- .../TestTilingInterfaceTransformOps.cpp | 3 +- mlir/test/mlir-tblgen/directive-common.td | 2 +- .../Presburger/QuasiPolynomialTest.cpp | 2 +- .../Target/LLVM/SerializeToLLVMBitcode.cpp | 2 +- offload/CMakeLists.txt | 24 +- offload/liboffload/API/CMakeLists.txt | 1 + offload/liboffload/API/Kernel.td | 6 +- offload/liboffload/API/Memory.td | 2 +- offload/liboffload/src/OffloadImpl.cpp | 2 +- offload/plugins-nextgen/common/CMakeLists.txt | 1 + .../common/include/GlobalHandler.h | 4 +- .../common/src/GlobalHandler.cpp | 31 +- .../common/src/PluginInterface.cpp | 7 +- offload/test/lit.cfg | 3 +- .../OffloadAPI/device_code/CMakeLists.txt | 5 + .../unittests/OffloadAPI/device_code/noargs.c | 3 + .../OffloadAPI/kernel/olLaunchKernel.cpp | 27 +- openmp/docs/SupportAndFAQ.rst | 155 +- openmp/docs/index.rst | 18 + openmp/libompd/test/lit.site.cfg.in | 4 + openmp/runtime/CMakeLists.txt | 6 + openmp/runtime/cmake/LibompHandleFlags.cmake | 20 +- openmp/runtime/cmake/LibompUtils.cmake | 4 + openmp/runtime/test/lit.cfg | 1 - openmp/runtime/test/lit.site.cfg.in | 4 + .../for/omp_for_private_reduction.cpp | 166 + openmp/tools/archer/ompt-tsan.cpp | 2 +- openmp/tools/archer/tests/lit.cfg | 1 - openmp/tools/archer/tests/lit.site.cfg.in | 4 + openmp/tools/multiplex/tests/lit.cfg | 1 - openmp/tools/multiplex/tests/lit.site.cfg.in | 4 + runtimes/CMakeLists.txt | 2 +- utils/bazel/WORKSPACE | 9 - .../llvm-project-overlay/libc/BUILD.bazel | 24 +- .../libc/libc_build_rules.bzl | 23 - .../libc/test/src/string/BUILD.bazel | 9 + .../llvm-project-overlay/llvm/BUILD.bazel | 11 +- .../llvm-project-overlay/llvm/config.bzl | 1 + .../llvm/include/llvm/Config/llvm-config.h | 3 + .../llvm/unittests/BUILD.bazel | 80 + .../llvm-project-overlay/mlir/BUILD.bazel | 40 + .../mlir/test/BUILD.bazel | 15 + utils/bazel/third_party_build/pyyaml.BUILD | 16 - 3233 files changed, 130854 insertions(+), 73283 deletions(-) create mode 100644 clang-tools-extra/clang-doc/JSONGenerator.cpp create mode 100644 clang-tools-extra/clangd/test/module_dependencies.test create mode 100644 clang-tools-extra/test/clang-doc/json/class-template.cpp create mode 100644 clang-tools-extra/test/clang-doc/json/class.cpp create mode 100644 clang-tools-extra/test/clang-doc/json/function-specifiers.cpp create mode 100644 clang-tools-extra/test/clang-doc/json/method-template.cpp create mode 100644 clang-tools-extra/test/clang-doc/json/namespace.cpp create mode 100644 clang-tools-extra/test/clang-doc/mustache-index.cpp create mode 100644 clang-tools-extra/test/clang-doc/mustache-separate-namespace.cpp create mode 100644 clang-tools-extra/test/clang-tidy/checkers/bugprone/multi-level-implicit-pointer-conversion.c create mode 100644 clang-tools-extra/test/clang-tidy/checkers/google/readability-namespace-comments-missing-nested-namespaces.cpp create mode 100644 clang-tools-extra/test/clang-tidy/checkers/google/readability-namespace-comments-missing.cpp create mode 100644 clang-tools-extra/test/clang-tidy/checkers/modernize/use-trailing-return-type-transform-lambdas-cxx14.cpp create mode 100644 clang-tools-extra/test/clang-tidy/checkers/modernize/use-trailing-return-type-transform-lambdas-cxx20.cpp create mode 100644 clang-tools-extra/test/clang-tidy/checkers/modernize/use-trailing-return-type-transform-lambdas.cpp create mode 100644 clang-tools-extra/test/clang-tidy/checkers/modernize/use-trailing-return-type-wrong-config.cpp create mode 100644 clang-tools-extra/test/clang-tidy/checkers/readability/convert-member-functions-to-static-deducing-this.cpp create mode 100644 clang-tools-extra/unittests/clang-doc/JSONGeneratorTest.cpp create mode 100644 clang/include/clang/CIR/Dialect/IR/CIRAttrConstraints.td rename clang/{lib/Driver/ToolChains => include/clang/Driver}/CommonArgs.h (96%) create mode 100644 clang/lib/CIR/CodeGen/CIRGenClass.cpp create mode 100644 clang/lib/CIR/Dialect/IR/CIRDataLayout.cpp create mode 100644 clang/test/AST/ast-dump-type-callingconv.cpp delete mode 100644 clang/test/Analysis/pch_crash.cpp create mode 100644 clang/test/Analysis/pch_macro.cpp create mode 100644 clang/test/C/C23/n3006.c create mode 100644 clang/test/CIR/CodeGen/class.cpp create mode 100644 clang/test/CIR/CodeGen/complex.cpp create mode 100644 clang/test/CIR/CodeGen/ctor.cpp create mode 100644 clang/test/CIR/CodeGen/deferred-defs.cpp create mode 100644 clang/test/CIR/CodeGen/deferred-fn-defs.cpp create mode 100644 clang/test/CIR/CodeGen/dlti.c create mode 100644 clang/test/CIR/CodeGen/dlti_be.c create mode 100644 clang/test/CIR/CodeGen/enum.cpp create mode 100644 clang/test/CIR/CodeGen/forward-decls.cpp create mode 100644 clang/test/CIR/CodeGen/forward-enum.c create mode 100644 clang/test/CIR/CodeGen/template-specialization.cpp create mode 100644 clang/test/CIR/CodeGenOpenACC/combined-copy.cpp create mode 100644 clang/test/CIR/CodeGenOpenACC/compute-copy.cpp create mode 100644 clang/test/CIR/CodeGenOpenACC/host_data.c create mode 100644 clang/test/CIR/IR/complex.cir create mode 100644 clang/test/CIR/IR/invalid-complex.cir create mode 100644 clang/test/CIR/Transforms/vector-shuffle-dynamic-fold.cir create mode 100644 clang/test/CIR/Transforms/vector-shuffle-fold.cir create mode 100644 clang/test/CIR/Transforms/vector-ternary-fold.cir create mode 100644 clang/test/CodeGen/LoongArch/bfloat-abi.c create mode 100644 clang/test/CodeGen/LoongArch/bfloat-mangle.cpp create mode 100644 clang/test/CodeGen/X86/cygwin-varargs.c create mode 100644 clang/test/CodeGen/attr-availability-aligned-versions.c create mode 100644 clang/test/CodeGen/cfi-unchecked-callee-attribute-member-function.cpp create mode 100644 clang/test/CodeGen/cfi-unchecked-callee-attribute.cpp rename clang/test/CodeGen/{thinlto-distributed-backend-skip.ll => distributed-thin-lto/backend-skip.ll} (87%) rename clang/test/CodeGen/{thinlto-distributed.ll => distributed-thin-lto/basic.ll} (100%) rename clang/test/CodeGen/{thinlto-distributed-cfi-devirt.ll => distributed-thin-lto/cfi-devirt.ll} (97%) rename clang/test/CodeGen/{thinlto-distributed-cfi.ll => distributed-thin-lto/cfi.ll} (95%) create mode 100644 clang/test/CodeGen/distributed-thin-lto/cs-irpgo.c rename clang/test/CodeGen/{thinlto-distributed-newpm.ll => distributed-thin-lto/newpm.ll} (100%) rename clang/test/CodeGen/{thinlto-distributed-objc-contract-pass.ll => distributed-thin-lto/objc-contract-pass.ll} (100%) rename clang/test/CodeGen/{thinlto-distributed-supports-hot-cold-new.ll => distributed-thin-lto/supports-hot-cold-new.ll} (100%) create mode 100644 clang/test/CodeGen/openmp-prefix-map.c create mode 100644 clang/test/CodeGenHLSL/builtins/wave_get_lane_count.hlsl create mode 100644 clang/test/CodeGenHLSL/semantics/SV_Position.ps.hlsl create mode 100644 clang/test/Driver/darwin-invalid-os-versions.c create mode 100644 clang/test/Frontend/aarch64-print-enabled-extensions-cc1.c create mode 100644 clang/test/Frontend/cfi-unchecked-callee-attribute-n3037.c create mode 100644 clang/test/Frontend/cfi-unchecked-callee-attribute.c create mode 100644 clang/test/Frontend/cfi-unchecked-callee-attribute.cpp create mode 100644 clang/test/Modules/constexpr-initialization-failure.cpp create mode 100644 clang/test/OpenMP/for_private_reduction_codegen.cpp create mode 100644 clang/test/Preprocessor/line-directive-suppressed.c create mode 100644 clang/test/Sema/Inputs/XROS.sdk/SDKSettings.json create mode 100644 clang/test/Sema/attr-availability-invalid-os-versions.c create mode 100644 clang/test/Sema/attr-availability-ios-aligned-versions.c create mode 100644 clang/test/Sema/attr-availability-ios-fallback-aligned-versions.c create mode 100644 clang/test/Sema/warn-unreachable_crash.cpp create mode 100644 clang/test/SemaCXX/gh139818.cpp create mode 100644 clang/test/SemaCXX/paren-list-init-expr.cpp create mode 100644 clang/test/SemaHLSL/Semantics/position.ps.hlsl create mode 100644 clang/test/SemaHLSL/Semantics/position.ps.size.hlsl create mode 100644 clang/test/SemaHLSL/Semantics/position.vs.hlsl create mode 100644 compiler-rt/test/hwasan/TestCases/Posix/dlerror.cpp create mode 100644 flang-rt/include/flang-rt/runtime/work-queue.h create mode 100644 flang-rt/lib/runtime/work-queue.cpp create mode 100644 flang/docs/CommandGuide/index.rst rename flang/{lib/Lower/OpenMP => include/flang/Lower/Support}/PrivateReductionUtils.h (89%) rename flang/lib/Lower/{OpenMP => Support}/PrivateReductionUtils.cpp (95%) create mode 100644 flang/lib/Optimizer/HLFIR/Transforms/InlineHLFIRCopyIn.cpp create mode 100644 flang/test/Driver/darwin-version.f90 create mode 100644 flang/test/Driver/disable-diagnostic.f90 create mode 100644 flang/test/Driver/mrecip.f90 create mode 100644 flang/test/Fir/FirToSCF/if.fir create mode 100644 flang/test/HLFIR/declare-alloc-target.fir create mode 100644 flang/test/HLFIR/inline-hlfir-copy-in.fir create mode 100644 flang/test/HLFIR/opt-bufferization-elemental-assign-shape.fir create mode 100644 flang/test/HLFIR/opt-bufferization-tonto.fir create mode 100644 flang/test/Lower/OpenMP/atomic-privatize.f90 create mode 100644 flang/test/Lower/volatile-openmp2.f03 create mode 100644 flang/test/Parser/OpenMP/declare-reduction-multi.f90 create mode 100644 flang/test/Parser/OpenMP/declare-reduction-operator.f90 create mode 100644 flang/test/Semantics/OpenMP/declare-reduction-bad-operator.f90 create mode 100644 flang/test/Semantics/OpenMP/declare-reduction-bad-operator2.f90 create mode 100644 flang/test/Semantics/OpenMP/declare-reduction-dupsym.f90 create mode 100644 flang/test/Semantics/OpenMP/declare-reduction-functions.f90 create mode 100644 flang/test/Semantics/OpenMP/declare-reduction-logical.f90 create mode 100644 flang/test/Semantics/OpenMP/declare-reduction-mangled.f90 create mode 100644 flang/test/Semantics/OpenMP/declare-reduction-modfile.f90 create mode 100644 flang/test/Semantics/OpenMP/declare-reduction-operator.f90 create mode 100644 flang/test/Semantics/OpenMP/declare-reduction-operators.f90 create mode 100644 flang/test/Semantics/OpenMP/declare-reduction-renamedop.f90 create mode 100644 flang/test/Semantics/OpenMP/declare-reduction-typeerror.f90 create mode 100644 flang/test/Semantics/OpenMP/task-depend.f90 create mode 100644 flang/test/Semantics/cuf22.cuf create mode 100644 flang/test/Semantics/typeinfo12.f90 create mode 100644 flang/test/Semantics/typeinfo13.f90 create mode 100644 flang/test/Transforms/DoConcurrent/locality_specifiers_init_dealloc.mlir create mode 100644 flang/test/Transforms/DoConcurrent/locality_specifiers_simple.mlir create mode 100644 flang/unittests/Common/EnumClassTests.cpp create mode 100644 flang/unittests/Common/FortranFeaturesTest.cpp create mode 100644 libc/include/llvm-libc-macros/baremetal/CMakeLists.txt create mode 100644 libc/include/llvm-libc-macros/baremetal/time-macros.h delete mode 100644 libc/src/math/amdgpu/acos.cpp delete mode 100644 libc/src/math/amdgpu/acosf.cpp delete mode 100644 libc/src/math/amdgpu/acosh.cpp delete mode 100644 libc/src/math/amdgpu/acoshf.cpp delete mode 100644 libc/src/math/amdgpu/asin.cpp delete mode 100644 libc/src/math/amdgpu/asinf.cpp delete mode 100644 libc/src/math/amdgpu/asinh.cpp delete mode 100644 libc/src/math/amdgpu/asinhf.cpp delete mode 100644 libc/src/math/amdgpu/atan.cpp delete mode 100644 libc/src/math/amdgpu/atan2.cpp delete mode 100644 libc/src/math/amdgpu/atan2f.cpp delete mode 100644 libc/src/math/amdgpu/atanf.cpp delete mode 100644 libc/src/math/amdgpu/atanh.cpp delete mode 100644 libc/src/math/amdgpu/atanhf.cpp delete mode 100644 libc/src/math/amdgpu/cos.cpp delete mode 100644 libc/src/math/amdgpu/cosf.cpp delete mode 100644 libc/src/math/amdgpu/cosh.cpp delete mode 100644 libc/src/math/amdgpu/coshf.cpp delete mode 100644 libc/src/math/amdgpu/declarations.h delete mode 100644 libc/src/math/amdgpu/erf.cpp delete mode 100644 libc/src/math/amdgpu/erff.cpp delete mode 100644 libc/src/math/amdgpu/exp.cpp delete mode 100644 libc/src/math/amdgpu/exp10.cpp delete mode 100644 libc/src/math/amdgpu/exp10f.cpp delete mode 100644 libc/src/math/amdgpu/exp2.cpp delete mode 100644 libc/src/math/amdgpu/exp2f.cpp delete mode 100644 libc/src/math/amdgpu/expf.cpp delete mode 100644 libc/src/math/amdgpu/expm1.cpp delete mode 100644 libc/src/math/amdgpu/expm1f.cpp delete mode 100644 libc/src/math/amdgpu/fdim.cpp delete mode 100644 libc/src/math/amdgpu/fdimf.cpp delete mode 100644 libc/src/math/amdgpu/hypot.cpp delete mode 100644 libc/src/math/amdgpu/hypotf.cpp delete mode 100644 libc/src/math/amdgpu/ilogb.cpp delete mode 100644 libc/src/math/amdgpu/ilogbf.cpp delete mode 100644 libc/src/math/amdgpu/log.cpp delete mode 100644 libc/src/math/amdgpu/log10.cpp delete mode 100644 libc/src/math/amdgpu/log10f.cpp delete mode 100644 libc/src/math/amdgpu/log1p.cpp delete mode 100644 libc/src/math/amdgpu/log1pf.cpp delete mode 100644 libc/src/math/amdgpu/log2.cpp delete mode 100644 libc/src/math/amdgpu/log2f.cpp delete mode 100644 libc/src/math/amdgpu/logb.cpp delete mode 100644 libc/src/math/amdgpu/logbf.cpp delete mode 100644 libc/src/math/amdgpu/logf.cpp delete mode 100644 libc/src/math/amdgpu/nextafter.cpp delete mode 100644 libc/src/math/amdgpu/nextafterf.cpp delete mode 100644 libc/src/math/amdgpu/platform.h delete mode 100644 libc/src/math/amdgpu/powf.cpp delete mode 100644 libc/src/math/amdgpu/powi.cpp delete mode 100644 libc/src/math/amdgpu/powif.cpp delete mode 100644 libc/src/math/amdgpu/remquo.cpp delete mode 100644 libc/src/math/amdgpu/remquof.cpp delete mode 100644 libc/src/math/amdgpu/sin.cpp delete mode 100644 libc/src/math/amdgpu/sincos.cpp delete mode 100644 libc/src/math/amdgpu/sincosf.cpp delete mode 100644 libc/src/math/amdgpu/sinf.cpp delete mode 100644 libc/src/math/amdgpu/sinh.cpp delete mode 100644 libc/src/math/amdgpu/sinhf.cpp delete mode 100644 libc/src/math/amdgpu/tan.cpp delete mode 100644 libc/src/math/amdgpu/tanf.cpp delete mode 100644 libc/src/math/amdgpu/tanh.cpp delete mode 100644 libc/src/math/amdgpu/tanhf.cpp delete mode 100644 libc/src/math/generic/exp_utils.cpp delete mode 100644 libc/src/math/generic/exp_utils.h delete mode 100644 libc/src/math/nvptx/acos.cpp delete mode 100644 libc/src/math/nvptx/acosf.cpp delete mode 100644 libc/src/math/nvptx/acosh.cpp delete mode 100644 libc/src/math/nvptx/acoshf.cpp delete mode 100644 libc/src/math/nvptx/asin.cpp delete mode 100644 libc/src/math/nvptx/asinf.cpp delete mode 100644 libc/src/math/nvptx/asinh.cpp delete mode 100644 libc/src/math/nvptx/asinhf.cpp delete mode 100644 libc/src/math/nvptx/atan.cpp delete mode 100644 libc/src/math/nvptx/atan2.cpp delete mode 100644 libc/src/math/nvptx/atan2f.cpp delete mode 100644 libc/src/math/nvptx/atanf.cpp delete mode 100644 libc/src/math/nvptx/atanh.cpp delete mode 100644 libc/src/math/nvptx/atanhf.cpp delete mode 100644 libc/src/math/nvptx/cos.cpp delete mode 100644 libc/src/math/nvptx/cosf.cpp delete mode 100644 libc/src/math/nvptx/cosh.cpp delete mode 100644 libc/src/math/nvptx/coshf.cpp delete mode 100644 libc/src/math/nvptx/declarations.h delete mode 100644 libc/src/math/nvptx/erf.cpp delete mode 100644 libc/src/math/nvptx/erff.cpp delete mode 100644 libc/src/math/nvptx/exp.cpp delete mode 100644 libc/src/math/nvptx/exp10.cpp delete mode 100644 libc/src/math/nvptx/exp10f.cpp delete mode 100644 libc/src/math/nvptx/exp2.cpp delete mode 100644 libc/src/math/nvptx/exp2f.cpp delete mode 100644 libc/src/math/nvptx/expf.cpp delete mode 100644 libc/src/math/nvptx/expm1.cpp delete mode 100644 libc/src/math/nvptx/expm1f.cpp delete mode 100644 libc/src/math/nvptx/fdim.cpp delete mode 100644 libc/src/math/nvptx/fdimf.cpp delete mode 100644 libc/src/math/nvptx/frexp.cpp delete mode 100644 libc/src/math/nvptx/frexpf.cpp delete mode 100644 libc/src/math/nvptx/hypot.cpp delete mode 100644 libc/src/math/nvptx/hypotf.cpp delete mode 100644 libc/src/math/nvptx/ilogb.cpp delete mode 100644 libc/src/math/nvptx/ilogbf.cpp delete mode 100644 libc/src/math/nvptx/ldexp.cpp delete mode 100644 libc/src/math/nvptx/ldexpf.cpp delete mode 100644 libc/src/math/nvptx/log.cpp delete mode 100644 libc/src/math/nvptx/log10.cpp delete mode 100644 libc/src/math/nvptx/log10f.cpp delete mode 100644 libc/src/math/nvptx/log1p.cpp delete mode 100644 libc/src/math/nvptx/log1pf.cpp delete mode 100644 libc/src/math/nvptx/log2.cpp delete mode 100644 libc/src/math/nvptx/log2f.cpp delete mode 100644 libc/src/math/nvptx/logb.cpp delete mode 100644 libc/src/math/nvptx/logbf.cpp delete mode 100644 libc/src/math/nvptx/logf.cpp delete mode 100644 libc/src/math/nvptx/lrintf.cpp delete mode 100644 libc/src/math/nvptx/nextafter.cpp delete mode 100644 libc/src/math/nvptx/nextafterf.cpp delete mode 100644 libc/src/math/nvptx/nvptx.h delete mode 100644 libc/src/math/nvptx/powf.cpp delete mode 100644 libc/src/math/nvptx/powi.cpp delete mode 100644 libc/src/math/nvptx/powif.cpp delete mode 100644 libc/src/math/nvptx/remquo.cpp delete mode 100644 libc/src/math/nvptx/remquof.cpp delete mode 100644 libc/src/math/nvptx/scalbn.cpp delete mode 100644 libc/src/math/nvptx/scalbnf.cpp delete mode 100644 libc/src/math/nvptx/sin.cpp delete mode 100644 libc/src/math/nvptx/sincos.cpp delete mode 100644 libc/src/math/nvptx/sincosf.cpp delete mode 100644 libc/src/math/nvptx/sinf.cpp delete mode 100644 libc/src/math/nvptx/sinh.cpp delete mode 100644 libc/src/math/nvptx/sinhf.cpp delete mode 100644 libc/src/math/nvptx/tan.cpp delete mode 100644 libc/src/math/nvptx/tanf.cpp delete mode 100644 libc/src/math/nvptx/tanh.cpp delete mode 100644 libc/src/math/nvptx/tanhf.cpp create mode 100644 libclc/clc/include/clc/geometric/clc_fast_normalize.h create mode 100644 libclc/clc/include/clc/geometric/clc_normalize.h create mode 100644 libclc/clc/lib/generic/geometric/clc_dot.inc create mode 100644 libclc/clc/lib/generic/geometric/clc_fast_normalize.cl create mode 100644 libclc/clc/lib/generic/geometric/clc_fast_normalize.inc create mode 100644 libclc/clc/lib/generic/geometric/clc_normalize.cl create mode 100644 libclc/clc/lib/generic/geometric/clc_normalize.inc delete mode 100644 libclc/opencl/lib/generic/geometric/fast_normalize.inc create mode 100644 libcxx/docs/ABIGuarantees.rst create mode 100644 libcxx/include/__type_traits/integer_traits.h delete mode 100644 libcxx/include/__type_traits/is_signed_integer.h delete mode 100644 libcxx/include/__type_traits/is_unsigned_integer.h rename libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/{cpp20_iter_concepts.pass.cpp => cpp20_iter_concepts.compile.pass.cpp} (52%) rename libcxx/test/std/containers/sequences/forwardlist/forwardlist.spec/{swap_noexcept.pass.cpp => swap_noexcept.compile.pass.cpp} (98%) create mode 100644 libcxx/test/std/time/time.point/time.point.arithmetic/op_++.pass.cpp create mode 100644 libcxx/test/std/time/time.point/time.point.arithmetic/op_++int.pass.cpp create mode 100644 libcxx/test/std/time/time.point/time.point.arithmetic/op_--.pass.cpp create mode 100644 libcxx/test/std/time/time.point/time.point.arithmetic/op_--int.pass.cpp delete mode 100644 lld/test/COFF/lto-late-arm.ll create mode 100644 lld/test/ELF/riscv-feature-zicfilp-func-sig.s create mode 100644 lld/test/ELF/riscv-feature-zicfilp-unlabeled.s create mode 100644 lld/test/ELF/riscv-feature-zicfiss.s create mode 100644 lld/test/ELF/riscv-relax-call-stress.s create mode 100644 lld/test/MachO/ordre-file-cstring.s create mode 100644 lldb/test/Shell/Commands/command-plugin-enable+disable.test create mode 100644 lldb/test/Shell/Commands/command-plugin-list.test create mode 100644 lldb/test/Shell/Expr/TestObjCxxEnumConflict.test create mode 100644 lldb/test/Shell/ObjectFile/PECOFF/dwarf-clang.yaml create mode 100644 lldb/test/Shell/ObjectFile/PECOFF/dwarf-gcc-mingw.yaml create mode 100644 lldb/test/Shell/Settings/TestFrameFunctionInlined.test create mode 100644 lldb/tools/lldb-dap/Protocol/ProtocolEvents.cpp create mode 100644 lldb/tools/lldb-dap/Protocol/ProtocolEvents.h create mode 100644 lldb/unittests/ABI/AArch64/ABIAArch64Test.cpp create mode 100644 lldb/unittests/ABI/AArch64/CMakeLists.txt create mode 100644 lldb/unittests/ABI/CMakeLists.txt create mode 100644 llvm/include/llvm/CGData/CGDataPatchItem.h create mode 100644 llvm/include/llvm/DebugInfo/DWARF/DWARFDataExtractorSimple.h create mode 100644 llvm/include/llvm/DebugInfo/LogicalView/Core/LVSourceLanguage.h create mode 100644 llvm/include/llvm/Frontend/Directive/Spelling.h create mode 100644 llvm/include/llvm/Transforms/Instrumentation/MemProfInstrumentation.h rename llvm/include/llvm/Transforms/Instrumentation/{MemProfiler.h => MemProfUse.h} (52%) create mode 100644 llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/PackReuse.h delete mode 100644 llvm/lib/DebugInfo/DWARF/DWARFDataExtractor.cpp create mode 100644 llvm/lib/DebugInfo/LogicalView/Core/LVSourceLanguage.cpp create mode 100644 llvm/lib/Frontend/Directive/CMakeLists.txt create mode 100644 llvm/lib/Frontend/Directive/Spelling.cpp create mode 100644 llvm/lib/Transforms/Instrumentation/MemProfInstrumentation.cpp rename llvm/lib/Transforms/Instrumentation/{MemProfiler.cpp => MemProfUse.cpp} (55%) create mode 100644 llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/PackReuse.cpp create mode 100644 llvm/num.txt create mode 100644 llvm/test/CodeGen/AArch64/GlobalISel/postlegalizer-combiner-unmergedup.mir create mode 100644 llvm/test/CodeGen/AArch64/build-vector-dup-simd.ll create mode 100644 llvm/test/CodeGen/AArch64/sms-loop-carried-fp-exceptions1.mir create mode 100644 llvm/test/CodeGen/AArch64/sms-loop-carried-fp-exceptions2.mir create mode 100644 llvm/test/CodeGen/AArch64/sve2p2-intrinsics.ll create mode 100644 llvm/test/CodeGen/AArch64/tail-call-stack-args.ll create mode 100644 llvm/test/CodeGen/AMDGPU/GlobalISel/shufflevector-pointer-crash.mir create mode 100644 llvm/test/CodeGen/AMDGPU/ashr64_reduce.ll create mode 100644 llvm/test/CodeGen/AMDGPU/bit-op-reduce-width-known-bits.ll create mode 100644 llvm/test/CodeGen/AMDGPU/fabs.bf16.ll create mode 100644 llvm/test/CodeGen/AMDGPU/fneg-fabs.bf16.ll create mode 100644 llvm/test/CodeGen/AMDGPU/fneg.bf16.ll create mode 100644 llvm/test/CodeGen/AMDGPU/fold-freeze-fmul-to-fma.ll create mode 100644 llvm/test/CodeGen/AMDGPU/move-to-valu-pseudo-scalar-trans-f16-fake16.ll create mode 100644 llvm/test/CodeGen/AMDGPU/move-to-valu-pseudo-scalar-trans-f16-true16.ll create mode 100644 llvm/test/CodeGen/AMDGPU/sched-image-sample-post-RA.mir create mode 100644 llvm/test/CodeGen/AMDGPU/srl64_reduce.ll create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Invalid-ParameterIsNotString.ll create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterKind.ll create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterSpace.ll create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterValue.ll create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll create mode 100644 llvm/test/CodeGen/DirectX/legalize-i64-high-low-vec-split.ll create mode 100644 llvm/test/CodeGen/Hexagon/swp-loop-carried-order-dep1.mir create mode 100644 llvm/test/CodeGen/Hexagon/swp-loop-carried-order-dep2.mir create mode 100644 llvm/test/CodeGen/Hexagon/swp-loop-carried-order-dep3.mir create mode 100644 llvm/test/CodeGen/Hexagon/swp-loop-carried-order-dep4.mir create mode 100644 llvm/test/CodeGen/Hexagon/swp-loop-carried-order-dep5.mir create mode 100644 llvm/test/CodeGen/Hexagon/swp-loop-carried-order-dep6.mir create mode 100644 llvm/test/CodeGen/LoongArch/bf16-promote.ll create mode 100644 llvm/test/CodeGen/LoongArch/bf16.ll create mode 100644 llvm/test/CodeGen/LoongArch/isel-optnone.ll create mode 100644 llvm/test/CodeGen/LoongArch/lasx/xvmskcond.ll create mode 100644 llvm/test/CodeGen/LoongArch/lsx/vmskcond.ll create mode 100644 llvm/test/CodeGen/MSP430/fake_use_float.ll create mode 100644 llvm/test/CodeGen/MSP430/fcmp.ll create mode 100644 llvm/test/CodeGen/NVPTX/pm-event.ll create mode 100644 llvm/test/CodeGen/PowerPC/splat-extend.ll create mode 100644 llvm/test/CodeGen/RISCV/fold-masked-merge.ll create mode 100644 llvm/test/CodeGen/RISCV/fpenv-xlen.ll create mode 100644 llvm/test/CodeGen/RISCV/rv64-trampoline-cfi.ll create mode 100644 llvm/test/CodeGen/RISCV/rvv/pr141907.ll create mode 100644 llvm/test/CodeGen/RISCV/select-cond.ll create mode 100644 llvm/test/CodeGen/SPIRV/ExecutionMode_Fragment.ll create mode 100644 llvm/test/CodeGen/SPIRV/ExecutionMode_Vertex.ll create mode 100644 llvm/test/CodeGen/SystemZ/fold-masked-merge.ll create mode 100644 llvm/test/CodeGen/X86/apx/push2-pop2-disabled-with-small-stack-alignment.ll create mode 100644 llvm/test/CodeGen/X86/avx512fp16-novl.ll create mode 100644 llvm/test/CodeGen/X86/bmi-select-distrib.ll create mode 100644 llvm/test/CodeGen/X86/bsf.ll create mode 100644 llvm/test/CodeGen/X86/bsr.ll create mode 100644 llvm/test/CodeGen/X86/isel-fabs-x87.ll create mode 100644 llvm/test/CodeGen/X86/isel-fabs.ll create mode 100644 llvm/test/CodeGen/X86/pr142937.ll create mode 100644 llvm/test/CodeGen/X86/rex-profile-test.ll create mode 100644 llvm/test/DebugInfo/X86/file-index-across-cu.ll rename llvm/test/MC/RISCV/{long-jump-disable-relax.s => option-exact-long-jump-disable.s} (86%) create mode 100644 llvm/test/MC/RISCV/rv32-relaxation-xqci.s create mode 100644 llvm/test/ThinLTO/X86/memprof-report-hinted-partial.ll create mode 100644 llvm/test/Transforms/CodeGenPrepare/X86/sink-addrmode-reg-does-not-geps.ll create mode 100644 llvm/test/Transforms/GVN/captures.ll create mode 100644 llvm/test/Transforms/GVN/trunc-nuw-equality.ll create mode 100644 llvm/test/Transforms/IndVarSimplify/iv-cmp-sext.ll create mode 100644 llvm/test/Transforms/InstCombine/AMDGPU/trivially-uniform.ll create mode 100644 llvm/test/Transforms/InstSimplify/ConstProp/atan-intrinsic.ll create mode 100644 llvm/test/Transforms/LoopInterchange/confused-dependence.ll create mode 100644 llvm/test/Transforms/LoopUnroll/peel-last-iteration-minmax.ll create mode 100644 llvm/test/Transforms/LoopVectorize/AArch64/select-index.ll create mode 100644 llvm/test/Transforms/LoopVectorize/RISCV/interleaved-masked-access.ll create mode 100644 llvm/test/Transforms/LoopVectorize/load-deref-pred-poison-ub-ops-feeding-pointer.ll create mode 100644 llvm/test/Transforms/LoopVectorize/select-index-interleaving.ll delete mode 100644 llvm/test/Transforms/LoopVectorize/select-min-index.ll create mode 100644 llvm/test/Transforms/LoopVectorize/select-smax-last-index.ll create mode 100644 llvm/test/Transforms/LoopVectorize/select-smin-last-index.ll create mode 100644 llvm/test/Transforms/LoopVectorize/select-umax-last-index.ll create mode 100644 llvm/test/Transforms/LoopVectorize/select-umin-first-index.ll create mode 100644 llvm/test/Transforms/LoopVectorize/select-umin-last-index.ll create mode 100644 llvm/test/Transforms/LowerMatrixIntrinsics/flatten.ll create mode 100644 llvm/test/Transforms/LowerMatrixIntrinsics/unary.ll create mode 100644 llvm/test/Transforms/LowerTypeTests/asm.ll create mode 100644 llvm/test/Transforms/PGOProfile/ctx-instrumentation-aliases.ll create mode 100644 llvm/test/Transforms/PGOProfile/memprof_max_cold_threshold.test create mode 100644 llvm/test/Transforms/SROA/scalable-vectors-with-known-vscale.ll create mode 100644 llvm/test/Transforms/SandboxVectorizer/pack_reuse_basic.ll create mode 100644 llvm/test/Transforms/SandboxVectorizer/pack_reuse_end_to_end.ll create mode 100644 llvm/test/Transforms/SimplifyTypeTests/basic.ll create mode 100644 llvm/test/Transforms/VectorCombine/AArch64/ext-extract.ll create mode 100644 llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-ignore-preferred-alignment.ll create mode 100644 llvm/test/Verifier/target-ext-vector-invalid.ll create mode 100644 llvm/test/Verifier/target-ext-vector.ll create mode 100644 llvm/test/tools/llvm-dwarfdump/X86/DW_OP_GNU_implicit_pointer.yaml delete mode 100644 llvm/test/tools/llvm-rc/Inputs/tag-accelerators-ascii-alt.rc create mode 100644 llvm/test/tools/llvm-readobj/ELF/bb-addr-map-compressed-zstd.test create mode 100644 llvm/utils/gn/secondary/llvm/lib/Frontend/Directive/BUILD.gn create mode 100644 mlir/include/mlir/Dialect/ArmSVE/TransformOps/ArmSVEVectorTransformOps.h create mode 100644 mlir/include/mlir/Dialect/ArmSVE/TransformOps/ArmSVEVectorTransformOps.td create mode 100644 mlir/include/mlir/Dialect/ArmSVE/TransformOps/CMakeLists.txt create mode 100644 mlir/include/mlir/Dialect/Tensor/Transforms/RuntimeOpVerification.h create mode 100644 mlir/lib/Dialect/ArmSVE/TransformOps/ArmSVEVectorTransformOps.cpp create mode 100644 mlir/lib/Dialect/ArmSVE/TransformOps/CMakeLists.txt create mode 100644 mlir/lib/Dialect/ArmSVE/Transforms/LowerContractionToSVEI8MMPattern.cpp create mode 100644 mlir/lib/Dialect/Tensor/Transforms/RuntimeOpVerification.cpp create mode 100644 mlir/test/Conversion/GPUToNVVM/gpu-to-nvvm-debuginfo.mlir create mode 100644 mlir/test/Dialect/Vector/CPU/ArmSVE/vector-smmla.mlir create mode 100644 mlir/test/Dialect/Vector/CPU/ArmSVE/vector-summla.mlir create mode 100644 mlir/test/Dialect/Vector/CPU/ArmSVE/vector-ummla.mlir create mode 100644 mlir/test/Dialect/Vector/CPU/ArmSVE/vector-usmmla.mlir create mode 100644 mlir/test/Dialect/Vector/side-effects.mlir create mode 100644 mlir/test/Integration/Dialect/Tensor/cast-runtime-verification.mlir create mode 100644 mlir/test/Integration/Dialect/Tensor/dim-runtime-verification.mlir create mode 100644 mlir/test/Integration/Dialect/Tensor/extract-runtime-verification.mlir create mode 100644 mlir/test/Integration/Dialect/Tensor/extract_slice-runtime-verification.mlir create mode 100644 mlir/test/Target/LLVMIR/Import/mrecip.ll create mode 100644 mlir/test/Target/LLVMIR/mrecip.mlir create mode 100644 mlir/test/Target/LLVMIR/nvvm/prefetch.mlir create mode 100644 mlir/test/Target/LLVMIR/openmp-barrier-cancel.mlir create mode 100644 offload/unittests/OffloadAPI/device_code/noargs.c create mode 100644 openmp/runtime/test/worksharing/for/omp_for_private_reduction.cpp delete mode 100644 utils/bazel/third_party_build/pyyaml.BUILD diff --git a/bolt/include/bolt/Core/BinaryBasicBlock.h b/bolt/include/bolt/Core/BinaryBasicBlock.h index 25cccc4edecf6..629f0ce8314dc 100644 --- a/bolt/include/bolt/Core/BinaryBasicBlock.h +++ b/bolt/include/bolt/Core/BinaryBasicBlock.h @@ -52,9 +52,8 @@ class BinaryBasicBlock { uint64_t MispredictedCount; /// number of branches mispredicted bool operator<(const BinaryBranchInfo &Other) const { - return (Count < Other.Count) || - (Count == Other.Count && - MispredictedCount < Other.MispredictedCount); + return std::tie(Count, MispredictedCount) < + std::tie(Other.Count, Other.MispredictedCount); } }; diff --git a/bolt/include/bolt/Core/BinaryFunction.h b/bolt/include/bolt/Core/BinaryFunction.h index 14957cba50174..ca8b786f4ab69 100644 --- a/bolt/include/bolt/Core/BinaryFunction.h +++ b/bolt/include/bolt/Core/BinaryFunction.h @@ -388,6 +388,10 @@ class BinaryFunction { /// The profile data for the number of times the function was executed. uint64_t ExecutionCount{COUNT_NO_PROFILE}; + /// Profile data for the number of times this function was entered from + /// external code (DSO, JIT, etc). + uint64_t ExternEntryCount{0}; + /// Profile match ratio. float ProfileMatchRatio{0.0f}; @@ -1877,6 +1881,10 @@ class BinaryFunction { return *this; } + /// Set the profile data for the number of times the function was entered from + /// external code (DSO/JIT). + void setExternEntryCount(uint64_t Count) { ExternEntryCount = Count; } + /// Adjust execution count for the function by a given \p Count. The value /// \p Count will be subtracted from the current function count. /// @@ -1904,6 +1912,10 @@ class BinaryFunction { /// Return COUNT_NO_PROFILE if there's no profile info. uint64_t getExecutionCount() const { return ExecutionCount; } + /// Return the profile information about the number of times the function was + /// entered from external code (DSO/JIT). + uint64_t getExternEntryCount() const { return ExternEntryCount; } + /// Return the raw profile information about the number of branch /// executions corresponding to this function. uint64_t getRawSampleCount() const { return RawSampleCount; } diff --git a/bolt/include/bolt/Core/MCPlusBuilder.h b/bolt/include/bolt/Core/MCPlusBuilder.h index b233452985502..804100db80793 100644 --- a/bolt/include/bolt/Core/MCPlusBuilder.h +++ b/bolt/include/bolt/Core/MCPlusBuilder.h @@ -405,7 +405,7 @@ class MCPlusBuilder { bool equals(const MCExpr &A, const MCExpr &B, CompFuncTy Comp) const; - virtual bool equals(const MCTargetExpr &A, const MCTargetExpr &B, + virtual bool equals(const MCSpecifierExpr &A, const MCSpecifierExpr &B, CompFuncTy Comp) const; virtual bool isBranch(const MCInst &Inst) const { diff --git a/bolt/include/bolt/Passes/PAuthGadgetScanner.h b/bolt/include/bolt/Passes/PAuthGadgetScanner.h index 98a49df862ebd..c6b9cc2eb4b9c 100644 --- a/bolt/include/bolt/Passes/PAuthGadgetScanner.h +++ b/bolt/include/bolt/Passes/PAuthGadgetScanner.h @@ -77,9 +77,7 @@ struct MCInstInBFReference { return BF == RHS.BF && Offset == RHS.Offset; } bool operator<(const MCInstInBFReference &RHS) const { - if (BF != RHS.BF) - return BF < RHS.BF; - return Offset < RHS.Offset; + return std::tie(BF, Offset) < std::tie(RHS.BF, RHS.Offset); } operator MCInst &() const { assert(BF != nullptr); diff --git a/bolt/include/bolt/Profile/DataAggregator.h b/bolt/include/bolt/Profile/DataAggregator.h index cb8e81b829a09..3f07a6dc03a4f 100644 --- a/bolt/include/bolt/Profile/DataAggregator.h +++ b/bolt/include/bolt/Profile/DataAggregator.h @@ -78,6 +78,13 @@ class DataAggregator : public DataReader { static bool checkPerfDataMagic(StringRef FileName); private: + struct LBREntry { + uint64_t From; + uint64_t To; + bool Mispred; + }; + friend raw_ostream &operator<<(raw_ostream &OS, const LBREntry &); + struct PerfBranchSample { SmallVector LBR; }; @@ -476,7 +483,6 @@ class DataAggregator : public DataReader { /// Debugging dump methods void dump() const; - void dump(const LBREntry &LBR) const; void dump(const PerfBranchSample &Sample) const; void dump(const PerfMemSample &Sample) const; @@ -504,6 +510,12 @@ class DataAggregator : public DataReader { friend class YAMLProfileWriter; }; + +inline raw_ostream &operator<<(raw_ostream &OS, + const DataAggregator::LBREntry &L) { + OS << formatv("{0:x} -> {1:x}/{2}", L.From, L.To, L.Mispred ? 'M' : 'P'); + return OS; +} } // namespace bolt } // namespace llvm diff --git a/bolt/include/bolt/Profile/DataReader.h b/bolt/include/bolt/Profile/DataReader.h index 5df1b5a8f4a00..6f527ba3931d4 100644 --- a/bolt/include/bolt/Profile/DataReader.h +++ b/bolt/include/bolt/Profile/DataReader.h @@ -32,18 +32,6 @@ namespace bolt { class BinaryFunction; -struct LBREntry { - uint64_t From; - uint64_t To; - bool Mispred; -}; - -inline raw_ostream &operator<<(raw_ostream &OS, const LBREntry &LBR) { - OS << "0x" << Twine::utohexstr(LBR.From) << " -> 0x" - << Twine::utohexstr(LBR.To); - return OS; -} - struct Location { bool IsSymbol; StringRef Name; @@ -109,6 +97,9 @@ struct FuncBranchData { /// Total execution count for the function. int64_t ExecutionCount{0}; + /// Total entry count from external code for the function. + uint64_t ExternEntryCount{0}; + /// Indicate if the data was used. bool Used{false}; diff --git a/bolt/include/bolt/Profile/ProfileYAMLMapping.h b/bolt/include/bolt/Profile/ProfileYAMLMapping.h index a8d9a15311d94..41e2bd1651efd 100644 --- a/bolt/include/bolt/Profile/ProfileYAMLMapping.h +++ b/bolt/include/bolt/Profile/ProfileYAMLMapping.h @@ -206,6 +206,7 @@ struct BinaryFunctionProfile { uint32_t Id{0}; llvm::yaml::Hex64 Hash{0}; uint64_t ExecCount{0}; + uint64_t ExternEntryCount{0}; std::vector Blocks; std::vector InlineTree; bool Used{false}; @@ -218,6 +219,7 @@ template <> struct MappingTraits { YamlIO.mapRequired("fid", BFP.Id); YamlIO.mapRequired("hash", BFP.Hash); YamlIO.mapRequired("exec", BFP.ExecCount); + YamlIO.mapOptional("extern", BFP.ExternEntryCount, 0); YamlIO.mapRequired("nblocks", BFP.NumBasicBlocks); YamlIO.mapOptional("blocks", BFP.Blocks, std::vector()); diff --git a/bolt/lib/Core/BinaryFunction.cpp b/bolt/lib/Core/BinaryFunction.cpp index 6d1969f5c6c30..b998d7160aae7 100644 --- a/bolt/lib/Core/BinaryFunction.cpp +++ b/bolt/lib/Core/BinaryFunction.cpp @@ -471,6 +471,8 @@ void BinaryFunction::print(raw_ostream &OS, std::string Annotation) { OS << "\n Sample Count: " << RawSampleCount; OS << "\n Profile Acc : " << format("%.1f%%", ProfileMatchRatio * 100.0f); } + if (ExternEntryCount) + OS << "\n Extern Entry Count: " << ExternEntryCount; if (opts::PrintDynoStats && !getLayout().block_empty()) { OS << '\n'; diff --git a/bolt/lib/Core/HashUtilities.cpp b/bolt/lib/Core/HashUtilities.cpp index 6bdf30460f340..e01768387d6c8 100644 --- a/bolt/lib/Core/HashUtilities.cpp +++ b/bolt/lib/Core/HashUtilities.cpp @@ -67,6 +67,7 @@ std::string hashExpr(BinaryContext &BC, const MCExpr &Expr) { .append(hashInteger(BinaryExpr.getOpcode())) .append(hashExpr(BC, *BinaryExpr.getRHS())); } + case MCExpr::Specifier: case MCExpr::Target: return std::string(); } diff --git a/bolt/lib/Core/MCPlusBuilder.cpp b/bolt/lib/Core/MCPlusBuilder.cpp index 7752079b61538..fa8f4d1df308b 100644 --- a/bolt/lib/Core/MCPlusBuilder.cpp +++ b/bolt/lib/Core/MCPlusBuilder.cpp @@ -114,17 +114,19 @@ bool MCPlusBuilder::equals(const MCExpr &A, const MCExpr &B, equals(*BinaryA.getRHS(), *BinaryB.getRHS(), Comp); } - case MCExpr::Target: { - const auto &TargetExprA = cast(A); - const auto &TargetExprB = cast(B); + case MCExpr::Specifier: { + const auto &TargetExprA = cast(A); + const auto &TargetExprB = cast(B); return equals(TargetExprA, TargetExprB, Comp); } + case MCExpr::Target: + llvm_unreachable("Not implemented"); } llvm_unreachable("Invalid expression kind!"); } -bool MCPlusBuilder::equals(const MCTargetExpr &A, const MCTargetExpr &B, +bool MCPlusBuilder::equals(const MCSpecifierExpr &A, const MCSpecifierExpr &B, CompFuncTy Comp) const { llvm_unreachable("target-specific expressions are unsupported"); } diff --git a/bolt/lib/Passes/ProfileQualityStats.cpp b/bolt/lib/Passes/ProfileQualityStats.cpp index dfd74d3dd5719..64cc662c3ab29 100644 --- a/bolt/lib/Passes/ProfileQualityStats.cpp +++ b/bolt/lib/Passes/ProfileQualityStats.cpp @@ -532,6 +532,9 @@ void computeFlowMappings(const BinaryContext &BC, FlowInfo &TotalFlowMap) { std::vector &MaxCountMap = TotalMaxCountMaps[FunctionNum]; std::vector &MinCountMap = TotalMinCountMaps[FunctionNum]; + // Record external entry count into CallGraphIncomingFlows + CallGraphIncomingFlows[FunctionNum] += Function->getExternEntryCount(); + // Update MaxCountMap, MinCountMap, and CallGraphIncomingFlows auto recordCall = [&](const BinaryBasicBlock *SourceBB, const MCSymbol *DestSymbol, uint64_t Count, diff --git a/bolt/lib/Profile/DataAggregator.cpp b/bolt/lib/Profile/DataAggregator.cpp index f05c40ebcd2f7..308346e5d02ce 100644 --- a/bolt/lib/Profile/DataAggregator.cpp +++ b/bolt/lib/Profile/DataAggregator.cpp @@ -580,8 +580,10 @@ void DataAggregator::processProfile(BinaryContext &BC) { } } - for (auto &FuncBranches : NamesToBranches) + for (auto &FuncBranches : NamesToBranches) { llvm::stable_sort(FuncBranches.second.Data); + llvm::stable_sort(FuncBranches.second.EntryData); + } for (auto &MemEvents : NamesToMemEvents) llvm::stable_sort(MemEvents.second.Data); @@ -733,8 +735,10 @@ bool DataAggregator::doBranch(uint64_t From, uint64_t To, uint64_t Count, // corresponds to a return (if \p IsFrom) or a call continuation (otherwise). auto handleAddress = [&](uint64_t &Addr, bool IsFrom) { BinaryFunction *Func = getBinaryFunctionContainingAddress(Addr); - if (!Func) + if (!Func) { + Addr = 0; return std::pair{Func, false}; + } Addr -= Func->getAddress(); @@ -972,7 +976,7 @@ bool DataAggregator::recordExit(BinaryFunction &BF, uint64_t From, bool Mispred, return true; } -ErrorOr DataAggregator::parseLBREntry() { +ErrorOr DataAggregator::parseLBREntry() { LBREntry Res; ErrorOr FromStrRes = parseString('/'); if (std::error_code EC = FromStrRes.getError()) @@ -1430,54 +1434,16 @@ void DataAggregator::parseLBRSample(const PerfBranchSample &Sample, const uint64_t TraceTo = NextLBR->From; const BinaryFunction *TraceBF = getBinaryFunctionContainingAddress(TraceFrom); - if (opts::HeatmapMode == opts::HeatmapModeKind::HM_Exclusive) { - FTInfo &Info = FallthroughLBRs[Trace(TraceFrom, TraceTo)]; + FTInfo &Info = FallthroughLBRs[Trace(TraceFrom, TraceTo)]; + if (TraceBF && TraceBF->containsAddress(LBR.From)) ++Info.InternCount; - } else if (TraceBF && TraceBF->containsAddress(TraceTo)) { - FTInfo &Info = FallthroughLBRs[Trace(TraceFrom, TraceTo)]; - if (TraceBF->containsAddress(LBR.From)) - ++Info.InternCount; - else - ++Info.ExternCount; - } else { - const BinaryFunction *ToFunc = - getBinaryFunctionContainingAddress(TraceTo); - if (TraceBF && ToFunc) { - LLVM_DEBUG({ - dbgs() << "Invalid trace starting in " << TraceBF->getPrintName() - << formatv(" @ {0:x}", TraceFrom - TraceBF->getAddress()) - << formatv(" and ending @ {0:x}\n", TraceTo); - }); - ++NumInvalidTraces; - } else { - LLVM_DEBUG({ - dbgs() << "Out of range trace starting in " - << (TraceBF ? TraceBF->getPrintName() : "None") - << formatv(" @ {0:x}", - TraceFrom - (TraceBF ? TraceBF->getAddress() : 0)) - << " and ending in " - << (ToFunc ? ToFunc->getPrintName() : "None") - << formatv(" @ {0:x}\n", - TraceTo - (ToFunc ? ToFunc->getAddress() : 0)); - }); - ++NumLongRangeTraces; - } - } + else + ++Info.ExternCount; ++NumTraces; } NextLBR = &LBR; - // Record branches outside binary functions for heatmap. - if (opts::HeatmapMode == opts::HeatmapModeKind::HM_Exclusive) { - TakenBranchInfo &Info = BranchLBRs[Trace(LBR.From, LBR.To)]; - ++Info.TakenCount; - continue; - } - uint64_t From = getBinaryFunctionContainingAddress(LBR.From) ? LBR.From : 0; - uint64_t To = getBinaryFunctionContainingAddress(LBR.To) ? LBR.To : 0; - if (!From && !To) - continue; - TakenBranchInfo &Info = BranchLBRs[Trace(From, To)]; + TakenBranchInfo &Info = BranchLBRs[Trace(LBR.From, LBR.To)]; ++Info.TakenCount; Info.MispredCount += LBR.Mispred; } @@ -2289,6 +2255,7 @@ std::error_code DataAggregator::writeBATYAML(BinaryContext &BC, YamlBF.Id = BF->getFunctionNumber(); YamlBF.Hash = BAT->getBFHash(FuncAddress); YamlBF.ExecCount = BF->getKnownExecutionCount(); + YamlBF.ExternEntryCount = BF->getExternEntryCount(); YamlBF.NumBasicBlocks = BAT->getNumBasicBlocks(FuncAddress); const BoltAddressTranslation::BBHashMapTy &BlockMap = BAT->getBBHashMap(FuncAddress); @@ -2398,16 +2365,10 @@ std::error_code DataAggregator::writeBATYAML(BinaryContext &BC, void DataAggregator::dump() const { DataReader::dump(); } -void DataAggregator::dump(const LBREntry &LBR) const { - Diag << "From: " << Twine::utohexstr(LBR.From) - << " To: " << Twine::utohexstr(LBR.To) << " Mispred? " << LBR.Mispred - << "\n"; -} - void DataAggregator::dump(const PerfBranchSample &Sample) const { Diag << "Sample LBR entries: " << Sample.LBR.size() << "\n"; for (const LBREntry &LBR : Sample.LBR) - dump(LBR); + Diag << LBR << '\n'; } void DataAggregator::dump(const PerfMemSample &Sample) const { diff --git a/bolt/lib/Profile/DataReader.cpp b/bolt/lib/Profile/DataReader.cpp index c512394f26a3b..afe24216d7f5d 100644 --- a/bolt/lib/Profile/DataReader.cpp +++ b/bolt/lib/Profile/DataReader.cpp @@ -85,6 +85,7 @@ void FuncBranchData::appendFrom(const FuncBranchData &FBD, uint64_t Offset) { } llvm::stable_sort(Data); ExecutionCount += FBD.ExecutionCount; + ExternEntryCount += FBD.ExternEntryCount; for (auto I = FBD.EntryData.begin(), E = FBD.EntryData.end(); I != E; ++I) { assert(I->To.Name == FBD.Name); auto NewElmt = EntryData.insert(EntryData.end(), *I); @@ -269,6 +270,7 @@ Error DataReader::preprocessProfile(BinaryContext &BC) { if (FuncBranchData *FuncData = getBranchDataForNames(Function.getNames())) { setBranchData(Function, FuncData); Function.ExecutionCount = FuncData->ExecutionCount; + Function.ExternEntryCount = FuncData->ExternEntryCount; FuncData->Used = true; } } @@ -419,6 +421,7 @@ void DataReader::matchProfileData(BinaryFunction &BF) { if (fetchProfileForOtherEntryPoints(BF)) { BF.ProfileMatchRatio = evaluateProfileData(BF, *FBD); BF.ExecutionCount = FBD->ExecutionCount; + BF.ExternEntryCount = FBD->ExternEntryCount; BF.RawSampleCount = FBD->getNumExecutedBranches(); } return; @@ -449,6 +452,7 @@ void DataReader::matchProfileData(BinaryFunction &BF) { setBranchData(BF, NewBranchData); NewBranchData->Used = true; BF.ExecutionCount = NewBranchData->ExecutionCount; + BF.ExternEntryCount = NewBranchData->ExternEntryCount; BF.ProfileMatchRatio = 1.0f; break; } @@ -1190,6 +1194,8 @@ std::error_code DataReader::parse() { if (BI.To.IsSymbol && BI.To.Offset == 0) { I = GetOrCreateFuncEntry(BI.To.Name); I->second.ExecutionCount += BI.Branches; + if (!BI.From.IsSymbol) + I->second.ExternEntryCount += BI.Branches; } } diff --git a/bolt/lib/Profile/YAMLProfileReader.cpp b/bolt/lib/Profile/YAMLProfileReader.cpp index 33ce40ac2eeec..086e47b661e10 100644 --- a/bolt/lib/Profile/YAMLProfileReader.cpp +++ b/bolt/lib/Profile/YAMLProfileReader.cpp @@ -176,6 +176,7 @@ bool YAMLProfileReader::parseFunctionProfile( uint64_t FunctionExecutionCount = 0; BF.setExecutionCount(YamlBF.ExecCount); + BF.setExternEntryCount(YamlBF.ExternEntryCount); uint64_t FuncRawBranchCount = 0; for (const yaml::bolt::BinaryBasicBlockProfile &YamlBB : YamlBF.Blocks) diff --git a/bolt/lib/Profile/YAMLProfileWriter.cpp b/bolt/lib/Profile/YAMLProfileWriter.cpp index f1fe45f21a0f6..1632aa1c6bfe2 100644 --- a/bolt/lib/Profile/YAMLProfileWriter.cpp +++ b/bolt/lib/Profile/YAMLProfileWriter.cpp @@ -226,6 +226,7 @@ YAMLProfileWriter::convert(const BinaryFunction &BF, bool UseDFS, YamlBF.Hash = BF.getHash(); YamlBF.NumBasicBlocks = BF.size(); YamlBF.ExecCount = BF.getKnownExecutionCount(); + YamlBF.ExternEntryCount = BF.getExternEntryCount(); DenseMap InlineTreeNodeId; if (PseudoProbeDecoder && BF.getGUID()) { std::tie(YamlBF.InlineTree, InlineTreeNodeId) = @@ -303,9 +304,8 @@ YAMLProfileWriter::convert(const BinaryFunction &BF, bool UseDFS, } // Sort targets in a similar way to getBranchData, see Location::operator< llvm::sort(CSTargets, [](const auto &RHS, const auto &LHS) { - if (RHS.first != LHS.first) - return RHS.first < LHS.first; - return RHS.second.Offset < LHS.second.Offset; + return std::tie(RHS.first, RHS.second.Offset) < + std::tie(LHS.first, LHS.second.Offset); }); for (auto &KV : CSTargets) YamlBB.CallSites.push_back(KV.second); diff --git a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp index 9d5a578cfbdff..eb1d9d8a19514 100644 --- a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp +++ b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp @@ -177,7 +177,7 @@ class AArch64MCPlusBuilder : public MCPlusBuilder { return true; } - bool equals(const MCTargetExpr &A, const MCTargetExpr &B, + bool equals(const MCSpecifierExpr &A, const MCSpecifierExpr &B, CompFuncTy Comp) const override { const auto &AArch64ExprA = cast(A); const auto &AArch64ExprB = cast(B); diff --git a/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp b/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp index 581f22f2a2b75..18be125d53aeb 100644 --- a/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp +++ b/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp @@ -31,7 +31,7 @@ class RISCVMCPlusBuilder : public MCPlusBuilder { public: using MCPlusBuilder::MCPlusBuilder; - bool equals(const MCTargetExpr &A, const MCTargetExpr &B, + bool equals(const MCSpecifierExpr &A, const MCSpecifierExpr &B, CompFuncTy Comp) const override { const auto &RISCVExprA = cast(A); const auto &RISCVExprB = cast(B); diff --git a/bolt/test/AArch64/adr-relaxation.s b/bolt/test/AArch64/adr-relaxation.s index a643a62339ba3..864650c3287d8 100644 --- a/bolt/test/AArch64/adr-relaxation.s +++ b/bolt/test/AArch64/adr-relaxation.s @@ -34,7 +34,6 @@ foo: .cfi_startproc cmp x1, x11 b.hi .L2 - mov x0, #0x0 .L2: # CHECK-FOO: : # CHECK-FOO-NEXT: adrp diff --git a/bolt/test/X86/pre-aggregated-perf.test b/bolt/test/X86/pre-aggregated-perf.test index 92e093c238e00..c4f5b8f2ea445 100644 --- a/bolt/test/X86/pre-aggregated-perf.test +++ b/bolt/test/X86/pre-aggregated-perf.test @@ -36,26 +36,26 @@ RUN: llvm-bolt %t.exe -p %p/Inputs/pre-aggregated.txt --pa -o %t.null | FileChec CHECK: BOLT-INFO: 4 out of 7 functions in the binary (57.1%) have non-empty execution profile -RUN: cat %t | sort | FileCheck %s -check-prefix=PERF2BOLT -RUN: cat %t.new | FileCheck %s -check-prefix=NEWFORMAT +RUN: FileCheck %s -check-prefix=PERF2BOLT --input-file %t +RUN: FileCheck %s -check-prefix=NEWFORMAT --input-file %t.new ## Test --profile-format option with perf2bolt RUN: perf2bolt %t.exe -o %t.fdata --pa -p %p/Inputs/pre-aggregated.txt \ RUN: --profile-format=fdata -RUN: cat %t.fdata | sort | FileCheck %s -check-prefix=PERF2BOLT +RUN: FileCheck %s -check-prefix=PERF2BOLT --input-file %t.fdata RUN: perf2bolt %t.exe -o %t.yaml --pa -p %p/Inputs/pre-aggregated.txt \ RUN: --profile-format=yaml --profile-use-dfs -RUN: cat %t.yaml | FileCheck %s -check-prefix=NEWFORMAT +RUN: FileCheck %s -check-prefix=NEWFORMAT --input-file %t.yaml ## Test --profile-format option with llvm-bolt --aggregate-only RUN: llvm-bolt %t.exe -o %t.bolt.fdata --pa -p %p/Inputs/pre-aggregated.txt \ RUN: --aggregate-only --profile-format=fdata -RUN: cat %t.bolt.fdata | sort | FileCheck %s -check-prefix=PERF2BOLT +RUN: FileCheck %s -check-prefix=PERF2BOLT --input-file %t.bolt.fdata RUN: llvm-bolt %t.exe -o %t.bolt.yaml --pa -p %p/Inputs/pre-aggregated.txt \ RUN: --aggregate-only --profile-format=yaml --profile-use-dfs -RUN: cat %t.bolt.yaml | FileCheck %s -check-prefix=NEWFORMAT +RUN: FileCheck %s -check-prefix=NEWFORMAT --input-file %t.bolt.yaml ## Test pre-aggregated basic profile RUN: perf2bolt %t.exe -o %t --pa -p %p/Inputs/pre-aggregated-basic.txt -o %t.ba \ @@ -67,16 +67,17 @@ BASIC-ERROR: BOLT-INFO: 0 out of 7 functions in the binary (0.0%) have non-empty BASIC-SUCCESS: BOLT-INFO: 4 out of 7 functions in the binary (57.1%) have non-empty execution profile CHECK-BASIC-NL: no_lbr cycles -PERF2BOLT: 0 [unknown] 7f36d18d60c0 1 main 53c 0 2 -PERF2BOLT: 1 main 451 1 SolveCubic 0 0 2 -PERF2BOLT: 1 main 490 0 [unknown] 4005f0 0 1 -PERF2BOLT: 1 main 537 0 [unknown] 400610 0 1 -PERF2BOLT: 1 usqrt 30 1 usqrt 32 0 22 -PERF2BOLT: 1 usqrt 30 1 usqrt 39 4 33 -PERF2BOLT: 1 usqrt 35 1 usqrt 39 0 22 -PERF2BOLT: 1 usqrt 3d 1 usqrt 10 0 58 -PERF2BOLT: 1 usqrt 3d 1 usqrt 3f 0 22 -PERF2BOLT: 1 usqrt a 1 usqrt 10 0 22 +PERF2BOLT: 1 frame_dummy/1 1e 1 frame_dummy/1 0 0 1 +PERF2BOLT-NEXT: 1 main 451 1 SolveCubic 0 0 2 +PERF2BOLT-NEXT: 1 main 490 0 [unknown] 0 0 1 +PERF2BOLT-NEXT: 1 main 537 0 [unknown] 0 0 1 +PERF2BOLT-NEXT: 0 [unknown] 0 1 main 53c 0 2 +PERF2BOLT-NEXT: 1 usqrt a 1 usqrt 10 0 22 +PERF2BOLT-NEXT: 1 usqrt 30 1 usqrt 32 0 22 +PERF2BOLT-NEXT: 1 usqrt 30 1 usqrt 39 4 33 +PERF2BOLT-NEXT: 1 usqrt 35 1 usqrt 39 0 22 +PERF2BOLT-NEXT: 1 usqrt 3d 1 usqrt 10 0 58 +PERF2BOLT-NEXT: 1 usqrt 3d 1 usqrt 3f 0 22 NEWFORMAT: - name: 'frame_dummy/1' NEWFORMAT: fid: 3 diff --git a/bolt/test/X86/shrinkwrapping.test b/bolt/test/X86/shrinkwrapping.test index 8581d7e0c0f7b..521b4561b3ba6 100644 --- a/bolt/test/X86/shrinkwrapping.test +++ b/bolt/test/X86/shrinkwrapping.test @@ -8,6 +8,7 @@ REQUIRES: shell RUN: %clangxx %cxxflags -no-pie %S/Inputs/exc4sw.S -o %t.exe -Wl,-q RUN: llvm-bolt %t.exe -o %t --relocs --frame-opt=all \ +RUN: --print-only=main --print-cfg \ RUN: --data=%p/Inputs/exc4sw.fdata --reorder-blocks=cache 2>&1 | \ RUN: FileCheck %s --check-prefix=CHECK-BOLT @@ -19,6 +20,7 @@ RUN: llvm-objdump --dwarf=frames %t | grep -A20 -e \ RUN: `llvm-nm --numeric-sort %t | grep main | tail -n 1 | cut -f1 -d' ' | \ RUN: tail -c9` 2>&1 | FileCheck %s --check-prefix=CHECK-OUTPUT +CHECK-BOLT: Extern Entry Count: 100 CHECK-BOLT: Shrink wrapping moved 2 spills inserting load/stores and 0 spills inserting push/pops CHECK-INPUT: DW_CFA_advance_loc: 2 diff --git a/clang-tools-extra/clang-doc/BitcodeReader.cpp b/clang-tools-extra/clang-doc/BitcodeReader.cpp index 546dd0254ec01..57dd514b90a2b 100644 --- a/clang-tools-extra/clang-doc/BitcodeReader.cpp +++ b/clang-tools-extra/clang-doc/BitcodeReader.cpp @@ -315,9 +315,13 @@ static llvm::Error parseRecord(const Record &R, unsigned ID, static llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, CommentInfo *I) { + llvm::SmallString<16> KindStr; switch (ID) { case COMMENT_KIND: - return decodeRecord(R, I->Kind, Blob); + if (llvm::Error Err = decodeRecord(R, KindStr, Blob)) + return Err; + I->Kind = stringToCommentKind(KindStr); + return llvm::Error::success(); case COMMENT_TEXT: return decodeRecord(R, I->Text, Blob); case COMMENT_NAME: diff --git a/clang-tools-extra/clang-doc/BitcodeWriter.cpp b/clang-tools-extra/clang-doc/BitcodeWriter.cpp index f0a445e606bff..708ce09d9e5b2 100644 --- a/clang-tools-extra/clang-doc/BitcodeWriter.cpp +++ b/clang-tools-extra/clang-doc/BitcodeWriter.cpp @@ -484,8 +484,9 @@ void ClangDocBitcodeWriter::emitBlock(const MemberTypeInfo &T) { void ClangDocBitcodeWriter::emitBlock(const CommentInfo &I) { StreamSubBlockGuard Block(Stream, BI_COMMENT_BLOCK_ID); + // Handle Kind (enum) separately, since it is not a string. + emitRecord(commentKindToString(I.Kind), COMMENT_KIND); for (const auto &L : std::vector>{ - {I.Kind, COMMENT_KIND}, {I.Text, COMMENT_TEXT}, {I.Name, COMMENT_NAME}, {I.Direction, COMMENT_DIRECTION}, diff --git a/clang-tools-extra/clang-doc/CMakeLists.txt b/clang-tools-extra/clang-doc/CMakeLists.txt index 79563c41435eb..5989e5fe60cf3 100644 --- a/clang-tools-extra/clang-doc/CMakeLists.txt +++ b/clang-tools-extra/clang-doc/CMakeLists.txt @@ -17,6 +17,7 @@ add_clang_library(clangDoc STATIC Serialize.cpp YAMLGenerator.cpp HTMLMustacheGenerator.cpp + JSONGenerator.cpp DEPENDS omp_gen diff --git a/clang-tools-extra/clang-doc/Generators.cpp b/clang-tools-extra/clang-doc/Generators.cpp index a3c2773412cff..3fb5b63c403a7 100644 --- a/clang-tools-extra/clang-doc/Generators.cpp +++ b/clang-tools-extra/clang-doc/Generators.cpp @@ -105,5 +105,7 @@ static int LLVM_ATTRIBUTE_UNUSED HTMLGeneratorAnchorDest = HTMLGeneratorAnchorSource; static int LLVM_ATTRIBUTE_UNUSED MHTMLGeneratorAnchorDest = MHTMLGeneratorAnchorSource; +static int LLVM_ATTRIBUTE_UNUSED JSONGeneratorAnchorDest = + JSONGeneratorAnchorSource; } // namespace doc } // namespace clang diff --git a/clang-tools-extra/clang-doc/Generators.h b/clang-tools-extra/clang-doc/Generators.h index aee04b9d58d9d..92d3006e6002d 100644 --- a/clang-tools-extra/clang-doc/Generators.h +++ b/clang-tools-extra/clang-doc/Generators.h @@ -58,6 +58,7 @@ extern volatile int YAMLGeneratorAnchorSource; extern volatile int MDGeneratorAnchorSource; extern volatile int HTMLGeneratorAnchorSource; extern volatile int MHTMLGeneratorAnchorSource; +extern volatile int JSONGeneratorAnchorSource; } // namespace doc } // namespace clang diff --git a/clang-tools-extra/clang-doc/HTMLGenerator.cpp b/clang-tools-extra/clang-doc/HTMLGenerator.cpp index 93b9279462a89..7293a129177c9 100644 --- a/clang-tools-extra/clang-doc/HTMLGenerator.cpp +++ b/clang-tools-extra/clang-doc/HTMLGenerator.cpp @@ -635,7 +635,8 @@ genHTML(const Index &Index, StringRef InfoPath, bool IsOutermostList) { } static std::unique_ptr genHTML(const CommentInfo &I) { - if (I.Kind == "FullComment") { + switch (I.Kind) { + case CommentKind::CK_FullComment: { auto FullComment = std::make_unique(HTMLTag::TAG_DIV); for (const auto &Child : I.Children) { std::unique_ptr Node = genHTML(*Child); @@ -645,7 +646,7 @@ static std::unique_ptr genHTML(const CommentInfo &I) { return std::move(FullComment); } - if (I.Kind == "ParagraphComment") { + case CommentKind::CK_ParagraphComment: { auto ParagraphComment = std::make_unique(HTMLTag::TAG_P); for (const auto &Child : I.Children) { std::unique_ptr Node = genHTML(*Child); @@ -657,7 +658,7 @@ static std::unique_ptr genHTML(const CommentInfo &I) { return std::move(ParagraphComment); } - if (I.Kind == "BlockCommandComment") { + case CommentKind::CK_BlockCommandComment: { auto BlockComment = std::make_unique(HTMLTag::TAG_DIV); BlockComment->Children.emplace_back( std::make_unique(HTMLTag::TAG_DIV, I.Name)); @@ -670,12 +671,26 @@ static std::unique_ptr genHTML(const CommentInfo &I) { return nullptr; return std::move(BlockComment); } - if (I.Kind == "TextComment") { - if (I.Text == "") + + case CommentKind::CK_TextComment: { + if (I.Text.empty()) return nullptr; return std::make_unique(I.Text); } - return nullptr; + + // For now, return nullptr for unsupported comment kinds + case CommentKind::CK_InlineCommandComment: + case CommentKind::CK_HTMLStartTagComment: + case CommentKind::CK_HTMLEndTagComment: + case CommentKind::CK_ParamCommandComment: + case CommentKind::CK_TParamCommandComment: + case CommentKind::CK_VerbatimBlockComment: + case CommentKind::CK_VerbatimBlockLineComment: + case CommentKind::CK_VerbatimLineComment: + case CommentKind::CK_Unknown: + return nullptr; + } + llvm_unreachable("Unhandled CommentKind"); } static std::unique_ptr genHTML(const std::vector &C) { diff --git a/clang-tools-extra/clang-doc/HTMLMustacheGenerator.cpp b/clang-tools-extra/clang-doc/HTMLMustacheGenerator.cpp index 8b7e4896c9fde..69c670b208440 100644 --- a/clang-tools-extra/clang-doc/HTMLMustacheGenerator.cpp +++ b/clang-tools-extra/clang-doc/HTMLMustacheGenerator.cpp @@ -208,37 +208,110 @@ static json::Value extractValue(const TypedefInfo &I) { } static json::Value extractValue(const CommentInfo &I) { - assert((I.Kind == "BlockCommandComment" || I.Kind == "FullComment" || - I.Kind == "ParagraphComment" || I.Kind == "TextComment") && - "Unknown Comment type in CommentInfo."); - Object Obj = Object(); - json::Value Child = Object(); - // TextComment has no children, so return it. - if (I.Kind == "TextComment") { - Obj.insert({"TextComment", I.Text}); - return Obj; - } + json::Value ChildVal = Object(); + Object &Child = *ChildVal.getAsObject(); - // BlockCommandComment needs to generate a Command key. - if (I.Kind == "BlockCommandComment") - Child.getAsObject()->insert({"Command", I.Name}); - - // Use the same handling for everything else. - // Only valid for: - // - BlockCommandComment - // - FullComment - // - ParagraphComment json::Value ChildArr = Array(); auto &CARef = *ChildArr.getAsArray(); CARef.reserve(I.Children.size()); for (const auto &C : I.Children) CARef.emplace_back(extractValue(*C)); - Child.getAsObject()->insert({"Children", ChildArr}); - Obj.insert({I.Kind, Child}); - return Obj; + switch (I.Kind) { + case CommentKind::CK_TextComment: { + Obj.insert({commentKindToString(I.Kind), I.Text}); + return Obj; + } + + case CommentKind::CK_BlockCommandComment: { + Child.insert({"Command", I.Name}); + Child.insert({"Children", ChildArr}); + Obj.insert({commentKindToString(I.Kind), ChildVal}); + return Obj; + } + + case CommentKind::CK_InlineCommandComment: { + json::Value ArgsArr = Array(); + auto &ARef = *ArgsArr.getAsArray(); + ARef.reserve(I.Args.size()); + for (const auto &Arg : I.Args) + ARef.emplace_back(Arg); + Child.insert({"Command", I.Name}); + Child.insert({"Args", ArgsArr}); + Child.insert({"Children", ChildArr}); + Obj.insert({commentKindToString(I.Kind), ChildVal}); + return Obj; + } + + case CommentKind::CK_ParamCommandComment: + case CommentKind::CK_TParamCommandComment: { + Child.insert({"ParamName", I.ParamName}); + Child.insert({"Direction", I.Direction}); + Child.insert({"Explicit", I.Explicit}); + Child.insert({"Children", ChildArr}); + Obj.insert({commentKindToString(I.Kind), ChildVal}); + return Obj; + } + + case CommentKind::CK_VerbatimBlockComment: { + Child.insert({"Text", I.Text}); + if (!I.CloseName.empty()) + Child.insert({"CloseName", I.CloseName}); + Child.insert({"Children", ChildArr}); + Obj.insert({commentKindToString(I.Kind), ChildVal}); + return Obj; + } + + case CommentKind::CK_VerbatimBlockLineComment: + case CommentKind::CK_VerbatimLineComment: { + Child.insert({"Text", I.Text}); + Child.insert({"Children", ChildArr}); + Obj.insert({commentKindToString(I.Kind), ChildVal}); + return Obj; + } + + case CommentKind::CK_HTMLStartTagComment: { + json::Value AttrKeysArray = json::Array(); + json::Value AttrValuesArray = json::Array(); + auto &KeyArr = *AttrKeysArray.getAsArray(); + auto &ValArr = *AttrValuesArray.getAsArray(); + KeyArr.reserve(I.AttrKeys.size()); + ValArr.reserve(I.AttrValues.size()); + for (const auto &K : I.AttrKeys) + KeyArr.emplace_back(K); + for (const auto &V : I.AttrValues) + ValArr.emplace_back(V); + Child.insert({"Name", I.Name}); + Child.insert({"SelfClosing", I.SelfClosing}); + Child.insert({"AttrKeys", AttrKeysArray}); + Child.insert({"AttrValues", AttrValuesArray}); + Child.insert({"Children", ChildArr}); + Obj.insert({commentKindToString(I.Kind), ChildVal}); + return Obj; + } + + case CommentKind::CK_HTMLEndTagComment: { + Child.insert({"Name", I.Name}); + Child.insert({"Children", ChildArr}); + Obj.insert({commentKindToString(I.Kind), ChildVal}); + return Obj; + } + + case CommentKind::CK_FullComment: + case CommentKind::CK_ParagraphComment: { + Child.insert({"Children", ChildArr}); + Obj.insert({commentKindToString(I.Kind), ChildVal}); + return Obj; + } + + case CommentKind::CK_Unknown: { + Obj.insert({commentKindToString(I.Kind), I.Text}); + return Obj; + } + } + llvm_unreachable("Unknown comment kind encountered."); } static void maybeInsertLocation(std::optional Loc, @@ -255,6 +328,7 @@ static void extractDescriptionFromInfo(ArrayRef Descriptions, return; json::Value DescArr = Array(); json::Array &DescARef = *DescArr.getAsArray(); + DescARef.reserve(Descriptions.size()); for (const CommentInfo &Child : Descriptions) DescARef.emplace_back(extractValue(Child)); EnumValObj.insert({"EnumValueComments", DescArr}); @@ -270,6 +344,7 @@ static json::Value extractValue(const FunctionInfo &I, StringRef ParentInfoDir, json::Value ParamArr = Array(); json::Array &ParamARef = *ParamArr.getAsArray(); + ParamARef.reserve(I.Params.size()); for (const auto Val : enumerate(I.Params)) { json::Value V = Object(); auto &VRef = *V.getAsObject(); @@ -289,14 +364,14 @@ static json::Value extractValue(const EnumInfo &I, Object Obj = Object(); std::string EnumType = I.Scoped ? "enum class " : "enum "; EnumType += I.Name; - bool HasComment = std::any_of( - I.Members.begin(), I.Members.end(), - [](const EnumValueInfo &M) { return !M.Description.empty(); }); + bool HasComment = llvm::any_of( + I.Members, [](const EnumValueInfo &M) { return !M.Description.empty(); }); Obj.insert({"EnumName", EnumType}); Obj.insert({"HasComment", HasComment}); Obj.insert({"ID", toHex(toStringRef(I.USR))}); json::Value EnumArr = Array(); json::Array &EnumARef = *EnumArr.getAsArray(); + EnumARef.reserve(I.Members.size()); for (const EnumValueInfo &M : I.Members) { json::Value EnumValue = Object(); auto &EnumValObj = *EnumValue.getAsObject(); @@ -322,6 +397,7 @@ static void extractScopeChildren(const ScopeChildren &S, Object &Obj, const ClangDocContext &CDCtx) { json::Value NamespaceArr = Array(); json::Array &NamespaceARef = *NamespaceArr.getAsArray(); + NamespaceARef.reserve(S.Namespaces.size()); for (const Reference &Child : S.Namespaces) NamespaceARef.emplace_back(extractValue(Child, ParentInfoDir)); @@ -330,6 +406,7 @@ static void extractScopeChildren(const ScopeChildren &S, Object &Obj, json::Value RecordArr = Array(); json::Array &RecordARef = *RecordArr.getAsArray(); + RecordARef.reserve(S.Records.size()); for (const Reference &Child : S.Records) RecordARef.emplace_back(extractValue(Child, ParentInfoDir)); @@ -338,12 +415,15 @@ static void extractScopeChildren(const ScopeChildren &S, Object &Obj, json::Value FunctionArr = Array(); json::Array &FunctionARef = *FunctionArr.getAsArray(); + FunctionARef.reserve(S.Functions.size()); json::Value PublicFunctionArr = Array(); json::Array &PublicFunctionARef = *PublicFunctionArr.getAsArray(); + PublicFunctionARef.reserve(S.Functions.size()); json::Value ProtectedFunctionArr = Array(); json::Array &ProtectedFunctionARef = *ProtectedFunctionArr.getAsArray(); + ProtectedFunctionARef.reserve(S.Functions.size()); for (const FunctionInfo &Child : S.Functions) { json::Value F = extractValue(Child, ParentInfoDir, CDCtx); @@ -367,6 +447,7 @@ static void extractScopeChildren(const ScopeChildren &S, Object &Obj, json::Value EnumArr = Array(); auto &EnumARef = *EnumArr.getAsArray(); + EnumARef.reserve(S.Enums.size()); for (const EnumInfo &Child : S.Enums) EnumARef.emplace_back(extractValue(Child, CDCtx)); @@ -375,6 +456,7 @@ static void extractScopeChildren(const ScopeChildren &S, Object &Obj, json::Value TypedefArr = Array(); auto &TypedefARef = *TypedefArr.getAsArray(); + TypedefARef.reserve(S.Typedefs.size()); for (const TypedefInfo &Child : S.Typedefs) TypedefARef.emplace_back(extractValue(Child)); @@ -411,10 +493,13 @@ static json::Value extractValue(const RecordInfo &I, extractScopeChildren(I.Children, RecordValue, BasePath, CDCtx); json::Value PublicMembers = Array(); json::Array &PubMemberRef = *PublicMembers.getAsArray(); + PubMemberRef.reserve(I.Members.size()); json::Value ProtectedMembers = Array(); json::Array &ProtMemberRef = *ProtectedMembers.getAsArray(); + ProtMemberRef.reserve(I.Members.size()); json::Value PrivateMembers = Array(); json::Array &PrivMemberRef = *PrivateMembers.getAsArray(); + PrivMemberRef.reserve(I.Members.size()); for (const MemberTypeInfo &Member : I.Members) { json::Value MemberValue = Object(); auto &MVRef = *MemberValue.getAsObject(); @@ -446,20 +531,25 @@ static Error setupTemplateValue(const ClangDocContext &CDCtx, json::Value &V, auto InfoPath = I->getRelativeFilePath(""); SmallString<128> RelativePath = computeRelativePath("", InfoPath); sys::path::native(RelativePath, sys::path::Style::posix); + + auto *SSA = StylesheetArr.getAsArray(); + SSA->reserve(CDCtx.UserStylesheets.size()); for (const auto &FilePath : CDCtx.UserStylesheets) { SmallString<128> StylesheetPath = RelativePath; sys::path::append(StylesheetPath, sys::path::Style::posix, sys::path::filename(FilePath)); - StylesheetArr.getAsArray()->emplace_back(StylesheetPath); + SSA->emplace_back(StylesheetPath); } V.getAsObject()->insert({"Stylesheets", StylesheetArr}); json::Value ScriptArr = Array(); + auto *SCA = ScriptArr.getAsArray(); + SCA->reserve(CDCtx.JsScripts.size()); for (auto Script : CDCtx.JsScripts) { SmallString<128> JsPath = RelativePath; sys::path::append(JsPath, sys::path::Style::posix, sys::path::filename(Script)); - ScriptArr.getAsArray()->emplace_back(JsPath); + SCA->emplace_back(JsPath); } V.getAsObject()->insert({"Scripts", ScriptArr}); return Error::success(); diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp new file mode 100644 index 0000000000000..0f7cbafcf5135 --- /dev/null +++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp @@ -0,0 +1,542 @@ +#include "Generators.h" +#include "clang/Basic/Specifiers.h" +#include "llvm/Support/JSON.h" + +using namespace llvm; +using namespace llvm::json; + +namespace clang { +namespace doc { + +class JSONGenerator : public Generator { +public: + static const char *Format; + + Error generateDocs(StringRef RootDir, + llvm::StringMap> Infos, + const ClangDocContext &CDCtx) override; + Error createResources(ClangDocContext &CDCtx) override; + Error generateDocForInfo(Info *I, llvm::raw_ostream &OS, + const ClangDocContext &CDCtx) override; +}; + +const char *JSONGenerator::Format = "json"; + +static void serializeInfo(const TypedefInfo &I, json::Object &Obj, + std::optional RepositoryUrl); +static void serializeInfo(const EnumInfo &I, json::Object &Obj, + std::optional RepositoryUrl); + +static json::Object serializeLocation(const Location &Loc, + std::optional RepositoryUrl) { + Object LocationObj = Object(); + LocationObj["LineNumber"] = Loc.StartLineNumber; + LocationObj["Filename"] = Loc.Filename; + + if (!Loc.IsFileInRootDir || !RepositoryUrl) + return LocationObj; + SmallString<128> FileURL(*RepositoryUrl); + sys::path::append(FileURL, sys::path::Style::posix, Loc.Filename); + FileURL += "#" + std::to_string(Loc.StartLineNumber); + LocationObj["FileURL"] = FileURL; + return LocationObj; +} + +static json::Value serializeComment(const CommentInfo &I) { + // taken from PR #142273 + Object Obj = Object(); + + json::Value ChildVal = Object(); + Object &Child = *ChildVal.getAsObject(); + + json::Value ChildArr = Array(); + auto &CARef = *ChildArr.getAsArray(); + CARef.reserve(I.Children.size()); + for (const auto &C : I.Children) + CARef.emplace_back(serializeComment(*C)); + + switch (I.Kind) { + case CommentKind::CK_TextComment: { + Obj.insert({commentKindToString(I.Kind), I.Text}); + return Obj; + } + + case CommentKind::CK_BlockCommandComment: { + Child.insert({"Command", I.Name}); + Child.insert({"Children", ChildArr}); + Obj.insert({commentKindToString(I.Kind), ChildVal}); + return Obj; + } + + case CommentKind::CK_InlineCommandComment: { + json::Value ArgsArr = Array(); + auto &ARef = *ArgsArr.getAsArray(); + ARef.reserve(I.Args.size()); + for (const auto &Arg : I.Args) + ARef.emplace_back(Arg); + Child.insert({"Command", I.Name}); + Child.insert({"Args", ArgsArr}); + Child.insert({"Children", ChildArr}); + Obj.insert({commentKindToString(I.Kind), ChildVal}); + return Obj; + } + + case CommentKind::CK_ParamCommandComment: + case CommentKind::CK_TParamCommandComment: { + Child.insert({"ParamName", I.ParamName}); + Child.insert({"Direction", I.Direction}); + Child.insert({"Explicit", I.Explicit}); + Child.insert({"Children", ChildArr}); + Obj.insert({commentKindToString(I.Kind), ChildVal}); + return Obj; + } + + case CommentKind::CK_VerbatimBlockComment: { + Child.insert({"Text", I.Text}); + if (!I.CloseName.empty()) + Child.insert({"CloseName", I.CloseName}); + Child.insert({"Children", ChildArr}); + Obj.insert({commentKindToString(I.Kind), ChildVal}); + return Obj; + } + + case CommentKind::CK_VerbatimBlockLineComment: + case CommentKind::CK_VerbatimLineComment: { + Child.insert({"Text", I.Text}); + Child.insert({"Children", ChildArr}); + Obj.insert({commentKindToString(I.Kind), ChildVal}); + return Obj; + } + + case CommentKind::CK_HTMLStartTagComment: { + json::Value AttrKeysArray = json::Array(); + json::Value AttrValuesArray = json::Array(); + auto &KeyArr = *AttrKeysArray.getAsArray(); + auto &ValArr = *AttrValuesArray.getAsArray(); + KeyArr.reserve(I.AttrKeys.size()); + ValArr.reserve(I.AttrValues.size()); + for (const auto &K : I.AttrKeys) + KeyArr.emplace_back(K); + for (const auto &V : I.AttrValues) + ValArr.emplace_back(V); + Child.insert({"Name", I.Name}); + Child.insert({"SelfClosing", I.SelfClosing}); + Child.insert({"AttrKeys", AttrKeysArray}); + Child.insert({"AttrValues", AttrValuesArray}); + Child.insert({"Children", ChildArr}); + Obj.insert({commentKindToString(I.Kind), ChildVal}); + return Obj; + } + + case CommentKind::CK_HTMLEndTagComment: { + Child.insert({"Name", I.Name}); + Child.insert({"Children", ChildArr}); + Obj.insert({commentKindToString(I.Kind), ChildVal}); + return Obj; + } + + case CommentKind::CK_FullComment: + case CommentKind::CK_ParagraphComment: { + Child.insert({"Children", ChildArr}); + Obj.insert({commentKindToString(I.Kind), ChildVal}); + return Obj; + } + + case CommentKind::CK_Unknown: { + Obj.insert({commentKindToString(I.Kind), I.Text}); + return Obj; + } + } + llvm_unreachable("Unknown comment kind encountered."); +} + +static void serializeCommonAttributes(const Info &I, json::Object &Obj, + std::optional RepositoryUrl) { + Obj["Name"] = I.Name; + Obj["USR"] = toHex(toStringRef(I.USR)); + + if (!I.Path.empty()) + Obj["Path"] = I.Path; + + if (!I.Namespace.empty()) { + Obj["Namespace"] = json::Array(); + for (const auto &NS : I.Namespace) + Obj["Namespace"].getAsArray()->push_back(NS.Name); + } + + if (!I.Description.empty()) { + json::Value DescArray = json::Array(); + auto &DescArrayRef = *DescArray.getAsArray(); + DescArrayRef.reserve(I.Description.size()); + for (const auto &Comment : I.Description) + DescArrayRef.push_back(serializeComment(Comment)); + Obj["Description"] = DescArray; + } + + // Namespaces aren't SymbolInfos, so they dont have a DefLoc + if (I.IT != InfoType::IT_namespace) { + const auto *Symbol = static_cast(&I); + if (Symbol->DefLoc) + Obj["Location"] = + serializeLocation(Symbol->DefLoc.value(), RepositoryUrl); + } +} + +static void serializeReference(const Reference &Ref, Object &ReferenceObj) { + ReferenceObj["Path"] = Ref.Path; + ReferenceObj["Name"] = Ref.Name; + ReferenceObj["QualName"] = Ref.QualName; + ReferenceObj["USR"] = toHex(toStringRef(Ref.USR)); +} + +static void serializeReference(const SmallVector &References, + Object &Obj, std::string Key) { + json::Value ReferencesArray = Array(); + json::Array &ReferencesArrayRef = *ReferencesArray.getAsArray(); + ReferencesArrayRef.reserve(References.size()); + for (const auto &Reference : References) { + json::Value ReferenceVal = Object(); + auto &ReferenceObj = *ReferenceVal.getAsObject(); + serializeReference(Reference, ReferenceObj); + ReferencesArrayRef.push_back(ReferenceVal); + } + Obj[Key] = ReferencesArray; +} + +// Although namespaces and records both have ScopeChildren, they serialize them +// differently. Only enums, records, and typedefs are handled here. +static void serializeCommonChildren(const ScopeChildren &Children, + json::Object &Obj, + std::optional RepositoryUrl) { + if (!Children.Enums.empty()) { + json::Value EnumsArray = Array(); + auto &EnumsArrayRef = *EnumsArray.getAsArray(); + EnumsArrayRef.reserve(Children.Enums.size()); + for (const auto &Enum : Children.Enums) { + json::Value EnumVal = Object(); + auto &EnumObj = *EnumVal.getAsObject(); + serializeInfo(Enum, EnumObj, RepositoryUrl); + EnumsArrayRef.push_back(EnumVal); + } + Obj["Enums"] = EnumsArray; + } + + if (!Children.Typedefs.empty()) { + json::Value TypedefsArray = Array(); + auto &TypedefsArrayRef = *TypedefsArray.getAsArray(); + TypedefsArrayRef.reserve(Children.Typedefs.size()); + for (const auto &Typedef : Children.Typedefs) { + json::Value TypedefVal = Object(); + auto &TypedefObj = *TypedefVal.getAsObject(); + serializeInfo(Typedef, TypedefObj, RepositoryUrl); + TypedefsArrayRef.push_back(TypedefVal); + } + Obj["Typedefs"] = TypedefsArray; + } + + if (!Children.Records.empty()) { + json::Value RecordsArray = Array(); + auto &RecordsArrayRef = *RecordsArray.getAsArray(); + RecordsArrayRef.reserve(Children.Records.size()); + for (const auto &Record : Children.Records) { + json::Value RecordVal = Object(); + auto &RecordObj = *RecordVal.getAsObject(); + serializeReference(Record, RecordObj); + RecordsArrayRef.push_back(RecordVal); + } + Obj["Records"] = RecordsArray; + } +} + +static void serializeInfo(const TemplateInfo &Template, Object &Obj) { + json::Value TemplateVal = Object(); + auto &TemplateObj = *TemplateVal.getAsObject(); + + if (Template.Specialization) { + json::Value TemplateSpecializationVal = Object(); + auto &TemplateSpecializationObj = *TemplateSpecializationVal.getAsObject(); + TemplateSpecializationObj["SpecializationOf"] = + toHex(toStringRef(Template.Specialization->SpecializationOf)); + if (!Template.Specialization->Params.empty()) { + json::Value ParamsArray = Array(); + auto &ParamsArrayRef = *ParamsArray.getAsArray(); + ParamsArrayRef.reserve(Template.Specialization->Params.size()); + for (const auto &Param : Template.Specialization->Params) + ParamsArrayRef.push_back(Param.Contents); + TemplateSpecializationObj["Parameters"] = ParamsArray; + } + TemplateObj["Specialization"] = TemplateSpecializationVal; + } + + if (!Template.Params.empty()) { + json::Value ParamsArray = Array(); + auto &ParamsArrayRef = *ParamsArray.getAsArray(); + ParamsArrayRef.reserve(Template.Params.size()); + for (const auto &Param : Template.Params) + ParamsArrayRef.push_back(Param.Contents); + TemplateObj["Parameters"] = ParamsArray; + } + + Obj["Template"] = TemplateVal; +} + +static void serializeInfo(const TypeInfo &I, Object &Obj) { + Obj["Name"] = I.Type.Name; + Obj["QualName"] = I.Type.QualName; + Obj["USR"] = toHex(toStringRef(I.Type.USR)); + Obj["IsTemplate"] = I.IsTemplate; + Obj["IsBuiltIn"] = I.IsBuiltIn; +} + +static void serializeInfo(const FunctionInfo &F, json::Object &Obj, + std::optional RepositoryURL) { + serializeCommonAttributes(F, Obj, RepositoryURL); + Obj["IsStatic"] = F.IsStatic; + + auto ReturnTypeObj = Object(); + serializeInfo(F.ReturnType, ReturnTypeObj); + Obj["ReturnType"] = std::move(ReturnTypeObj); + + if (!F.Params.empty()) { + json::Value ParamsArray = json::Array(); + auto &ParamsArrayRef = *ParamsArray.getAsArray(); + ParamsArrayRef.reserve(F.Params.size()); + for (const auto &Param : F.Params) { + json::Value ParamVal = Object(); + auto &ParamObj = *ParamVal.getAsObject(); + ParamObj["Name"] = Param.Name; + ParamObj["Type"] = Param.Type.Name; + ParamsArrayRef.push_back(ParamVal); + } + Obj["Params"] = ParamsArray; + } + + if (F.Template) + serializeInfo(F.Template.value(), Obj); +} + +static void serializeInfo(const EnumInfo &I, json::Object &Obj, + std::optional RepositoryUrl) { + serializeCommonAttributes(I, Obj, RepositoryUrl); + Obj["Scoped"] = I.Scoped; + + if (I.BaseType) { + json::Value BaseTypeVal = Object(); + auto &BaseTypeObj = *BaseTypeVal.getAsObject(); + BaseTypeObj["Name"] = I.BaseType->Type.Name; + BaseTypeObj["QualName"] = I.BaseType->Type.QualName; + BaseTypeObj["USR"] = toHex(toStringRef(I.BaseType->Type.USR)); + Obj["BaseType"] = BaseTypeVal; + } + + if (!I.Members.empty()) { + json::Value MembersArray = Array(); + auto &MembersArrayRef = *MembersArray.getAsArray(); + MembersArrayRef.reserve(I.Members.size()); + for (const auto &Member : I.Members) { + json::Value MemberVal = Object(); + auto &MemberObj = *MemberVal.getAsObject(); + MemberObj["Name"] = Member.Name; + if (!Member.ValueExpr.empty()) + MemberObj["ValueExpr"] = Member.ValueExpr; + else + MemberObj["Value"] = Member.Value; + MembersArrayRef.push_back(MemberVal); + } + Obj["Members"] = MembersArray; + } +} + +static void serializeInfo(const TypedefInfo &I, json::Object &Obj, + std::optional RepositoryUrl) { + serializeCommonAttributes(I, Obj, RepositoryUrl); + Obj["TypeDeclaration"] = I.TypeDeclaration; + Obj["IsUsing"] = I.IsUsing; + json::Value TypeVal = Object(); + auto &TypeObj = *TypeVal.getAsObject(); + serializeInfo(I.Underlying, TypeObj); + Obj["Underlying"] = TypeVal; +} + +static void serializeInfo(const RecordInfo &I, json::Object &Obj, + std::optional RepositoryUrl) { + serializeCommonAttributes(I, Obj, RepositoryUrl); + Obj["FullName"] = I.FullName; + Obj["TagType"] = getTagType(I.TagType); + Obj["IsTypedef"] = I.IsTypeDef; + + if (!I.Children.Functions.empty()) { + json::Value PubFunctionsArray = Array(); + json::Array &PubFunctionsArrayRef = *PubFunctionsArray.getAsArray(); + json::Value ProtFunctionsArray = Array(); + json::Array &ProtFunctionsArrayRef = *ProtFunctionsArray.getAsArray(); + + for (const auto &Function : I.Children.Functions) { + json::Value FunctionVal = Object(); + auto &FunctionObj = *FunctionVal.getAsObject(); + serializeInfo(Function, FunctionObj, RepositoryUrl); + AccessSpecifier Access = Function.Access; + if (Access == AccessSpecifier::AS_public) + PubFunctionsArrayRef.push_back(FunctionVal); + else if (Access == AccessSpecifier::AS_protected) + ProtFunctionsArrayRef.push_back(FunctionVal); + } + + if (!PubFunctionsArrayRef.empty()) + Obj["PublicFunctions"] = PubFunctionsArray; + if (!ProtFunctionsArrayRef.empty()) + Obj["ProtectedFunctions"] = ProtFunctionsArray; + } + + if (!I.Members.empty()) { + json::Value PublicMembersArray = Array(); + json::Array &PubMembersArrayRef = *PublicMembersArray.getAsArray(); + json::Value ProtectedMembersArray = Array(); + json::Array &ProtMembersArrayRef = *ProtectedMembersArray.getAsArray(); + + for (const MemberTypeInfo &Member : I.Members) { + json::Value MemberVal = Object(); + auto &MemberObj = *MemberVal.getAsObject(); + MemberObj["Name"] = Member.Name; + MemberObj["Type"] = Member.Type.Name; + + if (Member.Access == AccessSpecifier::AS_public) + PubMembersArrayRef.push_back(MemberVal); + else if (Member.Access == AccessSpecifier::AS_protected) + ProtMembersArrayRef.push_back(MemberVal); + } + + if (!PubMembersArrayRef.empty()) + Obj["PublicMembers"] = PublicMembersArray; + if (!ProtMembersArrayRef.empty()) + Obj["ProtectedMembers"] = ProtectedMembersArray; + } + + if (!I.Bases.empty()) { + json::Value BasesArray = Array(); + json::Array &BasesArrayRef = *BasesArray.getAsArray(); + BasesArrayRef.reserve(I.Bases.size()); + for (const auto &BaseInfo : I.Bases) { + json::Value BaseInfoVal = Object(); + auto &BaseInfoObj = *BaseInfoVal.getAsObject(); + serializeInfo(BaseInfo, BaseInfoObj, RepositoryUrl); + BaseInfoObj["IsVirtual"] = BaseInfo.IsVirtual; + BaseInfoObj["Access"] = getAccessSpelling(BaseInfo.Access); + BaseInfoObj["IsParent"] = BaseInfo.IsParent; + BasesArrayRef.push_back(BaseInfoVal); + } + Obj["Bases"] = BasesArray; + } + + if (!I.Parents.empty()) + serializeReference(I.Parents, Obj, "Parents"); + + if (!I.VirtualParents.empty()) + serializeReference(I.VirtualParents, Obj, "VirtualParents"); + + if (I.Template) + serializeInfo(I.Template.value(), Obj); + + serializeCommonChildren(I.Children, Obj, RepositoryUrl); +} + +static void serializeInfo(const NamespaceInfo &I, json::Object &Obj, + std::optional RepositoryUrl) { + serializeCommonAttributes(I, Obj, RepositoryUrl); + + if (!I.Children.Namespaces.empty()) { + json::Value NamespacesArray = Array(); + auto &NamespacesArrayRef = *NamespacesArray.getAsArray(); + NamespacesArrayRef.reserve(I.Children.Namespaces.size()); + for (auto &Namespace : I.Children.Namespaces) { + json::Value NamespaceVal = Object(); + auto &NamespaceObj = *NamespaceVal.getAsObject(); + serializeReference(Namespace, NamespaceObj); + NamespacesArrayRef.push_back(NamespaceVal); + } + Obj["Namespaces"] = NamespacesArray; + } + + if (!I.Children.Functions.empty()) { + json::Value FunctionsArray = Array(); + auto &FunctionsArrayRef = *FunctionsArray.getAsArray(); + FunctionsArrayRef.reserve(I.Children.Functions.size()); + for (const auto &Function : I.Children.Functions) { + json::Value FunctionVal = Object(); + auto &FunctionObj = *FunctionVal.getAsObject(); + serializeInfo(Function, FunctionObj, RepositoryUrl); + FunctionsArrayRef.push_back(FunctionVal); + } + Obj["Functions"] = FunctionsArray; + } + + serializeCommonChildren(I.Children, Obj, RepositoryUrl); +} + +Error JSONGenerator::generateDocs( + StringRef RootDir, llvm::StringMap> Infos, + const ClangDocContext &CDCtx) { + StringSet<> CreatedDirs; + StringMap> FileToInfos; + for (const auto &Group : Infos) { + Info *Info = Group.getValue().get(); + + SmallString<128> Path; + sys::path::native(RootDir, Path); + sys::path::append(Path, Info->getRelativeFilePath("")); + if (!CreatedDirs.contains(Path)) { + if (std::error_code Err = sys::fs::create_directories(Path); + Err != std::error_code()) + return createFileError(Twine(Path), Err); + CreatedDirs.insert(Path); + } + + sys::path::append(Path, Info->getFileBaseName() + ".json"); + FileToInfos[Path].push_back(Info); + } + + for (const auto &Group : FileToInfos) { + std::error_code FileErr; + raw_fd_ostream InfoOS(Group.getKey(), FileErr, sys::fs::OF_Text); + if (FileErr) + return createFileError("cannot open file " + Group.getKey(), FileErr); + + for (const auto &Info : Group.getValue()) + if (Error Err = generateDocForInfo(Info, InfoOS, CDCtx)) + return Err; + } + + return Error::success(); +} + +Error JSONGenerator::generateDocForInfo(Info *I, raw_ostream &OS, + const ClangDocContext &CDCtx) { + json::Object Obj = Object(); + + switch (I->IT) { + case InfoType::IT_namespace: + serializeInfo(*static_cast(I), Obj, CDCtx.RepositoryUrl); + break; + case InfoType::IT_record: + serializeInfo(*static_cast(I), Obj, CDCtx.RepositoryUrl); + break; + case InfoType::IT_enum: + case InfoType::IT_function: + case InfoType::IT_typedef: + break; + case InfoType::IT_default: + return createStringError(inconvertibleErrorCode(), "unexpected info type"); + } + OS << llvm::formatv("{0:2}", llvm::json::Value(std::move(Obj))); + return Error::success(); +} + +Error JSONGenerator::createResources(ClangDocContext &CDCtx) { + return Error::success(); +} + +static GeneratorRegistry::Add JSON(JSONGenerator::Format, + "Generator for JSON output."); +volatile int JSONGeneratorAnchorSource = 0; +} // namespace doc +} // namespace clang diff --git a/clang-tools-extra/clang-doc/MDGenerator.cpp b/clang-tools-extra/clang-doc/MDGenerator.cpp index ccd6175c96cb8..2becccf8b07da 100644 --- a/clang-tools-extra/clang-doc/MDGenerator.cpp +++ b/clang-tools-extra/clang-doc/MDGenerator.cpp @@ -75,39 +75,49 @@ static void maybeWriteSourceFileRef(llvm::raw_ostream &OS, } static void writeDescription(const CommentInfo &I, raw_ostream &OS) { - if (I.Kind == "FullComment") { + switch (I.Kind) { + case CommentKind::CK_FullComment: for (const auto &Child : I.Children) writeDescription(*Child, OS); - } else if (I.Kind == "ParagraphComment") { + break; + + case CommentKind::CK_ParagraphComment: for (const auto &Child : I.Children) writeDescription(*Child, OS); writeNewLine(OS); - } else if (I.Kind == "BlockCommandComment") { + break; + + case CommentKind::CK_BlockCommandComment: OS << genEmphasis(I.Name); for (const auto &Child : I.Children) writeDescription(*Child, OS); - } else if (I.Kind == "InlineCommandComment") { + break; + + case CommentKind::CK_InlineCommandComment: OS << genEmphasis(I.Name) << " " << I.Text; - } else if (I.Kind == "ParamCommandComment") { - std::string Direction = I.Explicit ? (" " + I.Direction).str() : ""; - OS << genEmphasis(I.ParamName) << I.Text << Direction; - for (const auto &Child : I.Children) - writeDescription(*Child, OS); - } else if (I.Kind == "TParamCommandComment") { + break; + + case CommentKind::CK_ParamCommandComment: + case CommentKind::CK_TParamCommandComment: { std::string Direction = I.Explicit ? (" " + I.Direction).str() : ""; OS << genEmphasis(I.ParamName) << I.Text << Direction; for (const auto &Child : I.Children) writeDescription(*Child, OS); - } else if (I.Kind == "VerbatimBlockComment") { + break; + } + + case CommentKind::CK_VerbatimBlockComment: for (const auto &Child : I.Children) writeDescription(*Child, OS); - } else if (I.Kind == "VerbatimBlockLineComment") { - OS << I.Text; - writeNewLine(OS); - } else if (I.Kind == "VerbatimLineComment") { + break; + + case CommentKind::CK_VerbatimBlockLineComment: + case CommentKind::CK_VerbatimLineComment: OS << I.Text; writeNewLine(OS); - } else if (I.Kind == "HTMLStartTagComment") { + break; + + case CommentKind::CK_HTMLStartTagComment: { if (I.AttrKeys.size() != I.AttrValues.size()) return; std::string Buffer; @@ -117,12 +127,20 @@ static void writeDescription(const CommentInfo &I, raw_ostream &OS) { std::string CloseTag = I.SelfClosing ? "/>" : ">"; writeLine("<" + I.Name + Attrs.str() + CloseTag, OS); - } else if (I.Kind == "HTMLEndTagComment") { + break; + } + + case CommentKind::CK_HTMLEndTagComment: writeLine("", OS); - } else if (I.Kind == "TextComment") { + break; + + case CommentKind::CK_TextComment: OS << I.Text; - } else { - OS << "Unknown comment kind: " << I.Kind << ".\n\n"; + break; + + case CommentKind::CK_Unknown: + OS << "Unknown comment kind: " << static_cast(I.Kind) << ".\n\n"; + break; } } diff --git a/clang-tools-extra/clang-doc/Representation.cpp b/clang-tools-extra/clang-doc/Representation.cpp index ad93ed66b86a1..3ce930c6965db 100644 --- a/clang-tools-extra/clang-doc/Representation.cpp +++ b/clang-tools-extra/clang-doc/Representation.cpp @@ -20,12 +20,68 @@ // //===----------------------------------------------------------------------===// #include "Representation.h" +#include "llvm/ADT/StringMap.h" #include "llvm/Support/Error.h" #include "llvm/Support/Path.h" namespace clang { namespace doc { +CommentKind stringToCommentKind(llvm::StringRef KindStr) { + static const llvm::StringMap KindMap = { + {"FullComment", CommentKind::CK_FullComment}, + {"ParagraphComment", CommentKind::CK_ParagraphComment}, + {"TextComment", CommentKind::CK_TextComment}, + {"InlineCommandComment", CommentKind::CK_InlineCommandComment}, + {"HTMLStartTagComment", CommentKind::CK_HTMLStartTagComment}, + {"HTMLEndTagComment", CommentKind::CK_HTMLEndTagComment}, + {"BlockCommandComment", CommentKind::CK_BlockCommandComment}, + {"ParamCommandComment", CommentKind::CK_ParamCommandComment}, + {"TParamCommandComment", CommentKind::CK_TParamCommandComment}, + {"VerbatimBlockComment", CommentKind::CK_VerbatimBlockComment}, + {"VerbatimBlockLineComment", CommentKind::CK_VerbatimBlockLineComment}, + {"VerbatimLineComment", CommentKind::CK_VerbatimLineComment}, + }; + + auto It = KindMap.find(KindStr); + if (It != KindMap.end()) { + return It->second; + } + return CommentKind::CK_Unknown; +} + +llvm::StringRef commentKindToString(CommentKind Kind) { + switch (Kind) { + case CommentKind::CK_FullComment: + return "FullComment"; + case CommentKind::CK_ParagraphComment: + return "ParagraphComment"; + case CommentKind::CK_TextComment: + return "TextComment"; + case CommentKind::CK_InlineCommandComment: + return "InlineCommandComment"; + case CommentKind::CK_HTMLStartTagComment: + return "HTMLStartTagComment"; + case CommentKind::CK_HTMLEndTagComment: + return "HTMLEndTagComment"; + case CommentKind::CK_BlockCommandComment: + return "BlockCommandComment"; + case CommentKind::CK_ParamCommandComment: + return "ParamCommandComment"; + case CommentKind::CK_TParamCommandComment: + return "TParamCommandComment"; + case CommentKind::CK_VerbatimBlockComment: + return "VerbatimBlockComment"; + case CommentKind::CK_VerbatimBlockLineComment: + return "VerbatimBlockLineComment"; + case CommentKind::CK_VerbatimLineComment: + return "VerbatimLineComment"; + case CommentKind::CK_Unknown: + return "Unknown"; + } + llvm_unreachable("Unhandled CommentKind"); +} + namespace { const SymbolID EmptySID = SymbolID(); diff --git a/clang-tools-extra/clang-doc/Representation.h b/clang-tools-extra/clang-doc/Representation.h index 0dbf73452fed6..75da500645819 100644 --- a/clang-tools-extra/clang-doc/Representation.h +++ b/clang-tools-extra/clang-doc/Representation.h @@ -45,6 +45,25 @@ enum class InfoType { IT_typedef }; +enum class CommentKind { + CK_FullComment, + CK_ParagraphComment, + CK_TextComment, + CK_InlineCommandComment, + CK_HTMLStartTagComment, + CK_HTMLEndTagComment, + CK_BlockCommandComment, + CK_ParamCommandComment, + CK_TParamCommandComment, + CK_VerbatimBlockComment, + CK_VerbatimBlockLineComment, + CK_VerbatimLineComment, + CK_Unknown +}; + +CommentKind stringToCommentKind(llvm::StringRef KindStr); +llvm::StringRef commentKindToString(CommentKind Kind); + // A representation of a parsed comment. struct CommentInfo { CommentInfo() = default; @@ -60,13 +79,13 @@ struct CommentInfo { // the vector. bool operator<(const CommentInfo &Other) const; - // TODO: The Kind field should be an enum, so we can switch on it easily. - SmallString<16> - Kind; // Kind of comment (FullComment, ParagraphComment, TextComment, - // InlineCommandComment, HTMLStartTagComment, HTMLEndTagComment, - // BlockCommandComment, ParamCommandComment, - // TParamCommandComment, VerbatimBlockComment, - // VerbatimBlockLineComment, VerbatimLineComment). + CommentKind Kind = CommentKind:: + CK_Unknown; // Kind of comment (FullComment, ParagraphComment, + // TextComment, InlineCommandComment, HTMLStartTagComment, + // HTMLEndTagComment, BlockCommandComment, + // ParamCommandComment, TParamCommandComment, + // VerbatimBlockComment, VerbatimBlockLineComment, + // VerbatimLineComment). SmallString<64> Text; // Text of the comment. SmallString<16> Name; // Name of the comment (for Verbatim and HTML). SmallString<8> Direction; // Parameter direction (for (T)ParamCommand). diff --git a/clang-tools-extra/clang-doc/Serialize.cpp b/clang-tools-extra/clang-doc/Serialize.cpp index 3932a939de973..3cda38115ff7f 100644 --- a/clang-tools-extra/clang-doc/Serialize.cpp +++ b/clang-tools-extra/clang-doc/Serialize.cpp @@ -270,7 +270,7 @@ class ClangDocCommentVisitor }; void ClangDocCommentVisitor::parseComment(const comments::Comment *C) { - CurrentCI.Kind = C->getCommentKindName(); + CurrentCI.Kind = stringToCommentKind(C->getCommentKindName()); ConstCommentVisitor::visit(C); for (comments::Comment *Child : llvm::make_range(C->child_begin(), C->child_end())) { @@ -742,6 +742,7 @@ static void populateFunctionInfo(FunctionInfo &I, const FunctionDecl *D, I.ReturnType = getTypeInfoForType(D->getReturnType(), LO); I.Prototype = getFunctionPrototype(D); parseParameters(I, D); + I.IsStatic = D->isStatic(); populateTemplateParameters(I.Template, D); diff --git a/clang-tools-extra/clang-doc/YAMLGenerator.cpp b/clang-tools-extra/clang-doc/YAMLGenerator.cpp index 8c110b34e8e20..897b5d5ae4c98 100644 --- a/clang-tools-extra/clang-doc/YAMLGenerator.cpp +++ b/clang-tools-extra/clang-doc/YAMLGenerator.cpp @@ -65,6 +65,34 @@ template <> struct ScalarEnumerationTraits { } }; +template <> struct ScalarEnumerationTraits { + static void enumeration(IO &IO, clang::doc::CommentKind &Value) { + IO.enumCase(Value, "FullComment", clang::doc::CommentKind::CK_FullComment); + IO.enumCase(Value, "ParagraphComment", + clang::doc::CommentKind::CK_ParagraphComment); + IO.enumCase(Value, "TextComment", clang::doc::CommentKind::CK_TextComment); + IO.enumCase(Value, "InlineCommandComment", + clang::doc::CommentKind::CK_InlineCommandComment); + IO.enumCase(Value, "HTMLStartTagComment", + clang::doc::CommentKind::CK_HTMLStartTagComment); + IO.enumCase(Value, "HTMLEndTagComment", + clang::doc::CommentKind::CK_HTMLEndTagComment); + IO.enumCase(Value, "BlockCommandComment", + clang::doc::CommentKind::CK_BlockCommandComment); + IO.enumCase(Value, "ParamCommandComment", + clang::doc::CommentKind::CK_ParamCommandComment); + IO.enumCase(Value, "TParamCommandComment", + clang::doc::CommentKind::CK_TParamCommandComment); + IO.enumCase(Value, "VerbatimBlockComment", + clang::doc::CommentKind::CK_VerbatimBlockComment); + IO.enumCase(Value, "VerbatimBlockLineComment", + clang::doc::CommentKind::CK_VerbatimBlockLineComment); + IO.enumCase(Value, "VerbatimLineComment", + clang::doc::CommentKind::CK_VerbatimLineComment); + IO.enumCase(Value, "Unknown", clang::doc::CommentKind::CK_Unknown); + } +}; + // Scalars to YAML output. template struct ScalarTraits> { @@ -149,7 +177,7 @@ static void recordInfoMapping(IO &IO, RecordInfo &I) { } static void commentInfoMapping(IO &IO, CommentInfo &I) { - IO.mapOptional("Kind", I.Kind, SmallString<16>()); + IO.mapOptional("Kind", I.Kind, CommentKind::CK_Unknown); IO.mapOptional("Text", I.Text, SmallString<64>()); IO.mapOptional("Name", I.Name, SmallString<16>()); IO.mapOptional("Direction", I.Direction, SmallString<8>()); diff --git a/clang-tools-extra/clang-doc/assets/namespace-template.mustache b/clang-tools-extra/clang-doc/assets/namespace-template.mustache index 12dc93069d1cf..1a44ed3c3cccd 100644 --- a/clang-tools-extra/clang-doc/assets/namespace-template.mustache +++ b/clang-tools-extra/clang-doc/assets/namespace-template.mustache @@ -23,23 +23,79 @@
- Content + {{#Enums}} +
+

Enumerations

+
+ {{#Obj}} + {{>EnumPartial}} + {{/Obj}} +
+
+ {{/Enums}} + {{#Record}} +
+

Inner Classes

+ +
+ {{/Record}}
diff --git a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp index 0d2415c619217..3bb67baf65739 100644 --- a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp +++ b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp @@ -110,7 +110,7 @@ Turn on time profiler. Generates clang-doc-tracing.json)"), llvm::cl::init(false), llvm::cl::cat(ClangDocCategory)); -enum OutputFormatTy { md, yaml, html, mustache }; +enum OutputFormatTy { md, yaml, html, mustache, json }; static llvm::cl::opt FormatEnum( "format", llvm::cl::desc("Format for outputted docs."), @@ -121,7 +121,9 @@ static llvm::cl::opt FormatEnum( clEnumValN(OutputFormatTy::html, "html", "Documentation in HTML format."), clEnumValN(OutputFormatTy::mustache, "mustache", - "Documentation in mustache HTML format")), + "Documentation in mustache HTML format"), + clEnumValN(OutputFormatTy::json, "json", + "Documentation in JSON format")), llvm::cl::init(OutputFormatTy::yaml), llvm::cl::cat(ClangDocCategory)); static llvm::ExitOnError ExitOnErr; @@ -136,6 +138,8 @@ static std::string getFormatString() { return "html"; case OutputFormatTy::mustache: return "mustache"; + case OutputFormatTy::json: + return "json"; } llvm_unreachable("Unknown OutputFormatTy"); } @@ -267,7 +271,8 @@ static llvm::Error handleMappingFailures(llvm::Error Err) { static llvm::Error createDirectories(llvm::StringRef OutDirectory) { if (std::error_code Err = llvm::sys::fs::create_directories(OutDirectory)) - return llvm::createFileError(OutDirectory, Err); + return llvm::createFileError(OutDirectory, Err, + "failed to create directory."); return llvm::Error::success(); } diff --git a/clang-tools-extra/clang-include-fixer/tool/ClangIncludeFixer.cpp b/clang-tools-extra/clang-include-fixer/tool/ClangIncludeFixer.cpp index 746ba7bcea015..9f73f47998056 100644 --- a/clang-tools-extra/clang-include-fixer/tool/ClangIncludeFixer.cpp +++ b/clang-tools-extra/clang-include-fixer/tool/ClangIncludeFixer.cpp @@ -167,13 +167,11 @@ createSymbolIndexManager(StringRef FilePath) { // Parse input and fill the database with it. // =
<, header...> // Multiple symbols can be given, separated by semicolons. - std::map> SymbolsMap; SmallVector SemicolonSplits; StringRef(Input).split(SemicolonSplits, ";"); std::vector Symbols; for (StringRef Pair : SemicolonSplits) { auto Split = Pair.split('='); - std::vector Headers; SmallVector CommaSplits; Split.second.split(CommaSplits, ","); for (size_t I = 0, E = CommaSplits.size(); I != E; ++I) diff --git a/clang-tools-extra/clang-move/Move.h b/clang-tools-extra/clang-move/Move.h index ea241bbbc4f8a..ba613abc03e19 100644 --- a/clang-tools-extra/clang-move/Move.h +++ b/clang-tools-extra/clang-move/Move.h @@ -49,9 +49,7 @@ class DeclarationReporter { bool Templated = false; // Whether the declaration is templated. }; - const std::vector getDeclarationList() const { - return DeclarationList; - } + ArrayRef getDeclarationList() const { return DeclarationList; } private: std::vector DeclarationList; diff --git a/clang-tools-extra/clang-tidy/ClangTidy.cpp b/clang-tools-extra/clang-tidy/ClangTidy.cpp index 38d58bc137748..f4ab93b51f4a7 100644 --- a/clang-tools-extra/clang-tidy/ClangTidy.cpp +++ b/clang-tools-extra/clang-tidy/ClangTidy.cpp @@ -419,8 +419,8 @@ ClangTidyASTConsumerFactory::createASTConsumer( std::unique_ptr Profiling; if (Context.getEnableProfiling()) { - Profiling = std::make_unique( - Context.getProfileStorageParams()); + Profiling = + std::make_unique(Context.getProfileStorageParams()); FinderOptions.CheckProfiling.emplace(Profiling->Records); } @@ -432,8 +432,8 @@ ClangTidyASTConsumerFactory::createASTConsumer( if (Context.canEnableModuleHeadersParsing() && Context.getLangOpts().Modules && OverlayFS != nullptr) { - auto ModuleExpander = std::make_unique( - &Compiler, OverlayFS); + auto ModuleExpander = + std::make_unique(&Compiler, OverlayFS); ModuleExpanderPP = ModuleExpander->getPreprocessor(); PP->addPPCallbacks(std::move(ModuleExpander)); } @@ -497,7 +497,7 @@ getCheckNames(const ClangTidyOptions &Options, bool AllowEnablingAnalyzerAlphaCheckers) { clang::tidy::ClangTidyContext Context( std::make_unique(ClangTidyGlobalOptions(), - Options), + Options), AllowEnablingAnalyzerAlphaCheckers); ClangTidyASTConsumerFactory Factory(Context); return Factory.getCheckNames(); @@ -508,7 +508,7 @@ getCheckOptions(const ClangTidyOptions &Options, bool AllowEnablingAnalyzerAlphaCheckers) { clang::tidy::ClangTidyContext Context( std::make_unique(ClangTidyGlobalOptions(), - Options), + Options), AllowEnablingAnalyzerAlphaCheckers); ClangTidyDiagnosticConsumer DiagConsumer(Context); auto DiagOpts = std::make_unique(); diff --git a/clang-tools-extra/clang-tidy/ClangTidyCheck.h b/clang-tools-extra/clang-tidy/ClangTidyCheck.h index 037526a0bd9af..399d45911549d 100644 --- a/clang-tools-extra/clang-tidy/ClangTidyCheck.h +++ b/clang-tools-extra/clang-tidy/ClangTidyCheck.h @@ -530,7 +530,6 @@ void ClangTidyCheck::OptionsView::store( ClangTidyOptions::OptionMap &Options, StringRef LocalName, bool Value) const; - } // namespace tidy } // namespace clang diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h index bd7a1bf2c11c7..a8851e794f24b 100644 --- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h +++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h @@ -217,11 +217,10 @@ class ClangTidyContext { using DiagLevelAndFormatString = std::pair; DiagLevelAndFormatString getDiagLevelAndFormatString(unsigned DiagnosticID, SourceLocation Loc) { - return { - static_cast( - DiagEngine->getDiagnosticLevel(DiagnosticID, Loc)), - std::string( - DiagEngine->getDiagnosticIDs()->getDescription(DiagnosticID))}; + return {static_cast( + DiagEngine->getDiagnosticLevel(DiagnosticID, Loc)), + std::string( + DiagEngine->getDiagnosticIDs()->getDescription(DiagnosticID))}; } void setOptionsCollector(llvm::StringSet<> *Collector) { diff --git a/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp b/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp index 1c480d107ae9c..e59f157b468bc 100644 --- a/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp +++ b/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp @@ -70,7 +70,8 @@ struct NOptionMap { NOptionMap(IO &, const ClangTidyOptions::OptionMap &OptionMap) { Options.reserve(OptionMap.size()); for (const auto &KeyValue : OptionMap) - Options.emplace_back(std::string(KeyValue.getKey()), KeyValue.getValue().Value); + Options.emplace_back(std::string(KeyValue.getKey()), + KeyValue.getValue().Value); } ClangTidyOptions::OptionMap denormalize(IO &) { ClangTidyOptions::OptionMap Map; diff --git a/clang-tools-extra/clang-tidy/ClangTidyOptions.h b/clang-tools-extra/clang-tidy/ClangTidyOptions.h index dd78c570d25d9..6ddc5f9b9cf9e 100644 --- a/clang-tools-extra/clang-tidy/ClangTidyOptions.h +++ b/clang-tools-extra/clang-tidy/ClangTidyOptions.h @@ -204,7 +204,9 @@ class FileOptionsBaseProvider : public DefaultOptionsProvider { protected: // A pair of configuration file base name and a function parsing // configuration from text in the corresponding format. - using ConfigFileHandler = std::pair (llvm::MemoryBufferRef)>>; + using ConfigFileHandler = + std::pair( + llvm::MemoryBufferRef)>>; /// Configuration file handlers listed in the order of priority. /// diff --git a/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp b/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp index 6a84704434c33..2c17cd3b6e979 100644 --- a/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp +++ b/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp @@ -49,8 +49,8 @@ class ExpandModularHeadersPPCallbacks::FileRecorder { FilesToRecord.erase(File); } - /// Makes sure we have contents for all the files we were interested in. Ideally - /// `FilesToRecord` should be empty. + /// Makes sure we have contents for all the files we were interested in. + /// Ideally `FilesToRecord` should be empty. void checkAllFilesRecorded() { LLVM_DEBUG({ for (auto FileEntry : FilesToRecord) diff --git a/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h b/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h index c3478917ef498..e599bda92c25c 100644 --- a/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h +++ b/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h @@ -35,10 +35,10 @@ namespace tooling { /// including the contents of the modular headers and all their transitive /// includes. /// -/// This allows existing tools based on PPCallbacks to retain their functionality -/// when running with C++ modules enabled. This only works in the backwards -/// compatible modules mode, i.e. when code can still be parsed in non-modular -/// way. +/// This allows existing tools based on PPCallbacks to retain their +/// functionality when running with C++ modules enabled. This only works in the +/// backwards compatible modules mode, i.e. when code can still be parsed in +/// non-modular way. class ExpandModularHeadersPPCallbacks : public PPCallbacks { public: ExpandModularHeadersPPCallbacks( diff --git a/clang-tools-extra/clang-tidy/abseil/AbseilTidyModule.cpp b/clang-tools-extra/clang-tidy/abseil/AbseilTidyModule.cpp index 09a09e6c599b0..78605d59b4421 100644 --- a/clang-tools-extra/clang-tidy/abseil/AbseilTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/abseil/AbseilTidyModule.cpp @@ -59,14 +59,12 @@ class AbseilModule : public ClangTidyModule { CheckFactories.registerCheck("abseil-no-namespace"); CheckFactories.registerCheck( "abseil-redundant-strcat-calls"); - CheckFactories.registerCheck( - "abseil-str-cat-append"); + CheckFactories.registerCheck("abseil-str-cat-append"); CheckFactories.registerCheck( "abseil-string-find-startswith"); CheckFactories.registerCheck( "abseil-string-find-str-contains"); - CheckFactories.registerCheck( - "abseil-time-comparison"); + CheckFactories.registerCheck("abseil-time-comparison"); CheckFactories.registerCheck( "abseil-time-subtraction"); CheckFactories.registerCheck( @@ -82,6 +80,6 @@ static ClangTidyModuleRegistry::Add X("abseil-module", // This anchor is used to force the linker to link in the generated object file // and thus register the AbseilModule. -volatile int AbseilModuleAnchorSource = 0; +volatile int AbseilModuleAnchorSource = 0; // NOLINT(misc-use-internal-linkage) } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/abseil/CleanupCtadCheck.cpp b/clang-tools-extra/clang-tidy/abseil/CleanupCtadCheck.cpp index 0819642be0558..8063fc540cce5 100644 --- a/clang-tools-extra/clang-tidy/abseil/CleanupCtadCheck.cpp +++ b/clang-tools-extra/clang-tidy/abseil/CleanupCtadCheck.cpp @@ -18,7 +18,7 @@ using namespace ::clang::transformer; namespace clang::tidy::abseil { -RewriteRuleWith cleanupCtadCheckImpl() { +static RewriteRuleWith cleanupCtadCheckImpl() { auto WarningMessage = cat("prefer absl::Cleanup's class template argument " "deduction pattern in C++17 and higher"); diff --git a/clang-tools-extra/clang-tidy/abseil/DurationDivisionCheck.h b/clang-tools-extra/clang-tidy/abseil/DurationDivisionCheck.h index 6b194e3d2664a..c8f259521b648 100644 --- a/clang-tools-extra/clang-tidy/abseil/DurationDivisionCheck.h +++ b/clang-tools-extra/clang-tidy/abseil/DurationDivisionCheck.h @@ -15,7 +15,7 @@ namespace clang::tidy::abseil { // Find potential incorrect uses of integer division of absl::Duration objects. // -// For the user-facing documentation see: +// For the user-facing documentation see: // http://clang.llvm.org/extra/clang-tidy/checks/abseil/duration-division.html class DurationDivisionCheck : public ClangTidyCheck { diff --git a/clang-tools-extra/clang-tidy/abseil/NoInternalDependenciesCheck.cpp b/clang-tools-extra/clang-tidy/abseil/NoInternalDependenciesCheck.cpp index edaa584a4d8ef..19409d0616f06 100644 --- a/clang-tools-extra/clang-tidy/abseil/NoInternalDependenciesCheck.cpp +++ b/clang-tools-extra/clang-tidy/abseil/NoInternalDependenciesCheck.cpp @@ -27,7 +27,8 @@ void NoInternalDependenciesCheck::registerMatchers(MatchFinder *Finder) { this); } -void NoInternalDependenciesCheck::check(const MatchFinder::MatchResult &Result) { +void NoInternalDependenciesCheck::check( + const MatchFinder::MatchResult &Result) { const auto *InternalDependency = Result.Nodes.getNodeAs("InternalDep"); diff --git a/clang-tools-extra/clang-tidy/abseil/NoInternalDependenciesCheck.h b/clang-tools-extra/clang-tidy/abseil/NoInternalDependenciesCheck.h index dfaa2cbf8f900..9c16524ff6b59 100644 --- a/clang-tools-extra/clang-tidy/abseil/NoInternalDependenciesCheck.h +++ b/clang-tools-extra/clang-tidy/abseil/NoInternalDependenciesCheck.h @@ -1,4 +1,4 @@ -//===--- NoInternalDependenciesCheck.h - clang-tidy----------------------*- C++ -*-===// +//===--- NoInternalDependenciesCheck.h - clang-tidy--------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. diff --git a/clang-tools-extra/clang-tidy/abseil/NoNamespaceCheck.cpp b/clang-tools-extra/clang-tidy/abseil/NoNamespaceCheck.cpp index b45a9c99d780d..6c2baa4c41412 100644 --- a/clang-tools-extra/clang-tidy/abseil/NoNamespaceCheck.cpp +++ b/clang-tools-extra/clang-tidy/abseil/NoNamespaceCheck.cpp @@ -15,10 +15,9 @@ using namespace clang::ast_matchers; namespace clang::tidy::abseil { void NoNamespaceCheck::registerMatchers(MatchFinder *Finder) { - Finder->addMatcher( - namespaceDecl(hasName("::absl"), unless(isInAbseilFile())) - .bind("abslNamespace"), - this); + Finder->addMatcher(namespaceDecl(hasName("::absl"), unless(isInAbseilFile())) + .bind("abslNamespace"), + this); } void NoNamespaceCheck::check(const MatchFinder::MatchResult &Result) { diff --git a/clang-tools-extra/clang-tidy/abseil/RedundantStrcatCallsCheck.cpp b/clang-tools-extra/clang-tidy/abseil/RedundantStrcatCallsCheck.cpp index 04ca006143503..ef26a8a76cb37 100644 --- a/clang-tools-extra/clang-tidy/abseil/RedundantStrcatCallsCheck.cpp +++ b/clang-tools-extra/clang-tidy/abseil/RedundantStrcatCallsCheck.cpp @@ -23,7 +23,7 @@ namespace clang::tidy::abseil { // - Make it work in macros if the outer and inner StrCats are both in the // argument. -void RedundantStrcatCallsCheck::registerMatchers(MatchFinder* Finder) { +void RedundantStrcatCallsCheck::registerMatchers(MatchFinder *Finder) { const auto CallToStrcat = callExpr(callee(functionDecl(hasName("::absl::StrCat")))); const auto CallToStrappend = @@ -62,7 +62,7 @@ const clang::CallExpr *processArgument(const Expr *Arg, const MatchFinder::MatchResult &Result, StrCatCheckResult *CheckResult) { const auto IsAlphanum = hasDeclaration(cxxMethodDecl(hasName("AlphaNum"))); - static const auto* const Strcat = new auto(hasName("::absl::StrCat")); + static const auto *const Strcat = new auto(hasName("::absl::StrCat")); const auto IsStrcat = cxxBindTemporaryExpr( has(callExpr(callee(functionDecl(*Strcat))).bind("StrCat"))); if (const auto *SubStrcatCall = selectFirst( @@ -81,18 +81,18 @@ const clang::CallExpr *processArgument(const Expr *Arg, StrCatCheckResult processCall(const CallExpr *RootCall, bool IsAppend, const MatchFinder::MatchResult &Result) { StrCatCheckResult CheckResult; - std::deque CallsToProcess = {RootCall}; + std::deque CallsToProcess = {RootCall}; while (!CallsToProcess.empty()) { ++CheckResult.NumCalls; - const CallExpr* CallExpr = CallsToProcess.front(); + const CallExpr *CallExpr = CallsToProcess.front(); CallsToProcess.pop_front(); int StartArg = CallExpr == RootCall && IsAppend; for (const auto *Arg : CallExpr->arguments()) { - if (StartArg-- > 0) - continue; + if (StartArg-- > 0) + continue; if (const clang::CallExpr *Sub = processArgument(Arg, Result, &CheckResult)) { CallsToProcess.push_back(Sub); @@ -101,18 +101,18 @@ StrCatCheckResult processCall(const CallExpr *RootCall, bool IsAppend, } return CheckResult; } -} // namespace +} // namespace -void RedundantStrcatCallsCheck::check(const MatchFinder::MatchResult& Result) { +void RedundantStrcatCallsCheck::check(const MatchFinder::MatchResult &Result) { bool IsAppend = false; const CallExpr *RootCall = nullptr; - if ((RootCall = Result.Nodes.getNodeAs("StrCat"))) - IsAppend = false; - else if ((RootCall = Result.Nodes.getNodeAs("StrAppend"))) - IsAppend = true; - else - return; + if ((RootCall = Result.Nodes.getNodeAs("StrCat"))) + IsAppend = false; + else if ((RootCall = Result.Nodes.getNodeAs("StrAppend"))) + IsAppend = true; + else + return; if (RootCall->getBeginLoc().isMacroID()) { // Ignore calls within macros. @@ -128,8 +128,8 @@ void RedundantStrcatCallsCheck::check(const MatchFinder::MatchResult& Result) { return; } - diag(RootCall->getBeginLoc(), - "multiple calls to 'absl::StrCat' can be flattened into a single call") + diag(RootCall->getBeginLoc(), + "multiple calls to 'absl::StrCat' can be flattened into a single call") << CheckResult.Hints; } diff --git a/clang-tools-extra/clang-tidy/abseil/RedundantStrcatCallsCheck.h b/clang-tools-extra/clang-tidy/abseil/RedundantStrcatCallsCheck.h index 04c7c9cb4b783..a27899d3e821a 100644 --- a/clang-tools-extra/clang-tidy/abseil/RedundantStrcatCallsCheck.h +++ b/clang-tools-extra/clang-tidy/abseil/RedundantStrcatCallsCheck.h @@ -13,8 +13,8 @@ namespace clang::tidy::abseil { -/// Flags redundant calls to absl::StrCat when the result is being passed to -/// another call of absl::StrCat/absl::StrAppend. Also suggests a fix to +/// Flags redundant calls to absl::StrCat when the result is being passed to +/// another call of absl::StrCat/absl::StrAppend. Also suggests a fix to /// collapse the calls. /// Example: /// StrCat(1, StrCat(2, 3)) ==> StrCat(1, 2, 3) diff --git a/clang-tools-extra/clang-tidy/abseil/StrCatAppendCheck.cpp b/clang-tools-extra/clang-tidy/abseil/StrCatAppendCheck.cpp index ab6ed701e59fe..ced92590be02e 100644 --- a/clang-tools-extra/clang-tidy/abseil/StrCatAppendCheck.cpp +++ b/clang-tools-extra/clang-tidy/abseil/StrCatAppendCheck.cpp @@ -17,7 +17,7 @@ namespace clang::tidy::abseil { namespace { // Skips any combination of temporary materialization, temporary binding and // implicit casting. -AST_MATCHER_P(Stmt, IgnoringTemporaries, ast_matchers::internal::Matcher, +AST_MATCHER_P(Stmt, ignoringTemporaries, ast_matchers::internal::Matcher, InnerMatcher) { const Stmt *E = &Node; while (true) { @@ -34,16 +34,16 @@ AST_MATCHER_P(Stmt, IgnoringTemporaries, ast_matchers::internal::Matcher, return InnerMatcher.matches(*E, Finder, Builder); } -} // namespace +} // namespace // TODO: str += StrCat(...) // str.append(StrCat(...)) void StrCatAppendCheck::registerMatchers(MatchFinder *Finder) { const auto StrCat = functionDecl(hasName("::absl::StrCat")); - // The arguments of absl::StrCat are implicitly converted to AlphaNum. This - // matches to the arguments because of that behavior. - const auto AlphaNum = IgnoringTemporaries(cxxConstructExpr( + // The arguments of absl::StrCat are implicitly converted to AlphaNum. This + // matches to the arguments because of that behavior. + const auto AlphaNum = ignoringTemporaries(cxxConstructExpr( argumentCountIs(1), hasType(cxxRecordDecl(hasName("::absl::AlphaNum"))), hasArgument(0, ignoringImpCasts(declRefExpr(to(equalsBoundNode("LHS")), expr().bind("Arg0")))))); @@ -62,7 +62,7 @@ void StrCatAppendCheck::registerMatchers(MatchFinder *Finder) { hasOverloadedOperatorName("="), hasArgument(0, declRefExpr(to(decl().bind("LHS")))), hasArgument( - 1, IgnoringTemporaries( + 1, ignoringTemporaries( callExpr(callee(StrCat), hasArgument(0, AlphaNum), unless(HasAnotherReferenceToLhs)) .bind("Call")))) @@ -73,7 +73,7 @@ void StrCatAppendCheck::registerMatchers(MatchFinder *Finder) { void StrCatAppendCheck::check(const MatchFinder::MatchResult &Result) { const auto *Op = Result.Nodes.getNodeAs("Op"); const auto *Call = Result.Nodes.getNodeAs("Call"); - assert(Op != nullptr && Call != nullptr && "Matcher does not work as expected"); + assert(Op && Call && "Matcher does not work as expected"); // Handles the case 'x = absl::StrCat(x)', which has no effect. if (Call->getNumArgs() == 1) { diff --git a/clang-tools-extra/clang-tidy/abseil/StrCatAppendCheck.h b/clang-tools-extra/clang-tidy/abseil/StrCatAppendCheck.h index 22b55abfd83be..fcd9d4b6e1885 100644 --- a/clang-tools-extra/clang-tidy/abseil/StrCatAppendCheck.h +++ b/clang-tools-extra/clang-tidy/abseil/StrCatAppendCheck.h @@ -14,7 +14,7 @@ namespace clang::tidy::abseil { /// Flags uses of absl::StrCat to append to a string. Suggests absl::StrAppend -/// should be used instead. +/// should be used instead. /// /// For the user-facing documentation see: /// http://clang.llvm.org/extra/clang-tidy/checks/abseil/str-cat-append.html diff --git a/clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp b/clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp index 6e89783bb51eb..0c2fe285ce060 100644 --- a/clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp +++ b/clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp @@ -29,7 +29,9 @@ using ::clang::transformer::makeRule; using ::clang::transformer::node; using ::clang::transformer::RewriteRuleWith; +namespace { AST_MATCHER(Type, isCharType) { return Node.isCharType(); } +} // namespace static const char DefaultStringLikeClasses[] = "::std::basic_string;" "::std::basic_string_view;" diff --git a/clang-tools-extra/clang-tidy/abseil/TimeSubtractionCheck.h b/clang-tools-extra/clang-tidy/abseil/TimeSubtractionCheck.h index 7e7dc73511812..c947f6bca7f31 100644 --- a/clang-tools-extra/clang-tidy/abseil/TimeSubtractionCheck.h +++ b/clang-tools-extra/clang-tidy/abseil/TimeSubtractionCheck.h @@ -26,7 +26,7 @@ class TimeSubtractionCheck : public ClangTidyCheck { void check(const ast_matchers::MatchFinder::MatchResult &Result) override; private: - void emitDiagnostic(const Expr* Node, llvm::StringRef Replacement); + void emitDiagnostic(const Expr *Node, llvm::StringRef Replacement); }; } // namespace clang::tidy::abseil diff --git a/clang-tools-extra/clang-tidy/abseil/UpgradeDurationConversionsCheck.h b/clang-tools-extra/clang-tidy/abseil/UpgradeDurationConversionsCheck.h index beb5479aa6aae..8e7d9829533d4 100644 --- a/clang-tools-extra/clang-tidy/abseil/UpgradeDurationConversionsCheck.h +++ b/clang-tools-extra/clang-tidy/abseil/UpgradeDurationConversionsCheck.h @@ -16,7 +16,8 @@ namespace clang::tidy::abseil { -/// Finds deprecated uses of `absl::Duration` arithmetic operators and factories. +/// Finds deprecated uses of `absl::Duration` arithmetic operators and +/// factories. /// /// For the user-facing documentation see: /// http://clang.llvm.org/extra/clang-tidy/checks/abseil/upgrade-duration-conversions.html diff --git a/clang-tools-extra/clang-tidy/altera/AlteraTidyModule.cpp b/clang-tools-extra/clang-tidy/altera/AlteraTidyModule.cpp index 21610c7d1eced..02a43ba86d7bb 100644 --- a/clang-tools-extra/clang-tidy/altera/AlteraTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/altera/AlteraTidyModule.cpp @@ -43,6 +43,6 @@ static ClangTidyModuleRegistry::Add // This anchor is used to force the linker to link in the generated object file // and thus register the AlteraModule. -volatile int AlteraModuleAnchorSource = 0; +volatile int AlteraModuleAnchorSource = 0; // NOLINT(misc-use-internal-linkage) } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/altera/SingleWorkItemBarrierCheck.cpp b/clang-tools-extra/clang-tidy/altera/SingleWorkItemBarrierCheck.cpp index c5da66a1f28b6..c21b7cab1b8da 100644 --- a/clang-tools-extra/clang-tidy/altera/SingleWorkItemBarrierCheck.cpp +++ b/clang-tools-extra/clang-tidy/altera/SingleWorkItemBarrierCheck.cpp @@ -16,14 +16,14 @@ namespace clang::tidy::altera { void SingleWorkItemBarrierCheck::registerMatchers(MatchFinder *Finder) { // Find any function that calls barrier but does not call an ID function. - // hasAttr(attr::Kind::OpenCLKernel) restricts it to only kernel functions. + // hasAttr(attr::Kind::DeviceKernel) restricts it to only kernel functions. // FIXME: Have it accept all functions but check for a parameter that gets an // ID from one of the four ID functions. Finder->addMatcher( // Find function declarations... functionDecl( - // That are OpenCL kernels... - hasAttr(attr::Kind::OpenCLKernel), + // That are device kernels... + hasAttr(attr::Kind::DeviceKernel), // And call a barrier function (either 1.x or 2.x version)... forEachDescendant(callExpr(callee(functionDecl(hasAnyName( "barrier", "work_group_barrier")))) diff --git a/clang-tools-extra/clang-tidy/altera/StructPackAlignCheck.cpp b/clang-tools-extra/clang-tidy/altera/StructPackAlignCheck.cpp index cdaedd440959c..789327b196ab6 100644 --- a/clang-tools-extra/clang-tidy/altera/StructPackAlignCheck.cpp +++ b/clang-tools-extra/clang-tidy/altera/StructPackAlignCheck.cpp @@ -47,7 +47,7 @@ void StructPackAlignCheck::check(const MatchFinder::MatchResult &Result) { // Do not trigger on templated struct declarations because the packing and // alignment requirements are unknown. if (Struct->isTemplated()) - return; + return; // Packing and alignment requirements for invalid decls are meaningless. if (Struct->isInvalidDecl()) diff --git a/clang-tools-extra/clang-tidy/altera/StructPackAlignCheck.h b/clang-tools-extra/clang-tidy/altera/StructPackAlignCheck.h index 5edfd40ef77bc..f360bcef4f14e 100644 --- a/clang-tools-extra/clang-tidy/altera/StructPackAlignCheck.h +++ b/clang-tools-extra/clang-tidy/altera/StructPackAlignCheck.h @@ -22,7 +22,7 @@ class StructPackAlignCheck : public ClangTidyCheck { public: StructPackAlignCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), - MaxConfiguredAlignment(Options.get("MaxConfiguredAlignment", 128)) {} + MaxConfiguredAlignment(Options.get("MaxConfiguredAlignment", 128)) {} void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; void storeOptions(ClangTidyOptions::OptionMap &Opts) override; diff --git a/clang-tools-extra/clang-tidy/altera/UnrollLoopsCheck.cpp b/clang-tools-extra/clang-tidy/altera/UnrollLoopsCheck.cpp index 532a43bad7412..0bb9d6e4a7cee 100644 --- a/clang-tools-extra/clang-tidy/altera/UnrollLoopsCheck.cpp +++ b/clang-tools-extra/clang-tidy/altera/UnrollLoopsCheck.cpp @@ -247,8 +247,8 @@ bool UnrollLoopsCheck::extractValue(int &Value, const BinaryOperator *Op, return true; } -bool UnrollLoopsCheck::exprHasLargeNumIterations(const Expr *Expression, - const ASTContext *Context) const { +bool UnrollLoopsCheck::exprHasLargeNumIterations( + const Expr *Expression, const ASTContext *Context) const { Expr::EvalResult Result; if (Expression->EvaluateAsRValue(Result, *Context)) { if (!Result.Val.isInt()) diff --git a/clang-tools-extra/clang-tidy/android/AndroidTidyModule.cpp b/clang-tools-extra/clang-tidy/android/AndroidTidyModule.cpp index 4541e926e8864..17efa10909d0a 100644 --- a/clang-tools-extra/clang-tidy/android/AndroidTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/android/AndroidTidyModule.cpp @@ -34,7 +34,8 @@ namespace android { class AndroidModule : public ClangTidyModule { public: void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { - CheckFactories.registerCheck("android-cloexec-accept4"); + CheckFactories.registerCheck( + "android-cloexec-accept4"); CheckFactories.registerCheck("android-cloexec-accept"); CheckFactories.registerCheck("android-cloexec-creat"); CheckFactories.registerCheck("android-cloexec-dup"); @@ -66,6 +67,6 @@ static ClangTidyModuleRegistry::Add // This anchor is used to force the linker to link in the generated object file // and thus register the AndroidModule. -volatile int AndroidModuleAnchorSource = 0; +volatile int AndroidModuleAnchorSource = 0; // NOLINT(misc-use-internal-linkage) } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/android/CloexecAcceptCheck.cpp b/clang-tools-extra/clang-tidy/android/CloexecAcceptCheck.cpp index 8c34ecd6945c6..c90fc7ba1bb04 100644 --- a/clang-tools-extra/clang-tidy/android/CloexecAcceptCheck.cpp +++ b/clang-tools-extra/clang-tidy/android/CloexecAcceptCheck.cpp @@ -26,11 +26,10 @@ void CloexecAcceptCheck::registerMatchers(MatchFinder *Finder) { } void CloexecAcceptCheck::check(const MatchFinder::MatchResult &Result) { - std::string ReplacementText = - (Twine("accept4(") + getSpellingArg(Result, 0) + ", " + - getSpellingArg(Result, 1) + ", " + getSpellingArg(Result, 2) + - ", SOCK_CLOEXEC)") - .str(); + std::string ReplacementText = (Twine("accept4(") + getSpellingArg(Result, 0) + + ", " + getSpellingArg(Result, 1) + ", " + + getSpellingArg(Result, 2) + ", SOCK_CLOEXEC)") + .str(); replaceFunc( Result, diff --git a/clang-tools-extra/clang-tidy/android/CloexecCheck.cpp b/clang-tools-extra/clang-tidy/android/CloexecCheck.cpp index 39a0d74f38360..f4d657a7f4e90 100644 --- a/clang-tools-extra/clang-tidy/android/CloexecCheck.cpp +++ b/clang-tools-extra/clang-tidy/android/CloexecCheck.cpp @@ -36,7 +36,7 @@ std::string buildFixMsgForStringFlag(const Expr *Arg, const SourceManager &SM, const char *CloexecCheck::FuncDeclBindingStr = "funcDecl"; -const char *CloexecCheck::FuncBindingStr ="func"; +const char *CloexecCheck::FuncBindingStr = "func"; void CloexecCheck::registerMatchersImpl( MatchFinder *Finder, internal::Matcher Function) { diff --git a/clang-tools-extra/clang-tidy/android/CloexecCreatCheck.cpp b/clang-tools-extra/clang-tidy/android/CloexecCreatCheck.cpp index ee270209e4fa6..8d9f45c3567f2 100644 --- a/clang-tools-extra/clang-tidy/android/CloexecCreatCheck.cpp +++ b/clang-tools-extra/clang-tidy/android/CloexecCreatCheck.cpp @@ -16,11 +16,10 @@ namespace clang::tidy::android { void CloexecCreatCheck::registerMatchers(MatchFinder *Finder) { auto CharPointerType = hasType(pointerType(pointee(isAnyCharacter()))); auto MODETType = hasType(namedDecl(hasName("mode_t"))); - registerMatchersImpl(Finder, - functionDecl(isExternC(), returns(isInteger()), - hasName("creat"), - hasParameter(0, CharPointerType), - hasParameter(1, MODETType))); + registerMatchersImpl(Finder, functionDecl(isExternC(), returns(isInteger()), + hasName("creat"), + hasParameter(0, CharPointerType), + hasParameter(1, MODETType))); } void CloexecCreatCheck::check(const MatchFinder::MatchResult &Result) { diff --git a/clang-tools-extra/clang-tidy/android/CloexecFopenCheck.cpp b/clang-tools-extra/clang-tidy/android/CloexecFopenCheck.cpp index 153e7af82d15c..bb9d0d2cb3da3 100644 --- a/clang-tools-extra/clang-tidy/android/CloexecFopenCheck.cpp +++ b/clang-tools-extra/clang-tidy/android/CloexecFopenCheck.cpp @@ -15,11 +15,10 @@ namespace clang::tidy::android { void CloexecFopenCheck::registerMatchers(MatchFinder *Finder) { auto CharPointerType = hasType(pointerType(pointee(isAnyCharacter()))); - registerMatchersImpl(Finder, - functionDecl(isExternC(), returns(asString("FILE *")), - hasName("fopen"), - hasParameter(0, CharPointerType), - hasParameter(1, CharPointerType))); + registerMatchersImpl( + Finder, functionDecl(isExternC(), returns(asString("FILE *")), + hasName("fopen"), hasParameter(0, CharPointerType), + hasParameter(1, CharPointerType))); } void CloexecFopenCheck::check(const MatchFinder::MatchResult &Result) { diff --git a/clang-tools-extra/clang-tidy/android/CloexecOpenCheck.cpp b/clang-tools-extra/clang-tidy/android/CloexecOpenCheck.cpp index 11807f95def47..623b6ab02e7ba 100644 --- a/clang-tools-extra/clang-tidy/android/CloexecOpenCheck.cpp +++ b/clang-tools-extra/clang-tidy/android/CloexecOpenCheck.cpp @@ -20,12 +20,11 @@ void CloexecOpenCheck::registerMatchers(MatchFinder *Finder) { hasAnyName("open", "open64"), hasParameter(0, CharPointerType), hasParameter(1, hasType(isInteger())))); - registerMatchersImpl(Finder, - functionDecl(isExternC(), returns(isInteger()), - hasName("openat"), - hasParameter(0, hasType(isInteger())), - hasParameter(1, CharPointerType), - hasParameter(2, hasType(isInteger())))); + registerMatchersImpl( + Finder, functionDecl(isExternC(), returns(isInteger()), hasName("openat"), + hasParameter(0, hasType(isInteger())), + hasParameter(1, CharPointerType), + hasParameter(2, hasType(isInteger())))); } void CloexecOpenCheck::check(const MatchFinder::MatchResult &Result) { diff --git a/clang-tools-extra/clang-tidy/android/CloexecPipe2Check.cpp b/clang-tools-extra/clang-tidy/android/CloexecPipe2Check.cpp index 2798c80146e90..e32332bdfc953 100644 --- a/clang-tools-extra/clang-tidy/android/CloexecPipe2Check.cpp +++ b/clang-tools-extra/clang-tidy/android/CloexecPipe2Check.cpp @@ -14,10 +14,10 @@ using namespace clang::ast_matchers; namespace clang::tidy::android { void CloexecPipe2Check::registerMatchers(MatchFinder *Finder) { - registerMatchersImpl(Finder, - functionDecl(returns(isInteger()), hasName("pipe2"), - hasParameter(0, hasType(pointsTo(isInteger()))), - hasParameter(1, hasType(isInteger())))); + registerMatchersImpl( + Finder, functionDecl(returns(isInteger()), hasName("pipe2"), + hasParameter(0, hasType(pointsTo(isInteger()))), + hasParameter(1, hasType(isInteger())))); } void CloexecPipe2Check::check(const MatchFinder::MatchResult &Result) { diff --git a/clang-tools-extra/clang-tidy/android/CloexecPipeCheck.cpp b/clang-tools-extra/clang-tidy/android/CloexecPipeCheck.cpp index 9085be67b755e..c59b127dc87ac 100644 --- a/clang-tools-extra/clang-tidy/android/CloexecPipeCheck.cpp +++ b/clang-tools-extra/clang-tidy/android/CloexecPipeCheck.cpp @@ -14,19 +14,19 @@ using namespace clang::ast_matchers; namespace clang::tidy::android { void CloexecPipeCheck::registerMatchers(MatchFinder *Finder) { - registerMatchersImpl(Finder, - functionDecl(returns(isInteger()), hasName("pipe"), - hasParameter(0, hasType(pointsTo(isInteger()))))); + registerMatchersImpl( + Finder, functionDecl(returns(isInteger()), hasName("pipe"), + hasParameter(0, hasType(pointsTo(isInteger()))))); } void CloexecPipeCheck::check(const MatchFinder::MatchResult &Result) { std::string ReplacementText = (Twine("pipe2(") + getSpellingArg(Result, 0) + ", O_CLOEXEC)").str(); - replaceFunc( - Result, - "prefer pipe2() with O_CLOEXEC to avoid leaking file descriptors to child processes", - ReplacementText); + replaceFunc(Result, + "prefer pipe2() with O_CLOEXEC to avoid leaking file descriptors " + "to child processes", + ReplacementText); } } // namespace clang::tidy::android diff --git a/clang-tools-extra/clang-tidy/android/CloexecSocketCheck.cpp b/clang-tools-extra/clang-tidy/android/CloexecSocketCheck.cpp index 65c6a82036cc5..12b31a050c2c0 100644 --- a/clang-tools-extra/clang-tidy/android/CloexecSocketCheck.cpp +++ b/clang-tools-extra/clang-tidy/android/CloexecSocketCheck.cpp @@ -14,12 +14,11 @@ using namespace clang::ast_matchers; namespace clang::tidy::android { void CloexecSocketCheck::registerMatchers(MatchFinder *Finder) { - registerMatchersImpl(Finder, - functionDecl(isExternC(), returns(isInteger()), - hasName("socket"), - hasParameter(0, hasType(isInteger())), - hasParameter(1, hasType(isInteger())), - hasParameter(2, hasType(isInteger())))); + registerMatchersImpl( + Finder, functionDecl(isExternC(), returns(isInteger()), hasName("socket"), + hasParameter(0, hasType(isInteger())), + hasParameter(1, hasType(isInteger())), + hasParameter(2, hasType(isInteger())))); } void CloexecSocketCheck::check(const MatchFinder::MatchResult &Result) { diff --git a/clang-tools-extra/clang-tidy/boost/BoostTidyModule.cpp b/clang-tools-extra/clang-tidy/boost/BoostTidyModule.cpp index 79d0e380e402d..f414fe750d023 100644 --- a/clang-tools-extra/clang-tidy/boost/BoostTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/boost/BoostTidyModule.cpp @@ -32,6 +32,6 @@ static ClangTidyModuleRegistry::Add X("boost-module", // This anchor is used to force the linker to link in the generated object file // and thus register the BoostModule. -volatile int BoostModuleAnchorSource = 0; +volatile int BoostModuleAnchorSource = 0; // NOLINT(misc-use-internal-linkage) } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/bugprone/BranchCloneCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/BranchCloneCheck.cpp index 0b76cfb2ad8dc..a6cd68edda55e 100644 --- a/clang-tools-extra/clang-tidy/bugprone/BranchCloneCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/BranchCloneCheck.cpp @@ -62,6 +62,7 @@ static bool isFallthroughSwitchBranch(const SwitchBranch &Branch) { return true; // Ignore sub-switches } + // NOLINTNEXTLINE(readability-identifier-naming) - FIXME bool TraverseSwitchCase(SwitchCase *, DataRecursionQueue * = nullptr) { return true; // Ignore cases } diff --git a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp index 64f4a524daf0d..ed1fd138d8f1b 100644 --- a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp @@ -291,6 +291,7 @@ static ClangTidyModuleRegistry::Add // This anchor is used to force the linker to link in the generated object file // and thus register the BugproneModule. +// NOLINTNEXTLINE(misc-use-internal-linkage) volatile int BugproneModuleAnchorSource = 0; } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/bugprone/ChainedComparisonCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/ChainedComparisonCheck.cpp index c6bb5bdf5ce91..7378f1a24ffd3 100644 --- a/clang-tools-extra/clang-tidy/bugprone/ChainedComparisonCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/ChainedComparisonCheck.cpp @@ -34,8 +34,7 @@ AST_MATCHER(BinaryOperator, AST_MATCHER(CXXOperatorCallExpr, hasCppOperatorAChildComparisonOperatorWithoutParen) { - return std::any_of(Node.arg_begin(), Node.arg_end(), - isExprAComparisonOperator); + return llvm::any_of(Node.arguments(), isExprAComparisonOperator); } struct ChainedComparisonData { diff --git a/clang-tools-extra/clang-tidy/bugprone/DynamicStaticInitializersCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/DynamicStaticInitializersCheck.cpp index 93f35cb2c1a3d..3fe028b94771d 100644 --- a/clang-tools-extra/clang-tidy/bugprone/DynamicStaticInitializersCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/DynamicStaticInitializersCheck.cpp @@ -15,6 +15,8 @@ using namespace clang::ast_matchers; namespace clang::tidy::bugprone { +namespace { + AST_MATCHER(clang::VarDecl, hasConstantDeclaration) { const Expr *Init = Node.getInit(); if (Init && !Init->isValueDependent()) { @@ -25,6 +27,8 @@ AST_MATCHER(clang::VarDecl, hasConstantDeclaration) { return false; } +} // namespace + DynamicStaticInitializersCheck::DynamicStaticInitializersCheck( StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), @@ -36,16 +40,18 @@ void DynamicStaticInitializersCheck::registerMatchers(MatchFinder *Finder) { this); } -void DynamicStaticInitializersCheck::check(const MatchFinder::MatchResult &Result) { +void DynamicStaticInitializersCheck::check( + const MatchFinder::MatchResult &Result) { const auto *Var = Result.Nodes.getNodeAs("var"); SourceLocation Loc = Var->getLocation(); - if (!Loc.isValid() || !utils::isPresumedLocInHeaderFile(Loc, *Result.SourceManager, - HeaderFileExtensions)) + if (!Loc.isValid() || !utils::isPresumedLocInHeaderFile( + Loc, *Result.SourceManager, HeaderFileExtensions)) return; // If the initializer is a constant expression, then the compiler // doesn't have to dynamically initialize it. - diag(Loc, "static variable %0 may be dynamically initialized in this header file") - << Var; + diag(Loc, + "static variable %0 may be dynamically initialized in this header file") + << Var; } } // namespace clang::tidy::bugprone diff --git a/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp index 10868129e76da..a179d4bf66b4d 100644 --- a/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp @@ -1497,11 +1497,13 @@ static MixableParameterRange modelMixingRange( } // namespace model +namespace { /// Matches DeclRefExprs and their ignorable wrappers to ParmVarDecls. AST_MATCHER_FUNCTION(ast_matchers::internal::Matcher, paramRefExpr) { return expr(ignoringParenImpCasts(ignoringElidableConstructorCall( declRefExpr(to(parmVarDecl().bind("param")))))); } +} // namespace namespace filter { @@ -1574,8 +1576,8 @@ using ParamToSmallSetMap = /// Returns whether the sets mapped to the two elements in the map have at /// least one element in common. template -bool lazyMapOfSetsIntersectionExists(const MapTy &Map, const ElemTy &E1, - const ElemTy &E2) { +static bool lazyMapOfSetsIntersectionExists(const MapTy &Map, const ElemTy &E1, + const ElemTy &E2) { auto E1Iterator = Map.find(E1); auto E2Iterator = Map.find(E2); if (E1Iterator == Map.end() || E2Iterator == Map.end()) @@ -1882,6 +1884,8 @@ static bool prefixSuffixCoverUnderThreshold(std::size_t Threshold, } // namespace filter +namespace { + /// Matches functions that have at least the specified amount of parameters. AST_MATCHER_P(FunctionDecl, parameterCountGE, unsigned, N) { return Node.getNumParams() >= N; @@ -1904,6 +1908,8 @@ AST_MATCHER(FunctionDecl, isOverloadedUnaryOrBinaryOperator) { } } +} // namespace + /// Returns the DefaultMinimumLength if the Value of requested minimum length /// is less than 2. Minimum lengths of 0 or 1 are not accepted. static inline unsigned clampMinimumLength(const unsigned Value) { diff --git a/clang-tools-extra/clang-tidy/bugprone/InaccurateEraseCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/InaccurateEraseCheck.cpp index 7626bf89e694c..92425890a0ea8 100644 --- a/clang-tools-extra/clang-tidy/bugprone/InaccurateEraseCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/InaccurateEraseCheck.cpp @@ -18,9 +18,9 @@ void InaccurateEraseCheck::registerMatchers(MatchFinder *Finder) { const auto EndCall = callExpr( callee(functionDecl(hasAnyName("remove", "remove_if", "unique"))), - hasArgument( - 1, optionally(cxxMemberCallExpr(callee(cxxMethodDecl(hasName("end")))) - .bind("end")))) + hasArgument(1, optionally(cxxMemberCallExpr( + callee(cxxMethodDecl(hasName("end")))) + .bind("end")))) .bind("alg"); const auto DeclInStd = type(hasUnqualifiedDesugaredType( @@ -35,10 +35,8 @@ void InaccurateEraseCheck::registerMatchers(MatchFinder *Finder) { } void InaccurateEraseCheck::check(const MatchFinder::MatchResult &Result) { - const auto *MemberCall = - Result.Nodes.getNodeAs("erase"); - const auto *EndExpr = - Result.Nodes.getNodeAs("end"); + const auto *MemberCall = Result.Nodes.getNodeAs("erase"); + const auto *EndExpr = Result.Nodes.getNodeAs("end"); const SourceLocation Loc = MemberCall->getBeginLoc(); FixItHint Hint; diff --git a/clang-tools-extra/clang-tidy/bugprone/IncDecInConditionsCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/IncDecInConditionsCheck.cpp index 9b3b01eb02683..73bffe93146e6 100644 --- a/clang-tools-extra/clang-tidy/bugprone/IncDecInConditionsCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/IncDecInConditionsCheck.cpp @@ -15,6 +15,8 @@ using namespace clang::ast_matchers; namespace clang::tidy::bugprone { +namespace { + AST_MATCHER(BinaryOperator, isLogicalOperator) { return Node.isLogicalOp(); } AST_MATCHER(UnaryOperator, isUnaryPrePostOperator) { @@ -26,6 +28,8 @@ AST_MATCHER(CXXOperatorCallExpr, isPrePostOperator) { Node.getOperator() == OO_MinusMinus; } +} // namespace + void IncDecInConditionsCheck::registerMatchers(MatchFinder *Finder) { auto OperatorMatcher = expr( anyOf(binaryOperator(anyOf(isComparisonOperator(), isLogicalOperator())), diff --git a/clang-tools-extra/clang-tidy/bugprone/IncorrectRoundingsCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/IncorrectRoundingsCheck.cpp index 2a8d36215cc74..c2b0732a3e7bd 100644 --- a/clang-tools-extra/clang-tidy/bugprone/IncorrectRoundingsCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/IncorrectRoundingsCheck.cpp @@ -1,4 +1,4 @@ -//===--- IncorrectRoundingsCheck.cpp - clang-tidy ------------------------------===// +//===--- IncorrectRoundingsCheck.cpp - clang-tidy--------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. diff --git a/clang-tools-extra/clang-tidy/bugprone/InfiniteLoopCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/InfiniteLoopCheck.cpp index b7f0c08b2a7d4..07116a7ff15f5 100644 --- a/clang-tools-extra/clang-tidy/bugprone/InfiniteLoopCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/InfiniteLoopCheck.cpp @@ -83,8 +83,8 @@ static bool isVarThatIsPossiblyChanged(const Decl *Func, const Stmt *LoopStmt, isChanged(LoopStmt, Var, Context); // FIXME: Track references. } - } else if (isa(Cond)) { + } else if (isa(Cond)) { // FIXME: Handle MemberExpr. return true; } else if (const auto *CE = dyn_cast(Cond)) { @@ -274,8 +274,7 @@ static bool hasRecursionOverStaticLoopCondVariables(const Expr *Cond, void InfiniteLoopCheck::registerMatchers(MatchFinder *Finder) { const auto LoopCondition = allOf( - hasCondition( - expr(forCallable(decl().bind("func"))).bind("condition")), + hasCondition(expr(forCallable(decl().bind("func"))).bind("condition")), unless(hasBody(hasDescendant( loopEndingStmt(forCallable(equalsBoundNode("func"))))))); @@ -324,7 +323,7 @@ void InfiniteLoopCheck::check(const MatchFinder::MatchResult &Result) { diag(LoopStmt->getBeginLoc(), "this loop is infinite; none of its condition variables (%0)" " are updated in the loop body") - << CondVarNames; + << CondVarNames; } } diff --git a/clang-tools-extra/clang-tidy/bugprone/LambdaFunctionNameCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/LambdaFunctionNameCheck.cpp index 32f5edddfe80b..6d5c470616d1d 100644 --- a/clang-tools-extra/clang-tidy/bugprone/LambdaFunctionNameCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/LambdaFunctionNameCheck.cpp @@ -34,12 +34,11 @@ class MacroExpansionsWithFileAndLine : public PPCallbacks { LambdaFunctionNameCheck::SourceRangeSet *SME) : SuppressMacroExpansions(SME) {} - void MacroExpands(const Token &MacroNameTok, - const MacroDefinition &MD, SourceRange Range, - const MacroArgs *Args) override { + void MacroExpands(const Token &MacroNameTok, const MacroDefinition &MD, + SourceRange Range, const MacroArgs *Args) override { bool HasFile = false; bool HasLine = false; - for (const auto& T : MD.getMacroInfo()->tokens()) { + for (const Token &T : MD.getMacroInfo()->tokens()) { if (T.is(tok::identifier)) { StringRef IdentName = T.getIdentifierInfo()->getName(); if (IdentName == "__FILE__") { @@ -55,7 +54,7 @@ class MacroExpansionsWithFileAndLine : public PPCallbacks { } private: - LambdaFunctionNameCheck::SourceRangeSet* SuppressMacroExpansions; + LambdaFunctionNameCheck::SourceRangeSet *SuppressMacroExpansions; }; AST_MATCHER(CXXMethodDecl, isInLambda) { return Node.getParent()->isLambda(); } diff --git a/clang-tools-extra/clang-tidy/bugprone/MisplacedOperatorInStrlenInAllocCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/MisplacedOperatorInStrlenInAllocCheck.cpp index 40e4ab6c8b12a..5b166b4b3a9bf 100644 --- a/clang-tools-extra/clang-tidy/bugprone/MisplacedOperatorInStrlenInAllocCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/MisplacedOperatorInStrlenInAllocCheck.cpp @@ -74,7 +74,7 @@ void MisplacedOperatorInStrlenInAllocCheck::check( if (!Alloc) Alloc = Result.Nodes.getNodeAs("Alloc"); assert(Alloc && "Matched node bound by 'Alloc' should be either 'CallExpr'" - " or 'CXXNewExpr'"); + " or 'CXXNewExpr'"); const auto *StrLen = Result.Nodes.getNodeAs("StrLen"); const auto *BinOp = Result.Nodes.getNodeAs("BinOp"); diff --git a/clang-tools-extra/clang-tidy/bugprone/MisplacedOperatorInStrlenInAllocCheck.h b/clang-tools-extra/clang-tidy/bugprone/MisplacedOperatorInStrlenInAllocCheck.h index 3a09ddb4a6c03..93cf50d0b1c6f 100644 --- a/clang-tools-extra/clang-tidy/bugprone/MisplacedOperatorInStrlenInAllocCheck.h +++ b/clang-tools-extra/clang-tidy/bugprone/MisplacedOperatorInStrlenInAllocCheck.h @@ -21,7 +21,8 @@ namespace clang::tidy::bugprone { /// http://clang.llvm.org/extra/clang-tidy/checks/bugprone/misplaced-operator-in-strlen-in-alloc.html class MisplacedOperatorInStrlenInAllocCheck : public ClangTidyCheck { public: - MisplacedOperatorInStrlenInAllocCheck(StringRef Name, ClangTidyContext *Context) + MisplacedOperatorInStrlenInAllocCheck(StringRef Name, + ClangTidyContext *Context) : ClangTidyCheck(Name, Context) {} void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; diff --git a/clang-tools-extra/clang-tidy/bugprone/MisplacedPointerArithmeticInAllocCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/MisplacedPointerArithmeticInAllocCheck.cpp index b9129fa0811c6..86785d36696dc 100644 --- a/clang-tools-extra/clang-tidy/bugprone/MisplacedPointerArithmeticInAllocCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/MisplacedPointerArithmeticInAllocCheck.cpp @@ -76,8 +76,8 @@ void MisplacedPointerArithmeticInAllocCheck::check( } else { const auto *CtrE = New->getConstructExpr(); if (!CtrE || !CtrE->getArg(CtrE->getNumArgs() - 1) - ->getType() - ->isIntegralOrEnumerationType()) + ->getType() + ->isIntegralOrEnumerationType()) return; CallName = "operator new"; } diff --git a/clang-tools-extra/clang-tidy/bugprone/MultiLevelImplicitPointerConversionCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/MultiLevelImplicitPointerConversionCheck.cpp index 7a989b07119aa..1a23473fdd229 100644 --- a/clang-tools-extra/clang-tidy/bugprone/MultiLevelImplicitPointerConversionCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/MultiLevelImplicitPointerConversionCheck.cpp @@ -57,6 +57,17 @@ AST_MATCHER(QualType, isPointerType) { } // namespace +MultiLevelImplicitPointerConversionCheck:: + MultiLevelImplicitPointerConversionCheck(StringRef Name, + ClangTidyContext *Context) + : ClangTidyCheck(Name, Context), EnableInC(Options.get("EnableInC", true)) { +} + +void MultiLevelImplicitPointerConversionCheck::storeOptions( + ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "EnableInC", EnableInC); +} + void MultiLevelImplicitPointerConversionCheck::registerMatchers( MatchFinder *Finder) { Finder->addMatcher( diff --git a/clang-tools-extra/clang-tidy/bugprone/MultiLevelImplicitPointerConversionCheck.h b/clang-tools-extra/clang-tidy/bugprone/MultiLevelImplicitPointerConversionCheck.h index 13228145ff35f..ef5f9f103c893 100644 --- a/clang-tools-extra/clang-tidy/bugprone/MultiLevelImplicitPointerConversionCheck.h +++ b/clang-tools-extra/clang-tidy/bugprone/MultiLevelImplicitPointerConversionCheck.h @@ -21,11 +21,17 @@ namespace clang::tidy::bugprone { class MultiLevelImplicitPointerConversionCheck : public ClangTidyCheck { public: MultiLevelImplicitPointerConversionCheck(StringRef Name, - ClangTidyContext *Context) - : ClangTidyCheck(Name, Context) {} + ClangTidyContext *Context); + void storeOptions(ClangTidyOptions::OptionMap &Opts) override; void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; std::optional getCheckTraversalKind() const override; + bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { + return EnableInC ? true : LangOpts.CPlusPlus; + } + +private: + bool const EnableInC; }; } // namespace clang::tidy::bugprone diff --git a/clang-tools-extra/clang-tidy/bugprone/MultipleNewInOneExpressionCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/MultipleNewInOneExpressionCheck.cpp index 41191a3cfed23..b68888cb5b928 100644 --- a/clang-tools-extra/clang-tidy/bugprone/MultipleNewInOneExpressionCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/MultipleNewInOneExpressionCheck.cpp @@ -49,8 +49,6 @@ bool isExprValueStored(const Expr *E, ASTContext &C) { return isa(ParentE); } -} // namespace - AST_MATCHER_P(CXXTryStmt, hasHandlerFor, ast_matchers::internal::Matcher, InnerMatcher) { for (unsigned NH = Node.getNumHandlers(), I = 0; I < NH; ++I) { @@ -74,6 +72,8 @@ AST_MATCHER(CXXNewExpr, mayThrow) { return !OperatorNew->getType()->castAs()->isNothrow(); } +} // namespace + void MultipleNewInOneExpressionCheck::registerMatchers(MatchFinder *Finder) { auto BadAllocType = recordType(hasDeclaration(cxxRecordDecl(hasName("::std::bad_alloc")))); @@ -95,16 +95,14 @@ void MultipleNewInOneExpressionCheck::registerMatchers(MatchFinder *Finder) { Finder->addMatcher( callExpr( - hasAnyArgument( - expr(HasNewExpr1).bind("arg1")), + hasAnyArgument(expr(HasNewExpr1).bind("arg1")), hasAnyArgument( expr(HasNewExpr2, unless(equalsBoundNode("arg1"))).bind("arg2")), hasAncestor(BadAllocCatchingTryBlock)), this); Finder->addMatcher( cxxConstructExpr( - hasAnyArgument( - expr(HasNewExpr1).bind("arg1")), + hasAnyArgument(expr(HasNewExpr1).bind("arg1")), hasAnyArgument( expr(HasNewExpr2, unless(equalsBoundNode("arg1"))).bind("arg2")), unless(isListInitialization()), diff --git a/clang-tools-extra/clang-tidy/bugprone/NotNullTerminatedResultCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/NotNullTerminatedResultCheck.cpp index 977241e91b9a9..bedecb60569e8 100644 --- a/clang-tools-extra/clang-tidy/bugprone/NotNullTerminatedResultCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/NotNullTerminatedResultCheck.cpp @@ -677,7 +677,7 @@ void NotNullTerminatedResultCheck::registerMatchers(MatchFinder *Finder) { std::optional SourcePos, unsigned LengthPos, bool WithIncrease) : Name(Name), DestinationPos(DestinationPos), SourcePos(SourcePos), - LengthPos(LengthPos), WithIncrease(WithIncrease){}; + LengthPos(LengthPos), WithIncrease(WithIncrease) {}; StringRef Name; std::optional DestinationPos; diff --git a/clang-tools-extra/clang-tidy/bugprone/PosixReturnCheck.h b/clang-tools-extra/clang-tidy/bugprone/PosixReturnCheck.h index 254ae6c7f1acc..e9d2263b06bc9 100644 --- a/clang-tools-extra/clang-tidy/bugprone/PosixReturnCheck.h +++ b/clang-tools-extra/clang-tidy/bugprone/PosixReturnCheck.h @@ -13,7 +13,7 @@ namespace clang::tidy::bugprone { -class PosixReturnCheck: public ClangTidyCheck { +class PosixReturnCheck : public ClangTidyCheck { public: PosixReturnCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context) {} diff --git a/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp index 95fbca2ad0083..e717564847e4a 100644 --- a/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp @@ -1,4 +1,4 @@ -//===--- RedundantBranchConditionCheck.cpp - clang-tidy -------------------------===// +//===--- RedundantBranchConditionCheck.cpp - clang-tidy--------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -70,7 +70,8 @@ void RedundantBranchConditionCheck::registerMatchers(MatchFinder *Finder) { // FIXME: Handle longer conjunctive and disjunctive clauses. } -void RedundantBranchConditionCheck::check(const MatchFinder::MatchResult &Result) { +void RedundantBranchConditionCheck::check( + const MatchFinder::MatchResult &Result) { const auto *OuterIf = Result.Nodes.getNodeAs(OuterIfStr); const auto *InnerIf = Result.Nodes.getNodeAs(InnerIfStr); const auto *CondVar = Result.Nodes.getNodeAs(CondVarStr); diff --git a/clang-tools-extra/clang-tidy/bugprone/SignalHandlerCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/SignalHandlerCheck.cpp index c066b3e7b19a5..d5cbb847eea98 100644 --- a/clang-tools-extra/clang-tidy/bugprone/SignalHandlerCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/SignalHandlerCheck.cpp @@ -22,7 +22,9 @@ constexpr llvm::StringLiteral MinimalConformingFunctions[] = { // mentioned POSIX specification was not updated after 'quick_exit' appeared // in the C11 standard. // Also, we want to keep the "minimal set" a subset of the "POSIX set". -// The list is repeated in bugprone-signal-handler.rst and should be kept up to date. +// The list is repeated in bugprone-signal-handler.rst and should be kept up to +// date. +// clang-format off constexpr llvm::StringLiteral POSIXConformingFunctions[] = { "_Exit", "_exit", @@ -215,7 +217,9 @@ constexpr llvm::StringLiteral POSIXConformingFunctions[] = { "wmemcpy", "wmemmove", "wmemset", - "write"}; + "write" +}; +// clang-format on using namespace clang::ast_matchers; @@ -322,12 +326,12 @@ SourceRange getSourceRangeOfStmt(const Stmt *S, ASTContext &Ctx) { return P.getSourceRange(); } -} // namespace - AST_MATCHER(FunctionDecl, isStandardFunction) { return isStandardFunction(&Node); } +} // namespace + SignalHandlerCheck::SignalHandlerCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), diff --git a/clang-tools-extra/clang-tidy/bugprone/SpuriouslyWakeUpFunctionsCheck.h b/clang-tools-extra/clang-tidy/bugprone/SpuriouslyWakeUpFunctionsCheck.h index 5e143411f9b6d..098299aea7dee 100644 --- a/clang-tools-extra/clang-tidy/bugprone/SpuriouslyWakeUpFunctionsCheck.h +++ b/clang-tools-extra/clang-tidy/bugprone/SpuriouslyWakeUpFunctionsCheck.h @@ -13,9 +13,9 @@ namespace clang::tidy::bugprone { -/// Finds ``cnd_wait``, ``cnd_timedwait``, ``wait``, ``wait_for``, or -/// ``wait_until`` function calls when the function is not invoked from a loop -/// that checks whether a condition predicate holds or the function has a +/// Finds ``cnd_wait``, ``cnd_timedwait``, ``wait``, ``wait_for``, or +/// ``wait_until`` function calls when the function is not invoked from a loop +/// that checks whether a condition predicate holds or the function has a /// condition parameter. /// /// For the user-facing documentation see: diff --git a/clang-tools-extra/clang-tidy/bugprone/StandaloneEmptyCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/StandaloneEmptyCheck.cpp index 682478ecead0b..5d9e91e0b82c7 100644 --- a/clang-tools-extra/clang-tidy/bugprone/StandaloneEmptyCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/StandaloneEmptyCheck.cpp @@ -46,7 +46,8 @@ using ast_matchers::stmtExpr; using ast_matchers::unless; using ast_matchers::voidType; -const Expr *getCondition(const BoundNodes &Nodes, const StringRef NodeId) { +static const Expr *getCondition(const BoundNodes &Nodes, + const StringRef NodeId) { const auto *If = Nodes.getNodeAs(NodeId); if (If != nullptr) return If->getCond(); diff --git a/clang-tools-extra/clang-tidy/bugprone/StringLiteralWithEmbeddedNulCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/StringLiteralWithEmbeddedNulCheck.cpp index 72e680d25cb84..444f3081b704d 100644 --- a/clang-tools-extra/clang-tidy/bugprone/StringLiteralWithEmbeddedNulCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/StringLiteralWithEmbeddedNulCheck.cpp @@ -47,8 +47,9 @@ void StringLiteralWithEmbeddedNulCheck::registerMatchers(MatchFinder *Finder) { // Detect passing a suspicious string literal to a string constructor. // example: std::string str = "abc\0def"; - Finder->addMatcher(traverse(TK_AsIs, - cxxConstructExpr(StringConstructorExpr, hasArgument(0, StrLitWithNul))), + Finder->addMatcher( + traverse(TK_AsIs, cxxConstructExpr(StringConstructorExpr, + hasArgument(0, StrLitWithNul))), this); // Detect passing a suspicious string literal through an overloaded operator. diff --git a/clang-tools-extra/clang-tidy/bugprone/StringviewNullptrCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/StringviewNullptrCheck.cpp index f944ae6c5b9e3..20789b3123e2f 100644 --- a/clang-tools-extra/clang-tidy/bugprone/StringviewNullptrCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/StringviewNullptrCheck.cpp @@ -33,7 +33,7 @@ AST_MATCHER(clang::VarDecl, isDirectInitialization) { } // namespace -RewriteRuleWith stringviewNullptrCheckImpl() { +static RewriteRuleWith stringviewNullptrCheckImpl() { auto ConstructionWarning = cat("constructing basic_string_view from null is undefined; replace with " "the default constructor"); diff --git a/clang-tools-extra/clang-tidy/bugprone/SuspiciousEnumUsageCheck.h b/clang-tools-extra/clang-tidy/bugprone/SuspiciousEnumUsageCheck.h index 63c4bea6e5657..c8a70c5f07043 100644 --- a/clang-tools-extra/clang-tidy/bugprone/SuspiciousEnumUsageCheck.h +++ b/clang-tools-extra/clang-tidy/bugprone/SuspiciousEnumUsageCheck.h @@ -1,4 +1,4 @@ -//===--- SuspiciousEnumUsageCheck.h - clang-tidy--------------------------*- C++ -*-===// +//===--- SuspiciousEnumUsageCheck.h - clang-tidy------------------*- C++-*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -28,7 +28,7 @@ class SuspiciousEnumUsageCheck : public ClangTidyCheck { } private: - void checkSuspiciousBitmaskUsage(const Expr*, const EnumDecl*); + void checkSuspiciousBitmaskUsage(const Expr *, const EnumDecl *); const bool StrictMode; }; diff --git a/clang-tools-extra/clang-tidy/bugprone/SuspiciousMemsetUsageCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/SuspiciousMemsetUsageCheck.cpp index a488d35ca7448..cc1bd622039bc 100644 --- a/clang-tools-extra/clang-tidy/bugprone/SuspiciousMemsetUsageCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/SuspiciousMemsetUsageCheck.cpp @@ -21,8 +21,7 @@ void SuspiciousMemsetUsageCheck::registerMatchers(MatchFinder *Finder) { // Match the standard memset: // void *memset(void *buffer, int fill_char, size_t byte_count); auto MemsetDecl = - functionDecl(hasName("::memset"), - parameterCountIs(3), + functionDecl(hasName("::memset"), parameterCountIs(3), hasParameter(0, hasType(pointerType(pointee(voidType())))), hasParameter(1, hasType(isInteger())), hasParameter(2, hasType(isInteger()))); diff --git a/clang-tools-extra/clang-tidy/bugprone/SuspiciousSemicolonCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/SuspiciousSemicolonCheck.cpp index 92b772dd26d45..e93ba760f447e 100644 --- a/clang-tools-extra/clang-tidy/bugprone/SuspiciousSemicolonCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/SuspiciousSemicolonCheck.cpp @@ -18,8 +18,7 @@ namespace clang::tidy::bugprone { void SuspiciousSemicolonCheck::registerMatchers(MatchFinder *Finder) { Finder->addMatcher( stmt(anyOf(ifStmt(hasThen(nullStmt().bind("semi")), - unless(hasElse(stmt())), - unless(isConstexpr())), + unless(hasElse(stmt())), unless(isConstexpr())), forStmt(hasBody(nullStmt().bind("semi"))), cxxForRangeStmt(hasBody(nullStmt().bind("semi"))), whileStmt(hasBody(nullStmt().bind("semi"))))) diff --git a/clang-tools-extra/clang-tidy/bugprone/UndelegatedConstructorCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/UndelegatedConstructorCheck.cpp index 9db14ab40ce59..a4c1fd53dfbe2 100644 --- a/clang-tools-extra/clang-tidy/bugprone/UndelegatedConstructorCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/UndelegatedConstructorCheck.cpp @@ -1,4 +1,4 @@ -//===--- UndelegatedConstructorCheck.cpp - clang-tidy --------------------------===// +//===--- UndelegatedConstructorCheck.cpp - clang-tidy----------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. diff --git a/clang-tools-extra/clang-tidy/bugprone/UnhandledExceptionAtNewCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/UnhandledExceptionAtNewCheck.cpp index ca4562aa9a44f..5e220017c97f4 100644 --- a/clang-tools-extra/clang-tidy/bugprone/UnhandledExceptionAtNewCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/UnhandledExceptionAtNewCheck.cpp @@ -12,6 +12,7 @@ using namespace clang::ast_matchers; namespace clang::tidy::bugprone { +namespace { AST_MATCHER_P(CXXTryStmt, hasHandlerFor, ast_matchers::internal::Matcher, InnerMatcher) { @@ -36,6 +37,8 @@ AST_MATCHER(CXXNewExpr, mayThrow) { return !OperatorNew->getType()->castAs()->isNothrow(); } +} // namespace + UnhandledExceptionAtNewCheck::UnhandledExceptionAtNewCheck( StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context) {} diff --git a/clang-tools-extra/clang-tidy/bugprone/UnusedRaiiCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/UnusedRaiiCheck.cpp index d96e7524172bd..b17d3868dd76a 100644 --- a/clang-tools-extra/clang-tidy/bugprone/UnusedRaiiCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/UnusedRaiiCheck.cpp @@ -37,8 +37,8 @@ void UnusedRaiiCheck::registerMatchers(MatchFinder *Finder) { } template -void reportDiagnostic(DiagnosticBuilder D, const T *Node, SourceRange SR, - bool DefaultConstruction) { +static void reportDiagnostic(DiagnosticBuilder D, const T *Node, SourceRange SR, + bool DefaultConstruction) { const char *Replacement = " give_me_a_name"; // If this is a default ctor we have to remove the parens or we'll introduce a diff --git a/clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp index 960133159dbbf..1bcacf96a4129 100644 --- a/clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp @@ -242,7 +242,7 @@ void UseAfterMoveFinder::getUsesAndReinits( }); } -bool isStandardSmartPointer(const ValueDecl *VD) { +static bool isStandardSmartPointer(const ValueDecl *VD) { const Type *TheType = VD->getType().getNonReferenceType().getTypePtrOrNull(); if (!TheType) return false; diff --git a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp index cc092a9627c5f..66fedabaf3ca6 100644 --- a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp @@ -250,8 +250,7 @@ class CERTModule : public ClangTidyModule { "cert-dcl51-cpp"); CheckFactories.registerCheck( "cert-dcl54-cpp"); - CheckFactories.registerCheck( - "cert-dcl58-cpp"); + CheckFactories.registerCheck("cert-dcl58-cpp"); CheckFactories.registerCheck( "cert-dcl59-cpp"); // ERR @@ -278,8 +277,7 @@ class CERTModule : public ClangTidyModule { "cert-oop54-cpp"); CheckFactories.registerCheck( "cert-oop57-cpp"); - CheckFactories.registerCheck( - "cert-oop58-cpp"); + CheckFactories.registerCheck("cert-oop58-cpp"); // C checkers // ARR @@ -360,6 +358,6 @@ static ClangTidyModuleRegistry::Add // This anchor is used to force the linker to link in the generated object file // and thus register the CERTModule. -volatile int CERTModuleAnchorSource = 0; +volatile int CERTModuleAnchorSource = 0; // NOLINT(misc-use-internal-linkage) } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/concurrency/ConcurrencyTidyModule.cpp b/clang-tools-extra/clang-tidy/concurrency/ConcurrencyTidyModule.cpp index a88ee46fc4abd..6c58c506dc903 100644 --- a/clang-tools-extra/clang-tidy/concurrency/ConcurrencyTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/concurrency/ConcurrencyTidyModule.cpp @@ -27,12 +27,14 @@ class ConcurrencyModule : public ClangTidyModule { } // namespace concurrency -// Register the ConcurrencyTidyModule using this statically initialized variable. +// Register the ConcurrencyTidyModule using this statically initialized +// variable. static ClangTidyModuleRegistry::Add X("concurrency-module", "Adds concurrency checks."); // This anchor is used to force the linker to link in the generated object file // and thus register the ConcurrencyModule. +// NOLINTNEXTLINE(misc-use-internal-linkage) volatile int ConcurrencyModuleAnchorSource = 0; } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp index 6adef04264347..4dd9b0904f075 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp @@ -156,6 +156,7 @@ static ClangTidyModuleRegistry::Add // This anchor is used to force the linker to link in the generated object file // and thus register the CppCoreGuidelinesModule. +// NOLINTNEXTLINE(misc-use-internal-linkage) volatile int CppCoreGuidelinesModuleAnchorSource = 0; } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp index d665c47d12bb4..aaaaf6b66b51a 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp @@ -433,21 +433,22 @@ void ProTypeMemberInitCheck::checkMissingMemberInitializer( // Gather all fields (direct and indirect) that need to be initialized. SmallPtrSet FieldsToInit; bool AnyMemberHasInitPerUnion = false; - forEachFieldWithFilter(ClassDecl, ClassDecl.fields(), - AnyMemberHasInitPerUnion, [&](const FieldDecl *F) { - if (IgnoreArrays && F->getType()->isArrayType()) - return; - if (F->hasInClassInitializer() && F->getParent()->isUnion()) { - AnyMemberHasInitPerUnion = true; - removeFieldInitialized(F, FieldsToInit); - } - if (!F->hasInClassInitializer() && - utils::type_traits::isTriviallyDefaultConstructible(F->getType(), - Context) && - !isEmpty(Context, F->getType()) && !F->isUnnamedBitField() && - !AnyMemberHasInitPerUnion) - FieldsToInit.insert(F); - }); + forEachFieldWithFilter( + ClassDecl, ClassDecl.fields(), AnyMemberHasInitPerUnion, + [&](const FieldDecl *F) { + if (IgnoreArrays && F->getType()->isArrayType()) + return; + if (F->hasInClassInitializer() && F->getParent()->isUnion()) { + AnyMemberHasInitPerUnion = true; + removeFieldInitialized(F, FieldsToInit); + } + if (!F->hasInClassInitializer() && + utils::type_traits::isTriviallyDefaultConstructible(F->getType(), + Context) && + !isEmpty(Context, F->getType()) && !F->isUnnamedBitField() && + !AnyMemberHasInitPerUnion) + FieldsToInit.insert(F); + }); if (FieldsToInit.empty()) return; @@ -500,17 +501,18 @@ void ProTypeMemberInitCheck::checkMissingMemberInitializer( AnyMemberHasInitPerUnion = false; forEachFieldWithFilter(ClassDecl, ClassDecl.fields(), AnyMemberHasInitPerUnion, [&](const FieldDecl *F) { - if (!FieldsToInit.count(F)) - return; - // Don't suggest fixes for enums because we don't know a good default. - // Don't suggest fixes for bitfields because in-class initialization is not - // possible until C++20. - if (F->getType()->isEnumeralType() || - (!getLangOpts().CPlusPlus20 && F->isBitField())) - return; - FieldsToFix.insert(F); - AnyMemberHasInitPerUnion = true; - }); + if (!FieldsToInit.count(F)) + return; + // Don't suggest fixes for enums because we don't + // know a good default. Don't suggest fixes for + // bitfields because in-class initialization is not + // possible until C++20. + if (F->getType()->isEnumeralType() || + (!getLangOpts().CPlusPlus20 && F->isBitField())) + return; + FieldsToFix.insert(F); + AnyMemberHasInitPerUnion = true; + }); if (FieldsToFix.empty()) return; diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/SlicingCheck.h b/clang-tools-extra/clang-tidy/cppcoreguidelines/SlicingCheck.h index 00f6e93fec200..02bfaf1205f40 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/SlicingCheck.h +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/SlicingCheck.h @@ -14,11 +14,7 @@ namespace clang::tidy::cppcoreguidelines { /// Flags slicing (incomplete copying of an object's state) of member variables -/// or vtable. See: -/// - https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#es63-dont-slice -/// for the former, and -/// - https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c145-access-polymorphic-objects-through-pointers-and-references -/// for the latter +/// or vtable. /// /// For the user-facing documentation see: /// http://clang.llvm.org/extra/clang-tidy/checks/cppcoreguidelines/slicing.html diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.cpp index b1da3b9861c69..0de143dbb1b89 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.cpp @@ -116,7 +116,8 @@ void SpecialMemberFunctionsCheck::check( if (!MatchedDecl) return; - ClassDefId ID(MatchedDecl->getLocation(), std::string(MatchedDecl->getName())); + ClassDefId ID(MatchedDecl->getLocation(), + std::string(MatchedDecl->getName())); auto StoreMember = [this, &ID](SpecialMemberFunctionData Data) { llvm::SmallVectorImpl &Members = diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.h b/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.h index 9ebc03ed2fa13..dee01cb5a9fdd 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.h +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.h @@ -84,13 +84,12 @@ struct DenseMapInfo< clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::ClassDefId; static inline ClassDefId getEmptyKey() { - return {DenseMapInfo::getEmptyKey(), - "EMPTY"}; + return {DenseMapInfo::getEmptyKey(), "EMPTY"}; } static inline ClassDefId getTombstoneKey() { return {DenseMapInfo::getTombstoneKey(), - "TOMBSTONE"}; + "TOMBSTONE"}; } static unsigned getHashValue(ClassDefId Val) { diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/VirtualClassDestructorCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/VirtualClassDestructorCheck.cpp index aa70b3896f16d..e31d046565677 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/VirtualClassDestructorCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/VirtualClassDestructorCheck.cpp @@ -18,6 +18,8 @@ using namespace clang::ast_matchers; namespace clang::tidy::cppcoreguidelines { +namespace { + AST_MATCHER(CXXRecordDecl, hasPublicVirtualOrProtectedNonVirtualDestructor) { // We need to call Node.getDestructor() instead of matching a // CXXDestructorDecl. Otherwise, tests will fail for class templates, since @@ -33,6 +35,8 @@ AST_MATCHER(CXXRecordDecl, hasPublicVirtualOrProtectedNonVirtualDestructor) { !Destructor->isVirtual())); } +} // namespace + void VirtualClassDestructorCheck::registerMatchers(MatchFinder *Finder) { ast_matchers::internal::Matcher InheritsVirtualMethod = hasAnyBase(hasType(cxxRecordDecl(has(cxxMethodDecl(isVirtual()))))); diff --git a/clang-tools-extra/clang-tidy/darwin/AvoidSpinlockCheck.h b/clang-tools-extra/clang-tidy/darwin/AvoidSpinlockCheck.h index 727878b258b2c..5b5285710c3b0 100644 --- a/clang-tools-extra/clang-tidy/darwin/AvoidSpinlockCheck.h +++ b/clang-tools-extra/clang-tidy/darwin/AvoidSpinlockCheck.h @@ -19,7 +19,7 @@ namespace clang::tidy::darwin { /// For the user-facing documentation see: /// http://clang.llvm.org/extra/clang-tidy/checks/darwin/avoid-spinlock.html class AvoidSpinlockCheck : public ClangTidyCheck { - public: +public: AvoidSpinlockCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context) {} void registerMatchers(ast_matchers::MatchFinder *Finder) override; @@ -28,4 +28,4 @@ class AvoidSpinlockCheck : public ClangTidyCheck { } // namespace clang::tidy::darwin -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_DARWIN_AVOIDSPINLOCKCHECK_H +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_DARWIN_AVOIDSPINLOCKCHECK_H diff --git a/clang-tools-extra/clang-tidy/darwin/DarwinTidyModule.cpp b/clang-tools-extra/clang-tidy/darwin/DarwinTidyModule.cpp index 3475deada499d..bc8c91a9ed413 100644 --- a/clang-tools-extra/clang-tidy/darwin/DarwinTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/darwin/DarwinTidyModule.cpp @@ -18,8 +18,7 @@ namespace darwin { class DarwinModule : public ClangTidyModule { public: void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { - CheckFactories.registerCheck( - "darwin-avoid-spinlock"); + CheckFactories.registerCheck("darwin-avoid-spinlock"); CheckFactories.registerCheck( "darwin-dispatch-once-nonstatic"); } @@ -33,6 +32,6 @@ static ClangTidyModuleRegistry::Add // This anchor is used to force the linker to link in the generated object file // and thus register the DarwinModule. -volatile int DarwinModuleAnchorSource = 0; +volatile int DarwinModuleAnchorSource = 0; // NOLINT(misc-use-internal-linkage) } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/fuchsia/FuchsiaTidyModule.cpp b/clang-tools-extra/clang-tidy/fuchsia/FuchsiaTidyModule.cpp index 45a79b75e0937..d7a70b39bdc55 100644 --- a/clang-tools-extra/clang-tidy/fuchsia/FuchsiaTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/fuchsia/FuchsiaTidyModule.cpp @@ -52,6 +52,6 @@ static ClangTidyModuleRegistry::Add // This anchor is used to force the linker to link in the generated object file // and thus register the FuchsiaModule. -volatile int FuchsiaModuleAnchorSource = 0; +volatile int FuchsiaModuleAnchorSource = 0; // NOLINT(misc-use-internal-linkage) } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/fuchsia/MultipleInheritanceCheck.cpp b/clang-tools-extra/clang-tidy/fuchsia/MultipleInheritanceCheck.cpp index b5ce23ae8feda..80ff97a762134 100644 --- a/clang-tools-extra/clang-tidy/fuchsia/MultipleInheritanceCheck.cpp +++ b/clang-tools-extra/clang-tidy/fuchsia/MultipleInheritanceCheck.cpp @@ -49,7 +49,8 @@ bool MultipleInheritanceCheck::getInterfaceStatus(const CXXRecordDecl *Node, bool MultipleInheritanceCheck::isCurrentClassInterface( const CXXRecordDecl *Node) const { // Interfaces should have no fields. - if (!Node->field_empty()) return false; + if (!Node->field_empty()) + return false; // Interfaces should have exclusively pure methods. return llvm::none_of(Node->methods(), [](const CXXMethodDecl *M) { @@ -68,11 +69,14 @@ bool MultipleInheritanceCheck::isInterface(const CXXRecordDecl *Node) { // To be an interface, all base classes must be interfaces as well. for (const auto &I : Node->bases()) { - if (I.isVirtual()) continue; + if (I.isVirtual()) + continue; const auto *Ty = I.getType()->getAs(); - if (!Ty) continue; + if (!Ty) + continue; const RecordDecl *D = Ty->getDecl()->getDefinition(); - if (!D) continue; + if (!D) + continue; const auto *Base = cast(D); if (!isInterface(Base)) { addNodeToInterfaceMap(Node, false); @@ -97,20 +101,25 @@ void MultipleInheritanceCheck::check(const MatchFinder::MatchResult &Result) { // concrete classes unsigned NumConcrete = 0; for (const auto &I : D->bases()) { - if (I.isVirtual()) continue; + if (I.isVirtual()) + continue; const auto *Ty = I.getType()->getAs(); - if (!Ty) continue; + if (!Ty) + continue; const auto *Base = cast(Ty->getDecl()->getDefinition()); - if (!isInterface(Base)) NumConcrete++; + if (!isInterface(Base)) + NumConcrete++; } // Check virtual bases to see if there is more than one concrete // non-virtual base. for (const auto &V : D->vbases()) { const auto *Ty = V.getType()->getAs(); - if (!Ty) continue; + if (!Ty) + continue; const auto *Base = cast(Ty->getDecl()->getDefinition()); - if (!isInterface(Base)) NumConcrete++; + if (!isInterface(Base)) + NumConcrete++; } if (NumConcrete > 1) { diff --git a/clang-tools-extra/clang-tidy/fuchsia/StaticallyConstructedObjectsCheck.h b/clang-tools-extra/clang-tidy/fuchsia/StaticallyConstructedObjectsCheck.h index fc18273ad73b8..6c65c8cfeb22f 100644 --- a/clang-tools-extra/clang-tidy/fuchsia/StaticallyConstructedObjectsCheck.h +++ b/clang-tools-extra/clang-tidy/fuchsia/StaticallyConstructedObjectsCheck.h @@ -14,7 +14,7 @@ namespace clang::tidy::fuchsia { /// Constructing global, non-trivial objects with static storage is -/// disallowed, unless the object is statically initialized with a constexpr +/// disallowed, unless the object is statically initialized with a constexpr /// constructor or has no explicit constructor. /// /// For the user-facing documentation see: diff --git a/clang-tools-extra/clang-tidy/fuchsia/TrailingReturnCheck.h b/clang-tools-extra/clang-tidy/fuchsia/TrailingReturnCheck.h index 2ba8e27d00bfd..70551844898f1 100644 --- a/clang-tools-extra/clang-tidy/fuchsia/TrailingReturnCheck.h +++ b/clang-tools-extra/clang-tidy/fuchsia/TrailingReturnCheck.h @@ -13,8 +13,8 @@ namespace clang::tidy::fuchsia { -/// Functions that have trailing returns are disallowed, except for those -/// using decltype specifiers and lambda with otherwise unutterable +/// Functions that have trailing returns are disallowed, except for those +/// using decltype specifiers and lambda with otherwise unutterable /// return types. /// /// For the user-facing documentation see: diff --git a/clang-tools-extra/clang-tidy/fuchsia/VirtualInheritanceCheck.cpp b/clang-tools-extra/clang-tidy/fuchsia/VirtualInheritanceCheck.cpp index 9c367423fdb53..20bd036fb265f 100644 --- a/clang-tools-extra/clang-tidy/fuchsia/VirtualInheritanceCheck.cpp +++ b/clang-tools-extra/clang-tidy/fuchsia/VirtualInheritanceCheck.cpp @@ -16,10 +16,13 @@ namespace clang::tidy::fuchsia { namespace { AST_MATCHER(CXXRecordDecl, hasDirectVirtualBaseClass) { - if (!Node.hasDefinition()) return false; - if (!Node.getNumVBases()) return false; + if (!Node.hasDefinition()) + return false; + if (!Node.getNumVBases()) + return false; for (const CXXBaseSpecifier &Base : Node.bases()) - if (Base.isVirtual()) return true; + if (Base.isVirtual()) + return true; return false; } } // namespace diff --git a/clang-tools-extra/clang-tidy/fuchsia/VirtualInheritanceCheck.h b/clang-tools-extra/clang-tidy/fuchsia/VirtualInheritanceCheck.h index d109bd52a1a66..426d89d046a63 100644 --- a/clang-tools-extra/clang-tidy/fuchsia/VirtualInheritanceCheck.h +++ b/clang-tools-extra/clang-tidy/fuchsia/VirtualInheritanceCheck.h @@ -18,7 +18,7 @@ namespace clang::tidy::fuchsia { /// For the user-facing documentation see: /// http://clang.llvm.org/extra/clang-tidy/checks/fuchsia/virtual-inheritance.html class VirtualInheritanceCheck : public ClangTidyCheck { - public: +public: VirtualInheritanceCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context) {} void registerMatchers(ast_matchers::MatchFinder *Finder) override; @@ -27,4 +27,4 @@ class VirtualInheritanceCheck : public ClangTidyCheck { } // namespace clang::tidy::fuchsia -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_FUCHSIA_VIRTUAL_INHERITANCE_H +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_FUCHSIA_VIRTUAL_INHERITANCE_H diff --git a/clang-tools-extra/clang-tidy/google/AvoidCStyleCastsCheck.cpp b/clang-tools-extra/clang-tidy/google/AvoidCStyleCastsCheck.cpp index 3109bbb3724c7..e076b39b5d978 100644 --- a/clang-tools-extra/clang-tidy/google/AvoidCStyleCastsCheck.cpp +++ b/clang-tools-extra/clang-tidy/google/AvoidCStyleCastsCheck.cpp @@ -120,8 +120,8 @@ void AvoidCStyleCastsCheck::check(const MatchFinder::MatchResult &Result) { IsFunction(SourceTypeAsWritten) && IsFunction(DestTypeAsWritten); const bool ConstructorCast = !CastExpr->getTypeAsWritten().hasQualifiers() && - DestTypeAsWritten->isRecordType() && - !DestTypeAsWritten->isElaboratedTypeSpecifier(); + DestTypeAsWritten->isRecordType() && + !DestTypeAsWritten->isElaboratedTypeSpecifier(); if (CastExpr->getCastKind() == CK_NoOp && !FnToFnCast) { // Function pointer/reference casts may be needed to resolve ambiguities in diff --git a/clang-tools-extra/clang-tidy/google/AvoidThrowingObjCExceptionCheck.h b/clang-tools-extra/clang-tidy/google/AvoidThrowingObjCExceptionCheck.h index f8b191a376204..58b46e0a075a4 100644 --- a/clang-tools-extra/clang-tidy/google/AvoidThrowingObjCExceptionCheck.h +++ b/clang-tools-extra/clang-tidy/google/AvoidThrowingObjCExceptionCheck.h @@ -20,7 +20,7 @@ namespace clang::tidy::google::objc { /// For the user-facing documentation see: /// http://clang.llvm.org/extra/clang-tidy/checks/google/objc-avoid-throwing-exception.html class AvoidThrowingObjCExceptionCheck : public ClangTidyCheck { - public: +public: AvoidThrowingObjCExceptionCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context) {} bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { @@ -32,4 +32,4 @@ class AvoidThrowingObjCExceptionCheck : public ClangTidyCheck { } // namespace clang::tidy::google::objc -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_GOOGLE_OBJC_AVOID_THROWING_EXCEPTION_H +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_GOOGLE_OBJC_AVOID_THROWING_EXCEPTION_H diff --git a/clang-tools-extra/clang-tidy/google/ExplicitConstructorCheck.cpp b/clang-tools-extra/clang-tidy/google/ExplicitConstructorCheck.cpp index 6f26de9881357..3deea0620514b 100644 --- a/clang-tools-extra/clang-tidy/google/ExplicitConstructorCheck.cpp +++ b/clang-tools-extra/clang-tidy/google/ExplicitConstructorCheck.cpp @@ -85,7 +85,7 @@ void ExplicitConstructorCheck::check(const MatchFinder::MatchResult &Result) { "%0 explicit expression evaluates to 'false'"; if (const auto *Conversion = - Result.Nodes.getNodeAs("conversion")) { + Result.Nodes.getNodeAs("conversion")) { if (Conversion->isOutOfLine()) return; SourceLocation Loc = Conversion->getLocation(); diff --git a/clang-tools-extra/clang-tidy/google/GlobalNamesInHeadersCheck.cpp b/clang-tools-extra/clang-tidy/google/GlobalNamesInHeadersCheck.cpp index cba8d71ab6a31..459dee1247525 100644 --- a/clang-tools-extra/clang-tidy/google/GlobalNamesInHeadersCheck.cpp +++ b/clang-tools-extra/clang-tidy/google/GlobalNamesInHeadersCheck.cpp @@ -1,4 +1,4 @@ -//===--- GlobalNamesInHeadersCheck.cpp - clang-tidy -----------------*- C++ -*-===// +//===--- GlobalNamesInHeadersCheck.cpp - clang-tidy --------------*- C++-*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. diff --git a/clang-tools-extra/clang-tidy/google/GlobalVariableDeclarationCheck.cpp b/clang-tools-extra/clang-tidy/google/GlobalVariableDeclarationCheck.cpp index 018d49fa5a22b..9082c9368d87d 100644 --- a/clang-tools-extra/clang-tidy/google/GlobalVariableDeclarationCheck.cpp +++ b/clang-tools-extra/clang-tidy/google/GlobalVariableDeclarationCheck.cpp @@ -52,7 +52,7 @@ FixItHint generateFixItHint(const VarDecl *Decl, bool IsConst) { CharSourceRange::getTokenRange(SourceRange(Decl->getLocation())), llvm::StringRef(NewName)); } -} // namespace +} // namespace void GlobalVariableDeclarationCheck::registerMatchers(MatchFinder *Finder) { // need to add two matchers since we need to bind different ids to distinguish diff --git a/clang-tools-extra/clang-tidy/google/GlobalVariableDeclarationCheck.h b/clang-tools-extra/clang-tidy/google/GlobalVariableDeclarationCheck.h index 550224b26d140..19e6c5dbc8e22 100644 --- a/clang-tools-extra/clang-tidy/google/GlobalVariableDeclarationCheck.h +++ b/clang-tools-extra/clang-tidy/google/GlobalVariableDeclarationCheck.h @@ -20,7 +20,7 @@ namespace clang::tidy::google::objc { /// For the user-facing documentation see: /// http://clang.llvm.org/extra/clang-tidy/checks/google/objc-global-variable-declaration.html class GlobalVariableDeclarationCheck : public ClangTidyCheck { - public: +public: GlobalVariableDeclarationCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context) {} bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { @@ -32,4 +32,4 @@ class GlobalVariableDeclarationCheck : public ClangTidyCheck { } // namespace clang::tidy::google::objc -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_GOOGLE_OBJC_GLOBAL_VARIABLE_DECLARATION_H +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_GOOGLE_OBJC_GLOBAL_VARIABLE_DECLARATION_H diff --git a/clang-tools-extra/clang-tidy/google/GoogleTidyModule.cpp b/clang-tools-extra/clang-tidy/google/GoogleTidyModule.cpp index 830a37af1accf..5343e2b3a5975 100644 --- a/clang-tools-extra/clang-tidy/google/GoogleTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/google/GoogleTidyModule.cpp @@ -35,7 +35,7 @@ namespace clang::tidy { namespace google { class GoogleModule : public ClangTidyModule { - public: +public: void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { CheckFactories.registerCheck( "google-build-explicit-make-pair"); @@ -96,10 +96,10 @@ class GoogleModule : public ClangTidyModule { static ClangTidyModuleRegistry::Add X("google-module", "Adds Google lint checks."); -} // namespace google +} // namespace google // This anchor is used to force the linker to link in the generated object file // and thus register the GoogleModule. -volatile int GoogleModuleAnchorSource = 0; +volatile int GoogleModuleAnchorSource = 0; // NOLINT(misc-use-internal-linkage) } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/google/IntegerTypesCheck.cpp b/clang-tools-extra/clang-tidy/google/IntegerTypesCheck.cpp index 359d8efd100ba..711444fa9bcdc 100644 --- a/clang-tools-extra/clang-tidy/google/IntegerTypesCheck.cpp +++ b/clang-tools-extra/clang-tidy/google/IntegerTypesCheck.cpp @@ -172,8 +172,8 @@ void IntegerTypesCheck::check(const MatchFinder::MatchResult &Result) { // We don't add a fix-it as changing the type can easily break code, // e.g. when a function requires a 'long' argument on all platforms. // QualTypes are printed with implicit quotes. - diag(Loc, "consider replacing %0 with '%1'") << BuiltinLoc.getType() - << Replacement; + diag(Loc, "consider replacing %0 with '%1'") + << BuiltinLoc.getType() << Replacement; } } // namespace tidy::google::runtime diff --git a/clang-tools-extra/clang-tidy/google/UnnamedNamespaceInHeaderCheck.cpp b/clang-tools-extra/clang-tidy/google/UnnamedNamespaceInHeaderCheck.cpp index 3db27868fccaf..c1e421308d77d 100644 --- a/clang-tools-extra/clang-tidy/google/UnnamedNamespaceInHeaderCheck.cpp +++ b/clang-tools-extra/clang-tidy/google/UnnamedNamespaceInHeaderCheck.cpp @@ -21,8 +21,8 @@ UnnamedNamespaceInHeaderCheck::UnnamedNamespaceInHeaderCheck( void UnnamedNamespaceInHeaderCheck::registerMatchers( ast_matchers::MatchFinder *Finder) { - Finder->addMatcher(namespaceDecl(isAnonymous()).bind("anonymousNamespace"), - this); + Finder->addMatcher(namespaceDecl(isAnonymous()).bind("anonymousNamespace"), + this); } void UnnamedNamespaceInHeaderCheck::check( diff --git a/clang-tools-extra/clang-tidy/google/UsingNamespaceDirectiveCheck.cpp b/clang-tools-extra/clang-tidy/google/UsingNamespaceDirectiveCheck.cpp index e9734e54a13e2..26d27c19f489e 100644 --- a/clang-tools-extra/clang-tidy/google/UsingNamespaceDirectiveCheck.cpp +++ b/clang-tools-extra/clang-tidy/google/UsingNamespaceDirectiveCheck.cpp @@ -16,7 +16,7 @@ namespace clang::tidy::google::build { void UsingNamespaceDirectiveCheck::registerMatchers( ast_matchers::MatchFinder *Finder) { - Finder->addMatcher(usingDirectiveDecl().bind("usingNamespace"), this); + Finder->addMatcher(usingDirectiveDecl().bind("usingNamespace"), this); } void UsingNamespaceDirectiveCheck::check( diff --git a/clang-tools-extra/clang-tidy/hicpp/ExceptionBaseclassCheck.h b/clang-tools-extra/clang-tidy/hicpp/ExceptionBaseclassCheck.h index 036db35a2290b..79d8cf925d1b7 100644 --- a/clang-tools-extra/clang-tidy/hicpp/ExceptionBaseclassCheck.h +++ b/clang-tools-extra/clang-tidy/hicpp/ExceptionBaseclassCheck.h @@ -13,7 +13,8 @@ namespace clang::tidy::hicpp { -/// Check for thrown exceptions and enforce they are all derived from std::exception. +/// Check for thrown exceptions and enforce they are all derived from +/// std::exception. /// /// For the user-facing documentation see: /// http://clang.llvm.org/extra/clang-tidy/checks/hicpp/exception-baseclass.html diff --git a/clang-tools-extra/clang-tidy/hicpp/HICPPTidyModule.cpp b/clang-tools-extra/clang-tidy/hicpp/HICPPTidyModule.cpp index 38f3ab5ae85d3..65a56be3e5a05 100644 --- a/clang-tools-extra/clang-tidy/hicpp/HICPPTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/hicpp/HICPPTidyModule.cpp @@ -119,6 +119,6 @@ static ClangTidyModuleRegistry::Add // This anchor is used to force the linker to link in the generated object file // and thus register the HICPPModule. -volatile int HICPPModuleAnchorSource = 0; +volatile int HICPPModuleAnchorSource = 0; // NOLINT(misc-use-internal-linkage) } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/hicpp/MultiwayPathsCoveredCheck.cpp b/clang-tools-extra/clang-tidy/hicpp/MultiwayPathsCoveredCheck.cpp index 7028c3958f103..3f5cd4b473903 100644 --- a/clang-tools-extra/clang-tidy/hicpp/MultiwayPathsCoveredCheck.cpp +++ b/clang-tools-extra/clang-tidy/hicpp/MultiwayPathsCoveredCheck.cpp @@ -113,7 +113,7 @@ void MultiwayPathsCoveredCheck::check(const MatchFinder::MatchResult &Result) { } // Warns for degenerated 'switch' statements that neither define a case nor // a default label. - // FIXME: Evaluate, if emitting a fix-it to simplify that statement is + // FIXME: Evaluate, if emitting a fix-it to simplify that statement is // reasonable. if (!SwitchHasDefault && SwitchCaseCount == 0) { diag(Switch->getBeginLoc(), diff --git a/clang-tools-extra/clang-tidy/linuxkernel/LinuxKernelTidyModule.cpp b/clang-tools-extra/clang-tidy/linuxkernel/LinuxKernelTidyModule.cpp index e6d64ff61d261..b8b75b7ccaefe 100644 --- a/clang-tools-extra/clang-tidy/linuxkernel/LinuxKernelTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/linuxkernel/LinuxKernelTidyModule.cpp @@ -30,6 +30,7 @@ static ClangTidyModuleRegistry::Add // This anchor is used to force the linker to link in the generated object file // and thus register the LinuxKernelModule. +// NOLINTNEXTLINE(misc-use-internal-linkage) volatile int LinuxKernelModuleAnchorSource = 0; } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/linuxkernel/MustCheckErrsCheck.cpp b/clang-tools-extra/clang-tidy/linuxkernel/MustCheckErrsCheck.cpp index 149d0a94eaa5a..ce501ac2acca2 100644 --- a/clang-tools-extra/clang-tidy/linuxkernel/MustCheckErrsCheck.cpp +++ b/clang-tools-extra/clang-tidy/linuxkernel/MustCheckErrsCheck.cpp @@ -19,8 +19,7 @@ void MustCheckErrsCheck::registerMatchers(MatchFinder *Finder) { "ERR_CAST", "PTR_ERR_OR_ZERO")); auto NonCheckingStmts = stmt(anyOf(compoundStmt(), labelStmt())); Finder->addMatcher( - callExpr(callee(ErrFn), hasParent(NonCheckingStmts)).bind("call"), - this); + callExpr(callee(ErrFn), hasParent(NonCheckingStmts)).bind("call"), this); auto ReturnToCheck = returnStmt(hasReturnValue(callExpr(callee(ErrFn)))); auto ReturnsErrFn = functionDecl(hasDescendant(ReturnToCheck)); diff --git a/clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp b/clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp index e749163699b34..ceebde1595e7f 100644 --- a/clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp @@ -57,6 +57,6 @@ static ClangTidyModuleRegistry::Add X("llvm-module", // This anchor is used to force the linker to link in the generated object file // and thus register the LLVMModule. -volatile int LLVMModuleAnchorSource = 0; +volatile int LLVMModuleAnchorSource = 0; // NOLINT(misc-use-internal-linkage) } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/llvm/PreferIsaOrDynCastInConditionalsCheck.cpp b/clang-tools-extra/clang-tidy/llvm/PreferIsaOrDynCastInConditionalsCheck.cpp index 9333337777705..4c138bcc564d8 100644 --- a/clang-tools-extra/clang-tidy/llvm/PreferIsaOrDynCastInConditionalsCheck.cpp +++ b/clang-tools-extra/clang-tidy/llvm/PreferIsaOrDynCastInConditionalsCheck.cpp @@ -14,12 +14,11 @@ using namespace clang::ast_matchers; -namespace clang { -namespace ast_matchers { -AST_MATCHER(Expr, isMacroID) { return Node.getExprLoc().isMacroID(); } -} // namespace ast_matchers +namespace clang::tidy::llvm_check { -namespace tidy::llvm_check { +namespace { +AST_MATCHER(Expr, isMacroID) { return Node.getExprLoc().isMacroID(); } +} // namespace void PreferIsaOrDynCastInConditionalsCheck::registerMatchers( MatchFinder *Finder) { @@ -125,5 +124,4 @@ void PreferIsaOrDynCastInConditionalsCheck::check( } } -} // namespace tidy::llvm_check -} // namespace clang +} // namespace clang::tidy::llvm_check diff --git a/clang-tools-extra/clang-tidy/llvm/PreferIsaOrDynCastInConditionalsCheck.h b/clang-tools-extra/clang-tidy/llvm/PreferIsaOrDynCastInConditionalsCheck.h index dd9c5fec6af54..5b611096c25fd 100644 --- a/clang-tools-extra/clang-tidy/llvm/PreferIsaOrDynCastInConditionalsCheck.h +++ b/clang-tools-extra/clang-tidy/llvm/PreferIsaOrDynCastInConditionalsCheck.h @@ -15,8 +15,9 @@ namespace clang::tidy::llvm_check { /// Looks at conditionals and finds and replaces cases of ``cast<>``, which will /// assert rather than return a null pointer, and ``dyn_cast<>`` where -/// the return value is not captured. Additionally, finds and replaces cases that match the -/// pattern ``var && isa(var)``, where ``var`` is evaluated twice. +/// the return value is not captured. Additionally, finds and replaces cases +/// that match the pattern ``var && isa(var)``, where ``var`` is evaluated +/// twice. /// /// Finds cases like these: /// \code diff --git a/clang-tools-extra/clang-tidy/llvmlibc/CalleeNamespaceCheck.cpp b/clang-tools-extra/clang-tidy/llvmlibc/CalleeNamespaceCheck.cpp index d14cd2721d9a1..4bc4d5a4691f0 100644 --- a/clang-tools-extra/clang-tidy/llvmlibc/CalleeNamespaceCheck.cpp +++ b/clang-tools-extra/clang-tidy/llvmlibc/CalleeNamespaceCheck.cpp @@ -19,7 +19,7 @@ namespace clang::tidy::llvm_libc { // Gets the outermost namespace of a DeclContext, right under the Translation // Unit. -const DeclContext *getOutermostNamespace(const DeclContext *Decl) { +static const DeclContext *getOutermostNamespace(const DeclContext *Decl) { const DeclContext *Parent = Decl->getParent(); if (Parent->isTranslationUnit()) return Decl; diff --git a/clang-tools-extra/clang-tidy/llvmlibc/LLVMLibcTidyModule.cpp b/clang-tools-extra/clang-tidy/llvmlibc/LLVMLibcTidyModule.cpp index 7f26840be7372..562d71a0891c4 100644 --- a/clang-tools-extra/clang-tidy/llvmlibc/LLVMLibcTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/llvmlibc/LLVMLibcTidyModule.cpp @@ -39,6 +39,7 @@ static ClangTidyModuleRegistry::Add // This anchor is used to force the linker to link in the generated object file // and thus register the LLVMLibcModule. +// NOLINTNEXTLINE(misc-use-internal-linkage) volatile int LLVMLibcModuleAnchorSource = 0; } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/misc/MiscTidyModule.cpp b/clang-tools-extra/clang-tidy/misc/MiscTidyModule.cpp index 54bcebca7e186..6ddebcbc0e152 100644 --- a/clang-tools-extra/clang-tidy/misc/MiscTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/misc/MiscTidyModule.cpp @@ -92,6 +92,6 @@ static ClangTidyModuleRegistry::Add // This anchor is used to force the linker to link in the generated object file // and thus register the MiscModule. -volatile int MiscModuleAnchorSource = 0; +volatile int MiscModuleAnchorSource = 0; // NOLINT(misc-use-internal-linkage) } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/misc/ThrowByValueCatchByReferenceCheck.h b/clang-tools-extra/clang-tidy/misc/ThrowByValueCatchByReferenceCheck.h index 0d4df97c7bdfb..e3cc4c5e6cd41 100644 --- a/clang-tools-extra/clang-tidy/misc/ThrowByValueCatchByReferenceCheck.h +++ b/clang-tools-extra/clang-tidy/misc/ThrowByValueCatchByReferenceCheck.h @@ -13,7 +13,7 @@ namespace clang::tidy::misc { -///checks for locations that do not throw by value +/// Checks for locations that do not throw by value // or catch by reference. // The check is C++ only. It checks that all throw locations // throw by value and not by pointer. Additionally it diff --git a/clang-tools-extra/clang-tidy/modernize/AvoidBindCheck.cpp b/clang-tools-extra/clang-tidy/modernize/AvoidBindCheck.cpp index a41524af56800..c9477327742d7 100644 --- a/clang-tools-extra/clang-tidy/modernize/AvoidBindCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/AvoidBindCheck.cpp @@ -452,8 +452,8 @@ static bool isFixitSupported(const CallableInfo &Callee, return true; } -const FunctionDecl *getCallOperator(const CXXRecordDecl *Callable, - size_t NumArgs) { +static const FunctionDecl *getCallOperator(const CXXRecordDecl *Callable, + size_t NumArgs) { std::vector Candidates = findCandidateCallOperators(Callable, NumArgs); if (Candidates.size() != 1) @@ -462,7 +462,7 @@ const FunctionDecl *getCallOperator(const CXXRecordDecl *Callable, return Candidates.front(); } -const FunctionDecl * +static const FunctionDecl * getCallMethodDecl(const MatchFinder::MatchResult &Result, CallableType Type, CallableMaterializationKind Materialization) { diff --git a/clang-tools-extra/clang-tidy/modernize/DeprecatedIosBaseAliasesCheck.h b/clang-tools-extra/clang-tidy/modernize/DeprecatedIosBaseAliasesCheck.h index eb791ec128148..09cfebef48d48 100644 --- a/clang-tools-extra/clang-tidy/modernize/DeprecatedIosBaseAliasesCheck.h +++ b/clang-tools-extra/clang-tidy/modernize/DeprecatedIosBaseAliasesCheck.h @@ -13,8 +13,8 @@ namespace clang::tidy::modernize { -/// This check warns the uses of the deprecated member types of ``std::ios_base`` -/// and replaces those that have a non-deprecated equivalent. +/// This check warns the uses of the deprecated member types of +/// ``std::ios_base`` and replaces those that have a non-deprecated equivalent. /// /// For the user-facing documentation see: /// http://clang.llvm.org/extra/clang-tidy/checks/modernize/deprecated-ios-base-aliases.html diff --git a/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp b/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp index eb11ae6162028..6c6c626ec4fed 100644 --- a/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp @@ -114,7 +114,7 @@ arrayConditionMatcher(internal::Matcher LimitExpr) { /// Client code will need to make sure that: /// - The index variable is only used as an array index. /// - All arrays indexed by the loop are the same. -StatementMatcher makeArrayLoopMatcher() { +static StatementMatcher makeArrayLoopMatcher() { StatementMatcher ArrayBoundMatcher = expr(hasType(isInteger())).bind(ConditionBoundName); @@ -155,7 +155,7 @@ StatementMatcher makeArrayLoopMatcher() { /// /// Client code will need to make sure that: /// - The two containers on which 'begin' and 'end' are called are the same. -StatementMatcher makeIteratorLoopMatcher(bool IsReverse) { +static StatementMatcher makeIteratorLoopMatcher(bool IsReverse) { auto BeginNameMatcher = IsReverse ? hasAnyName("rbegin", "crbegin") : hasAnyName("begin", "cbegin"); @@ -267,7 +267,7 @@ StatementMatcher makeIteratorLoopMatcher(bool IsReverse) { /// - The index variable is only used in overloaded operator[] or /// container.at(). /// - The container's iterators would not be invalidated during the loop. -StatementMatcher makePseudoArrayLoopMatcher() { +static StatementMatcher makePseudoArrayLoopMatcher() { // Test that the incoming type has a record declaration that has methods // called 'begin' and 'end'. If the incoming type is const, then make sure // these methods are also marked const. diff --git a/clang-tools-extra/clang-tidy/modernize/LoopConvertUtils.cpp b/clang-tools-extra/clang-tidy/modernize/LoopConvertUtils.cpp index 93c231b0bdf08..3d0a1f01725fa 100644 --- a/clang-tools-extra/clang-tidy/modernize/LoopConvertUtils.cpp +++ b/clang-tools-extra/clang-tidy/modernize/LoopConvertUtils.cpp @@ -688,9 +688,8 @@ bool ForLoopIndexUseVisitor::TraverseArraySubscriptExpr(ArraySubscriptExpr *E) { if (!isIndexInSubscriptExpr(E->getIdx(), IndexVar)) return VisitorBase::TraverseArraySubscriptExpr(E); - if ((ContainerExpr && - !areSameExpr(Context, Arr->IgnoreParenImpCasts(), - ContainerExpr->IgnoreParenImpCasts())) || + if ((ContainerExpr && !areSameExpr(Context, Arr->IgnoreParenImpCasts(), + ContainerExpr->IgnoreParenImpCasts())) || !arrayMatchesBoundExpr(Context, Arr->IgnoreImpCasts()->getType(), ArrayBoundExpr)) { // If we have already discovered the array being indexed and this isn't it diff --git a/clang-tools-extra/clang-tidy/modernize/MacroToEnumCheck.cpp b/clang-tools-extra/clang-tidy/modernize/MacroToEnumCheck.cpp index ae88ec2abaf72..c2db858f72e32 100644 --- a/clang-tools-extra/clang-tidy/modernize/MacroToEnumCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/MacroToEnumCheck.cpp @@ -161,7 +161,7 @@ class MacroToEnumCallbacks : public PPCallbacks { checkName(MacroNameTok); } void Elifdef(SourceLocation Loc, SourceRange ConditionRange, - SourceLocation IfLoc) override { + SourceLocation IfLoc) override { PPCallbacks::Elifdef(Loc, ConditionRange, IfLoc); } void Elifndef(SourceLocation Loc, const Token &MacroNameTok, @@ -169,7 +169,7 @@ class MacroToEnumCallbacks : public PPCallbacks { checkName(MacroNameTok); } void Elifndef(SourceLocation Loc, SourceRange ConditionRange, - SourceLocation IfLoc) override { + SourceLocation IfLoc) override { PPCallbacks::Elifndef(Loc, ConditionRange, IfLoc); } void Endif(SourceLocation Loc, SourceLocation IfLoc) override; @@ -316,8 +316,7 @@ void MacroToEnumCallbacks::FileChanged(SourceLocation Loc, CurrentFile = &Files.back(); } -bool MacroToEnumCallbacks::isInitializer(ArrayRef MacroTokens) -{ +bool MacroToEnumCallbacks::isInitializer(ArrayRef MacroTokens) { IntegralLiteralExpressionMatcher Matcher(MacroTokens, LangOpts.C99 == 0); bool Matched = Matcher.match(); bool IsC = !LangOpts.CPlusPlus; @@ -328,7 +327,6 @@ bool MacroToEnumCallbacks::isInitializer(ArrayRef MacroTokens) return Matched; } - // Any defined but rejected macro is scanned for identifiers that // are to be excluded as enums. void MacroToEnumCallbacks::MacroDefined(const Token &MacroNameTok, @@ -444,8 +442,8 @@ void MacroToEnumCallbacks::invalidateExpressionNames() { } void MacroToEnumCallbacks::EndOfMainFile() { - invalidateExpressionNames(); - issueDiagnostics(); + invalidateExpressionNames(); + issueDiagnostics(); } void MacroToEnumCallbacks::invalidateRange(SourceRange Range) { @@ -517,7 +515,8 @@ void MacroToEnumCallbacks::fixEnumMacro(const MacroList &MacroList) const { void MacroToEnumCheck::registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) { - auto Callback = std::make_unique(this, getLangOpts(), SM); + auto Callback = + std::make_unique(this, getLangOpts(), SM); PPCallback = Callback.get(); PP->addPPCallbacks(std::move(Callback)); } @@ -540,7 +539,7 @@ void MacroToEnumCheck::check( const ast_matchers::MatchFinder::MatchResult &Result) { auto *TLDecl = Result.Nodes.getNodeAs("top"); if (TLDecl == nullptr) - return; + return; SourceRange Range = TLDecl->getSourceRange(); if (auto *TemplateFn = Result.Nodes.getNodeAs("top")) { diff --git a/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp b/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp index d1d7e9dcfa9c0..deef3586628c6 100644 --- a/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp @@ -361,8 +361,7 @@ bool MakeSmartPtrCheck::replaceNew(DiagnosticBuilder &Diag, Diag << FixItHint::CreateRemoval( SourceRange(NewStart, InitRange.getBegin())); Diag << FixItHint::CreateRemoval(SourceRange(InitRange.getEnd(), NewEnd)); - } - else { + } else { // New array expression with default/value initialization: // smart_ptr(new int[5]()); // smart_ptr(new Foo[5]()); diff --git a/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp b/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp index fc46c72982fdc..0cf59b6e0216a 100644 --- a/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp @@ -110,11 +110,11 @@ class ModernizeModule : public ClangTidyModule { CheckFactories.registerCheck( "modernize-use-default-member-init"); CheckFactories.registerCheck("modernize-use-emplace"); - CheckFactories.registerCheck("modernize-use-equals-default"); + CheckFactories.registerCheck( + "modernize-use-equals-default"); CheckFactories.registerCheck( "modernize-use-equals-delete"); - CheckFactories.registerCheck( - "modernize-use-nodiscard"); + CheckFactories.registerCheck("modernize-use-nodiscard"); CheckFactories.registerCheck("modernize-use-noexcept"); CheckFactories.registerCheck("modernize-use-nullptr"); CheckFactories.registerCheck("modernize-use-override"); @@ -136,6 +136,7 @@ static ClangTidyModuleRegistry::Add X("modernize-module", // This anchor is used to force the linker to link in the generated object file // and thus register the ModernizeModule. +// NOLINTNEXTLINE(misc-use-internal-linkage) volatile int ModernizeModuleAnchorSource = 0; } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/modernize/RedundantVoidArgCheck.cpp b/clang-tools-extra/clang-tidy/modernize/RedundantVoidArgCheck.cpp index 53447c2b960f9..5eebccc366fd5 100644 --- a/clang-tools-extra/clang-tidy/modernize/RedundantVoidArgCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/RedundantVoidArgCheck.cpp @@ -112,7 +112,8 @@ void RedundantVoidArgCheck::processFunctionDecl( "function declaration"); } -bool isMacroIdentifier(const IdentifierTable &Idents, const Token &ProtoToken) { +static bool isMacroIdentifier(const IdentifierTable &Idents, + const Token &ProtoToken) { if (!ProtoToken.is(tok::TokenKind::raw_identifier)) return false; diff --git a/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp b/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp index 4587b08670789..1ad31d315dc2a 100644 --- a/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp @@ -141,8 +141,7 @@ void ReplaceAutoPtrCheck::check(const MatchFinder::MatchResult &Result) { "auto_ptr") return; - SourceLocation EndLoc = - AutoPtrLoc.getLocWithOffset(strlen("auto_ptr") - 1); + SourceLocation EndLoc = AutoPtrLoc.getLocWithOffset(strlen("auto_ptr") - 1); diag(AutoPtrLoc, "auto_ptr is deprecated, use unique_ptr instead") << FixItHint::CreateReplacement(SourceRange(AutoPtrLoc, EndLoc), "unique_ptr"); diff --git a/clang-tools-extra/clang-tidy/modernize/UseAutoCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseAutoCheck.cpp index 7a2d804e173ce..f4b63087b7234 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseAutoCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/UseAutoCheck.cpp @@ -38,12 +38,11 @@ size_t getTypeNameLength(bool RemoveStars, StringRef Text) { else if (C == '>') --TemplateTypenameCntr; const CharType NextChar = - isAlphanumeric(C) - ? Alpha - : (isWhitespace(C) || - (!RemoveStars && TemplateTypenameCntr == 0 && C == '*')) - ? Space - : Punctuation; + isAlphanumeric(C) ? Alpha + : (isWhitespace(C) || + (!RemoveStars && TemplateTypenameCntr == 0 && C == '*')) + ? Space + : Punctuation; if (NextChar != Space) { ++NumChars; // Count the non-space character. if (LastChar == Space && NextChar == Alpha && BeforeSpace == Alpha) @@ -444,10 +443,10 @@ void UseAutoCheck::check(const MatchFinder::MatchResult &Result) { replaceIterators(Decl, Result.Context); } else if (const auto *Decl = Result.Nodes.getNodeAs(DeclWithNewId)) { - replaceExpr(Decl, Result.Context, - [](const Expr *Expr) { return Expr->getType(); }, - "use auto when initializing with new to avoid " - "duplicating the type name"); + replaceExpr( + Decl, Result.Context, [](const Expr *Expr) { return Expr->getType(); }, + "use auto when initializing with new to avoid " + "duplicating the type name"); } else if (const auto *Decl = Result.Nodes.getNodeAs(DeclWithCastId)) { replaceExpr( diff --git a/clang-tools-extra/clang-tidy/modernize/UseConstraintsCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseConstraintsCheck.cpp index 6040cddf0e52a..9e4d184c4b6e1 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseConstraintsCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/UseConstraintsCheck.cpp @@ -279,7 +279,7 @@ findInsertionForConstraint(const FunctionDecl *Function, ASTContext &Context) { return Body->getBeginLoc(); } -bool isPrimaryExpression(const Expr *Expression) { +static bool isPrimaryExpression(const Expr *Expression) { // This function is an incomplete approximation of checking whether // an Expr is a primary expression. In particular, if this function // returns true, the expression is a primary expression. The converse diff --git a/clang-tools-extra/clang-tidy/modernize/UseEmplaceCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseEmplaceCheck.cpp index 430455a38f395..aaf24eaa33c1b 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseEmplaceCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/UseEmplaceCheck.cpp @@ -98,8 +98,8 @@ auto hasWantedType(llvm::ArrayRef TypeNames) { // Matches member call expressions of the named method on the listed container // types. -auto cxxMemberCallExprOnContainer( - StringRef MethodName, llvm::ArrayRef ContainerNames) { +auto cxxMemberCallExprOnContainer(StringRef MethodName, + llvm::ArrayRef ContainerNames) { return cxxMemberCallExpr( hasDeclaration(functionDecl(hasName(MethodName))), on(hasTypeOrPointeeType(hasWantedType(ContainerNames)))); diff --git a/clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.cpp index 93151024064b4..b361ae4456538 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.cpp @@ -48,8 +48,8 @@ static std::set getAllDirectBases(const CXXRecordDecl *Record) { /// Returns a matcher that matches member expressions where the base is /// the variable declared as \p Var and the accessed member is the one declared /// as \p Field. -internal::Matcher accessToFieldInVar(const FieldDecl *Field, - const ValueDecl *Var) { +static internal::Matcher accessToFieldInVar(const FieldDecl *Field, + const ValueDecl *Var) { return ignoringImpCasts( memberExpr(hasObjectExpression(declRefExpr(to(varDecl(equalsNode(Var))))), member(fieldDecl(equalsNode(Field))))); diff --git a/clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.h b/clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.h index 44f26c2bcfc58..04c2177704fbe 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.h +++ b/clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.h @@ -1,4 +1,4 @@ -//===--- UseEqualsDefaultCheck.h - clang-tidy--------------------------*- C++ -*-===// +//===--- UseEqualsDefaultCheck.h - clang-tidy---------------------*- C++-*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. diff --git a/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.h b/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.h index 8545aa2a63968..64f60351c0657 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.h +++ b/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.h @@ -1,4 +1,4 @@ -//===--- UseEqualsDeleteCheck.h - clang-tidy---------------------------*- C++ -*-===// +//===--- UseEqualsDeleteCheck.h - clang-tidy----------------------*- C++-*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. diff --git a/clang-tools-extra/clang-tidy/modernize/UseIntegerSignComparisonCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseIntegerSignComparisonCheck.cpp index eeba5cce80da5..c02c5dfa8756d 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseIntegerSignComparisonCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/UseIntegerSignComparisonCheck.cpp @@ -39,21 +39,28 @@ intCastExpression(bool IsSigned, // std::cmp_{} functions trigger a compile-time error if either LHS or RHS // is a non-integer type, char, enum or bool // (unsigned char/ signed char are Ok and can be used). - auto IntTypeExpr = expr(hasType(hasCanonicalType(qualType( + const auto HasIntegerType = hasType(hasCanonicalType(qualType( isInteger(), IsSigned ? isSignedInteger() : isUnsignedInteger(), - unless(isActualChar()), unless(booleanType()), unless(enumType()))))); + unless(isActualChar()), unless(booleanType()), unless(enumType())))); + + const auto IntTypeExpr = expr(HasIntegerType); const auto ImplicitCastExpr = CastBindName.empty() ? implicitCastExpr(hasSourceExpression(IntTypeExpr)) : implicitCastExpr(hasSourceExpression(IntTypeExpr)) .bind(CastBindName); - const auto CStyleCastExpr = cStyleCastExpr(has(ImplicitCastExpr)); - const auto StaticCastExpr = cxxStaticCastExpr(has(ImplicitCastExpr)); - const auto FunctionalCastExpr = cxxFunctionalCastExpr(has(ImplicitCastExpr)); + const auto ExplicitCastExpr = + anyOf(explicitCastExpr(has(ImplicitCastExpr)), + ignoringImpCasts(explicitCastExpr(has(ImplicitCastExpr)))); + + // Match function calls or variable references not directly wrapped by an + // implicit cast + const auto CallIntExpr = CastBindName.empty() + ? callExpr(HasIntegerType) + : callExpr(HasIntegerType).bind(CastBindName); - return expr(anyOf(ImplicitCastExpr, CStyleCastExpr, StaticCastExpr, - FunctionalCastExpr)); + return expr(anyOf(ImplicitCastExpr, ExplicitCastExpr, CallIntExpr)); } static StringRef parseOpCode(BinaryOperator::Opcode Code) { diff --git a/clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.cpp index a6b00be75abf8..c38fb3a01d287 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.cpp @@ -229,7 +229,7 @@ class CastSequenceVisitor : public RecursiveASTVisitor { return true; } - auto* CastSubExpr = C->getSubExpr()->IgnoreParens(); + auto *CastSubExpr = C->getSubExpr()->IgnoreParens(); // Ignore cast expressions which cast nullptr literal. if (isa(CastSubExpr)) { return true; diff --git a/clang-tools-extra/clang-tidy/modernize/UseStartsEndsWithCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseStartsEndsWithCheck.cpp index 2e059f24d47b6..2af67f7ccb4c1 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseStartsEndsWithCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/UseStartsEndsWithCheck.cpp @@ -33,6 +33,8 @@ static bool isNegativeComparison(const Expr *ComparisonExpr) { return false; } +namespace { + struct NotLengthExprForStringNode { NotLengthExprForStringNode(std::string ID, DynTypedNode Node, ASTContext *Context) @@ -91,6 +93,8 @@ AST_MATCHER_P(Expr, lengthExprForStringNode, std::string, ID) { ID, DynTypedNode::create(Node), &(Finder->getASTContext()))); } +} // namespace + UseStartsEndsWithCheck::UseStartsEndsWithCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context) {} diff --git a/clang-tools-extra/clang-tidy/modernize/UseTrailingReturnTypeCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseTrailingReturnTypeCheck.cpp index 4e5c6a798be98..ced4825f79a99 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseTrailingReturnTypeCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/UseTrailingReturnTypeCheck.cpp @@ -17,6 +17,30 @@ #include #include +namespace clang::tidy { + +template <> +struct OptionEnumMapping< + modernize::UseTrailingReturnTypeCheck::TransformLambda> { + static llvm::ArrayRef> + getEnumMapping() { + static constexpr std::pair< + modernize::UseTrailingReturnTypeCheck::TransformLambda, StringRef> + Mapping[] = { + {modernize::UseTrailingReturnTypeCheck::TransformLambda::All, + "all"}, + {modernize::UseTrailingReturnTypeCheck::TransformLambda:: + AllExceptAuto, + "all_except_auto"}, + {modernize::UseTrailingReturnTypeCheck::TransformLambda::None, + "none"}}; + return Mapping; + } +}; + +} // namespace clang::tidy + using namespace clang::ast_matchers; namespace clang::tidy::modernize { @@ -111,10 +135,17 @@ struct UnqualNameVisitor : public RecursiveASTVisitor { private: const FunctionDecl &F; }; + +AST_MATCHER(LambdaExpr, hasExplicitResultType) { + return Node.hasExplicitResultType(); +} + } // namespace constexpr llvm::StringLiteral ErrorMessageOnFunction = "use a trailing return type for this function"; +constexpr llvm::StringLiteral ErrorMessageOnLambda = + "use a trailing return type for this lambda"; static SourceLocation expandIfMacroId(SourceLocation Loc, const SourceManager &SM) { @@ -285,7 +316,6 @@ findReturnTypeAndCVSourceRange(const FunctionDecl &F, const TypeLoc &ReturnLoc, return {}; } - // If the return type has no local qualifiers, it's source range is accurate. if (!hasAnyNestedLocalQualifiers(F.getReturnType())) return ReturnTypeRange; @@ -329,6 +359,48 @@ findReturnTypeAndCVSourceRange(const FunctionDecl &F, const TypeLoc &ReturnLoc, return ReturnTypeRange; } +static SourceLocation findLambdaTrailingReturnInsertLoc( + const CXXMethodDecl *Method, const SourceManager &SM, + const LangOptions &LangOpts, const ASTContext &Ctx) { + // 'requires' keyword is present in lambda declaration + if (Method->getTrailingRequiresClause()) { + SourceLocation ParamEndLoc; + if (Method->param_empty()) + ParamEndLoc = Method->getBeginLoc(); + else + ParamEndLoc = Method->getParametersSourceRange().getEnd(); + + std::pair ParamEndLocInfo = + SM.getDecomposedLoc(ParamEndLoc); + StringRef Buffer = SM.getBufferData(ParamEndLocInfo.first); + + Lexer Lexer(SM.getLocForStartOfFile(ParamEndLocInfo.first), LangOpts, + Buffer.begin(), Buffer.data() + ParamEndLocInfo.second, + Buffer.end()); + + Token Token; + while (!Lexer.LexFromRawLexer(Token)) { + if (Token.is(tok::raw_identifier)) { + IdentifierInfo &Info = Ctx.Idents.get(StringRef( + SM.getCharacterData(Token.getLocation()), Token.getLength())); + Token.setIdentifierInfo(&Info); + Token.setKind(Info.getTokenID()); + } + + if (Token.is(tok::kw_requires)) + return Token.getLocation().getLocWithOffset(-1); + } + + return {}; + } + + // If no requires clause, insert before the body + if (const Stmt *Body = Method->getBody()) + return Body->getBeginLoc().getLocWithOffset(-1); + + return {}; +} + static void keepSpecifiers(std::string &ReturnType, std::string &Auto, SourceRange ReturnTypeCVRange, const FunctionDecl &F, const FriendDecl *Fr, const ASTContext &Ctx, @@ -382,14 +454,43 @@ static void keepSpecifiers(std::string &ReturnType, std::string &Auto, } } +UseTrailingReturnTypeCheck::UseTrailingReturnTypeCheck( + StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context), + TransformFunctions(Options.get("TransformFunctions", true)), + TransformLambdas(Options.get("TransformLambdas", TransformLambda::All)) { + + if (TransformFunctions == false && TransformLambdas == TransformLambda::None) + this->configurationDiag( + "The check 'modernize-use-trailing-return-type' will not perform any " + "analysis because 'TransformFunctions' and 'TransformLambdas' are " + "disabled."); +} + +void UseTrailingReturnTypeCheck::storeOptions( + ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "TransformFunctions", TransformFunctions); + Options.store(Opts, "TransformLambdas", TransformLambdas); +} + void UseTrailingReturnTypeCheck::registerMatchers(MatchFinder *Finder) { - auto F = functionDecl( - unless(anyOf(hasTrailingReturn(), returns(voidType()), - cxxConversionDecl(), cxxMethodDecl(isImplicit())))) - .bind("Func"); + auto F = + functionDecl( + unless(anyOf( + hasTrailingReturn(), returns(voidType()), cxxConversionDecl(), + cxxMethodDecl( + anyOf(isImplicit(), + hasParent(cxxRecordDecl(hasParent(lambdaExpr())))))))) + .bind("Func"); + + if (TransformFunctions) { + Finder->addMatcher(F, this); + Finder->addMatcher(friendDecl(hasDescendant(F)).bind("Friend"), this); + } - Finder->addMatcher(F, this); - Finder->addMatcher(friendDecl(hasDescendant(F)).bind("Friend"), this); + if (TransformLambdas != TransformLambda::None) + Finder->addMatcher( + lambdaExpr(unless(hasExplicitResultType())).bind("Lambda"), this); } void UseTrailingReturnTypeCheck::registerPPCallbacks( @@ -401,8 +502,13 @@ void UseTrailingReturnTypeCheck::check(const MatchFinder::MatchResult &Result) { assert(PP && "Expected registerPPCallbacks() to have been called before so " "preprocessor is available"); - const auto *F = Result.Nodes.getNodeAs("Func"); + if (const auto *Lambda = Result.Nodes.getNodeAs("Lambda")) { + diagOnLambda(Lambda, Result); + return; + } + const auto *Fr = Result.Nodes.getNodeAs("Friend"); + const auto *F = Result.Nodes.getNodeAs("Func"); assert(F && "Matcher is expected to find only FunctionDecls"); // Three-way comparison operator<=> is syntactic sugar and generates implicit @@ -495,4 +601,41 @@ void UseTrailingReturnTypeCheck::check(const MatchFinder::MatchResult &Result) { << FixItHint::CreateInsertion(InsertionLoc, " -> " + ReturnType); } +void UseTrailingReturnTypeCheck::diagOnLambda( + const LambdaExpr *Lambda, + const ast_matchers::MatchFinder::MatchResult &Result) { + + const CXXMethodDecl *Method = Lambda->getCallOperator(); + if (!Method || Lambda->hasExplicitResultType()) + return; + + const ASTContext *Ctx = Result.Context; + const QualType ReturnType = Method->getReturnType(); + + // We can't write 'auto' in C++11 mode, try to write generic msg and bail out. + if (ReturnType->isDependentType() && + Ctx->getLangOpts().LangStd == LangStandard::lang_cxx11) { + if (TransformLambdas == TransformLambda::All) + diag(Lambda->getBeginLoc(), ErrorMessageOnLambda); + return; + } + + if (ReturnType->isUndeducedAutoType() && + TransformLambdas == TransformLambda::AllExceptAuto) + return; + + const SourceLocation TrailingReturnInsertLoc = + findLambdaTrailingReturnInsertLoc(Method, *Result.SourceManager, + getLangOpts(), *Result.Context); + + if (TrailingReturnInsertLoc.isValid()) + diag(Lambda->getBeginLoc(), "use a trailing return type for this lambda") + << FixItHint::CreateInsertion( + TrailingReturnInsertLoc, + " -> " + + ReturnType.getAsString(Result.Context->getPrintingPolicy())); + else + diag(Lambda->getBeginLoc(), ErrorMessageOnLambda); +} + } // namespace clang::tidy::modernize diff --git a/clang-tools-extra/clang-tidy/modernize/UseTrailingReturnTypeCheck.h b/clang-tools-extra/clang-tidy/modernize/UseTrailingReturnTypeCheck.h index 7f20674d15a5c..91369919c5d36 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseTrailingReturnTypeCheck.h +++ b/clang-tools-extra/clang-tidy/modernize/UseTrailingReturnTypeCheck.h @@ -26,18 +26,25 @@ struct ClassifiedToken { /// http://clang.llvm.org/extra/clang-tidy/checks/modernize/use-trailing-return-type.html class UseTrailingReturnTypeCheck : public ClangTidyCheck { public: - UseTrailingReturnTypeCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context) {} + UseTrailingReturnTypeCheck(StringRef Name, ClangTidyContext *Context); bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { return LangOpts.CPlusPlus11; } + void storeOptions(ClangTidyOptions::OptionMap &Opts) override; void registerMatchers(ast_matchers::MatchFinder *Finder) override; void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; + enum TransformLambda { All, AllExceptAuto, None }; + private: Preprocessor *PP = nullptr; + const bool TransformFunctions; + const TransformLambda TransformLambdas; + + void diagOnLambda(const LambdaExpr *Lambda, + const ast_matchers::MatchFinder::MatchResult &Result); }; } // namespace clang::tidy::modernize diff --git a/clang-tools-extra/clang-tidy/modernize/UseTransparentFunctorsCheck.h b/clang-tools-extra/clang-tidy/modernize/UseTransparentFunctorsCheck.h index 6f02becc9f9d2..80f022159c67b 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseTransparentFunctorsCheck.h +++ b/clang-tools-extra/clang-tidy/modernize/UseTransparentFunctorsCheck.h @@ -26,6 +26,7 @@ class UseTransparentFunctorsCheck : public ClangTidyCheck { void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; void storeOptions(ClangTidyOptions::OptionMap &Opts) override; + private: const bool SafeMode; }; diff --git a/clang-tools-extra/clang-tidy/modernize/UseUncaughtExceptionsCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseUncaughtExceptionsCheck.cpp index 109d701395cc4..1e0a0a551339a 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseUncaughtExceptionsCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/UseUncaughtExceptionsCheck.cpp @@ -39,10 +39,10 @@ void UseUncaughtExceptionsCheck::registerMatchers(MatchFinder *Finder) { this); // CallExpr in initialisation list: warning, fix-it with avoiding narrowing // conversions. - Finder->addMatcher(callExpr(DirectCallToUncaughtException, - hasAncestor(initListExpr())) - .bind("init_call_expr"), - this); + Finder->addMatcher( + callExpr(DirectCallToUncaughtException, hasAncestor(initListExpr())) + .bind("init_call_expr"), + this); } void UseUncaughtExceptionsCheck::check(const MatchFinder::MatchResult &Result) { diff --git a/clang-tools-extra/clang-tidy/modernize/UseUncaughtExceptionsCheck.h b/clang-tools-extra/clang-tidy/modernize/UseUncaughtExceptionsCheck.h index 79b475c4f850e..48677521181f9 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseUncaughtExceptionsCheck.h +++ b/clang-tools-extra/clang-tidy/modernize/UseUncaughtExceptionsCheck.h @@ -13,9 +13,10 @@ namespace clang::tidy::modernize { -/// This check will warn on calls to std::uncaught_exception and replace them with calls to -/// std::uncaught_exceptions, since std::uncaught_exception was deprecated in C++17. In case of -/// macro ID there will be only a warning without fixits. +/// This check will warn on calls to std::uncaught_exception and replace them +/// with calls to std::uncaught_exceptions, since std::uncaught_exception was +/// deprecated in C++17. In case of macro ID there will be only a warning +/// without fixits. /// /// For the user-facing documentation see: /// http://clang.llvm.org/extra/clang-tidy/checks/modernize/use-uncaught-exceptions.html diff --git a/clang-tools-extra/clang-tidy/mpi/MPITidyModule.cpp b/clang-tools-extra/clang-tidy/mpi/MPITidyModule.cpp index 166d71e130db5..67ae101c18cb1 100644 --- a/clang-tools-extra/clang-tidy/mpi/MPITidyModule.cpp +++ b/clang-tools-extra/clang-tidy/mpi/MPITidyModule.cpp @@ -31,6 +31,6 @@ static ClangTidyModuleRegistry::Add // This anchor is used to force the linker to link in the generated object file // and thus register the MPIModule. -volatile int MPIModuleAnchorSource = 0; +volatile int MPIModuleAnchorSource = 0; // NOLINT(misc-use-internal-linkage) } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/objc/AvoidNSErrorInitCheck.h b/clang-tools-extra/clang-tidy/objc/AvoidNSErrorInitCheck.h index 72a6c6512f62b..b343cb0c4fa80 100644 --- a/clang-tools-extra/clang-tidy/objc/AvoidNSErrorInitCheck.h +++ b/clang-tools-extra/clang-tidy/objc/AvoidNSErrorInitCheck.h @@ -19,7 +19,7 @@ namespace clang::tidy::objc { /// For the user-facing documentation see: /// http://clang.llvm.org/extra/clang-tidy/checks/objc/avoid-nserror-init.html class AvoidNSErrorInitCheck : public ClangTidyCheck { - public: +public: AvoidNSErrorInitCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context) {} bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { @@ -31,4 +31,4 @@ class AvoidNSErrorInitCheck : public ClangTidyCheck { } // namespace clang::tidy::objc -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_OBJC_AVOIDNSERRORINITCHECK_H +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_OBJC_AVOIDNSERRORINITCHECK_H diff --git a/clang-tools-extra/clang-tidy/objc/ForbiddenSubclassingCheck.cpp b/clang-tools-extra/clang-tidy/objc/ForbiddenSubclassingCheck.cpp index 579aa29650715..089538d4c65a8 100644 --- a/clang-tools-extra/clang-tidy/objc/ForbiddenSubclassingCheck.cpp +++ b/clang-tools-extra/clang-tidy/objc/ForbiddenSubclassingCheck.cpp @@ -35,14 +35,11 @@ constexpr char DefaultForbiddenSuperClassNames[] = } // namespace -ForbiddenSubclassingCheck::ForbiddenSubclassingCheck( - StringRef Name, - ClangTidyContext *Context) +ForbiddenSubclassingCheck::ForbiddenSubclassingCheck(StringRef Name, + ClangTidyContext *Context) : ClangTidyCheck(Name, Context), - ForbiddenSuperClassNames( - utils::options::parseStringList( - Options.get("ClassNames", DefaultForbiddenSuperClassNames))) { -} + ForbiddenSuperClassNames(utils::options::parseStringList( + Options.get("ClassNames", DefaultForbiddenSuperClassNames))) {} void ForbiddenSubclassingCheck::registerMatchers(MatchFinder *Finder) { Finder->addMatcher( @@ -53,27 +50,22 @@ void ForbiddenSubclassingCheck::registerMatchers(MatchFinder *Finder) { this); } -void ForbiddenSubclassingCheck::check( - const MatchFinder::MatchResult &Result) { - const auto *SubClass = Result.Nodes.getNodeAs( - "subclass"); +void ForbiddenSubclassingCheck::check(const MatchFinder::MatchResult &Result) { + const auto *SubClass = Result.Nodes.getNodeAs("subclass"); assert(SubClass != nullptr); - const auto *SuperClass = Result.Nodes.getNodeAs( - "superclass"); + const auto *SuperClass = + Result.Nodes.getNodeAs("superclass"); assert(SuperClass != nullptr); diag(SubClass->getLocation(), "Objective-C interface %0 subclasses %1, which is not " "intended to be subclassed") - << SubClass - << SuperClass; + << SubClass << SuperClass; } void ForbiddenSubclassingCheck::storeOptions( ClangTidyOptions::OptionMap &Opts) { - Options.store( - Opts, - "ForbiddenSuperClassNames", - utils::options::serializeStringList(ForbiddenSuperClassNames)); + Options.store(Opts, "ForbiddenSuperClassNames", + utils::options::serializeStringList(ForbiddenSuperClassNames)); } } // namespace clang::tidy::objc diff --git a/clang-tools-extra/clang-tidy/objc/NSDateFormatterCheck.cpp b/clang-tools-extra/clang-tidy/objc/NSDateFormatterCheck.cpp index 5438c9c892e2e..79e9d97d9594b 100644 --- a/clang-tools-extra/clang-tidy/objc/NSDateFormatterCheck.cpp +++ b/clang-tools-extra/clang-tidy/objc/NSDateFormatterCheck.cpp @@ -34,7 +34,7 @@ static char ValidDatePatternChars[] = { // A string pattern is valid if all the letters(a-z, A-Z) in it belong to the // set of reserved characters. See: // https://www.unicode.org/reports/tr35/tr35.html#Invalid_Patterns -bool isValidDatePattern(StringRef Pattern) { +static bool isValidDatePattern(StringRef Pattern) { return llvm::all_of(Pattern, [](const auto &PatternChar) { return !isalpha(PatternChar) || llvm::is_contained(ValidDatePatternChars, PatternChar); diff --git a/clang-tools-extra/clang-tidy/objc/ObjCTidyModule.cpp b/clang-tools-extra/clang-tidy/objc/ObjCTidyModule.cpp index b6f8888ed389a..56ccf33a6362a 100644 --- a/clang-tools-extra/clang-tidy/objc/ObjCTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/objc/ObjCTidyModule.cpp @@ -35,27 +35,24 @@ class ObjCModule : public ClangTidyModule { "objc-dealloc-in-category"); CheckFactories.registerCheck( "objc-forbidden-subclassing"); - CheckFactories.registerCheck( - "objc-missing-hash"); + CheckFactories.registerCheck("objc-missing-hash"); CheckFactories.registerCheck("objc-nsdate-formatter"); CheckFactories.registerCheck( "objc-nsinvocation-argument-lifetime"); CheckFactories.registerCheck( "objc-property-declaration"); - CheckFactories.registerCheck( - "objc-super-self"); + CheckFactories.registerCheck("objc-super-self"); } }; // Register the ObjCTidyModule using this statically initialized variable. -static ClangTidyModuleRegistry::Add X( - "objc-module", - "Adds Objective-C lint checks."); +static ClangTidyModuleRegistry::Add + X("objc-module", "Adds Objective-C lint checks."); } // namespace objc // This anchor is used to force the linker to link in the generated object file // and thus register the ObjCModule. -volatile int ObjCModuleAnchorSource = 0; +volatile int ObjCModuleAnchorSource = 0; // NOLINT(misc-use-internal-linkage) } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/objc/PropertyDeclarationCheck.cpp b/clang-tools-extra/clang-tidy/objc/PropertyDeclarationCheck.cpp index cda24de491867..3b847f51d2173 100644 --- a/clang-tools-extra/clang-tidy/objc/PropertyDeclarationCheck.cpp +++ b/clang-tools-extra/clang-tidy/objc/PropertyDeclarationCheck.cpp @@ -88,7 +88,7 @@ bool prefixedPropertyNameValid(llvm::StringRef PropertyName) { auto RegexExp = llvm::Regex(llvm::StringRef(validPropertyNameRegex(false))); return RegexExp.match(PropertyName.substr(Start + 1)); } -} // namespace +} // namespace void PropertyDeclarationCheck::registerMatchers(MatchFinder *Finder) { Finder->addMatcher(objcPropertyDecl( diff --git a/clang-tools-extra/clang-tidy/openmp/ExceptionEscapeCheck.cpp b/clang-tools-extra/clang-tidy/openmp/ExceptionEscapeCheck.cpp index 603d0954e1b19..42fb95bf10527 100644 --- a/clang-tools-extra/clang-tidy/openmp/ExceptionEscapeCheck.cpp +++ b/clang-tools-extra/clang-tidy/openmp/ExceptionEscapeCheck.cpp @@ -20,8 +20,7 @@ ExceptionEscapeCheck::ExceptionEscapeCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), RawIgnoredExceptions(Options.get("IgnoredExceptions", "")) { - llvm::SmallVector FunctionsThatShouldNotThrowVec, - IgnoredExceptionsVec; + llvm::SmallVector IgnoredExceptionsVec; llvm::StringSet<> IgnoredExceptions; StringRef(RawIgnoredExceptions).split(IgnoredExceptionsVec, ",", -1, false); diff --git a/clang-tools-extra/clang-tidy/openmp/OpenMPTidyModule.cpp b/clang-tools-extra/clang-tidy/openmp/OpenMPTidyModule.cpp index 37092f49b25d6..d9c9d90673408 100644 --- a/clang-tools-extra/clang-tidy/openmp/OpenMPTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/openmp/OpenMPTidyModule.cpp @@ -34,6 +34,6 @@ static ClangTidyModuleRegistry::Add // This anchor is used to force the linker to link in the generated object file // and thus register the OpenMPModule. -volatile int OpenMPModuleAnchorSource = 0; +volatile int OpenMPModuleAnchorSource = 0; // NOLINT(misc-use-internal-linkage) } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.h b/clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.h index 93ed32e5b878a..83af95cd69549 100644 --- a/clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.h +++ b/clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.h @@ -25,7 +25,7 @@ namespace clang::tidy::performance { class FasterStringFindCheck : public ClangTidyCheck { public: FasterStringFindCheck(StringRef Name, ClangTidyContext *Context); - bool isLanguageVersionSupported(const LangOptions &LangOpts) const override{ + bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { return LangOpts.CPlusPlus; } void registerMatchers(ast_matchers::MatchFinder *Finder) override; diff --git a/clang-tools-extra/clang-tidy/performance/ForRangeCopyCheck.h b/clang-tools-extra/clang-tidy/performance/ForRangeCopyCheck.h index ab9b89d31f93b..8fabbfa2ae7ba 100644 --- a/clang-tools-extra/clang-tidy/performance/ForRangeCopyCheck.h +++ b/clang-tools-extra/clang-tidy/performance/ForRangeCopyCheck.h @@ -20,7 +20,7 @@ namespace clang::tidy::performance { class ForRangeCopyCheck : public ClangTidyCheck { public: ForRangeCopyCheck(StringRef Name, ClangTidyContext *Context); - bool isLanguageVersionSupported(const LangOptions &LangOpts) const override{ + bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { return LangOpts.CPlusPlus11; } void storeOptions(ClangTidyOptions::OptionMap &Opts) override; diff --git a/clang-tools-extra/clang-tidy/performance/ImplicitConversionInLoopCheck.cpp b/clang-tools-extra/clang-tidy/performance/ImplicitConversionInLoopCheck.cpp index 86fca0722dcd8..1ecf1e14957a1 100644 --- a/clang-tools-extra/clang-tidy/performance/ImplicitConversionInLoopCheck.cpp +++ b/clang-tools-extra/clang-tidy/performance/ImplicitConversionInLoopCheck.cpp @@ -65,8 +65,7 @@ void ImplicitConversionInLoopCheck::check( const MatchFinder::MatchResult &Result) { const auto *VD = Result.Nodes.getNodeAs("faulty-var"); const auto *Init = Result.Nodes.getNodeAs("init"); - const auto *OperatorCall = - Result.Nodes.getNodeAs("operator-call"); + const auto *OperatorCall = Result.Nodes.getNodeAs("operator-call"); if (const auto *Cleanup = dyn_cast(Init)) Init = Cleanup->getSubExpr(); diff --git a/clang-tools-extra/clang-tidy/performance/ImplicitConversionInLoopCheck.h b/clang-tools-extra/clang-tidy/performance/ImplicitConversionInLoopCheck.h index 2f3c9ae8f2dbc..d1764070bd4d7 100644 --- a/clang-tools-extra/clang-tidy/performance/ImplicitConversionInLoopCheck.h +++ b/clang-tools-extra/clang-tidy/performance/ImplicitConversionInLoopCheck.h @@ -20,9 +20,9 @@ class ImplicitConversionInLoopCheck : public ClangTidyCheck { public: ImplicitConversionInLoopCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context) {} - bool isLanguageVersionSupported(const LangOptions &LangOpts) const override{ - return LangOpts.CPlusPlus11; - } + bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { + return LangOpts.CPlusPlus11; + } void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; diff --git a/clang-tools-extra/clang-tidy/performance/InefficientVectorOperationCheck.cpp b/clang-tools-extra/clang-tidy/performance/InefficientVectorOperationCheck.cpp index 94cb7ec38087a..9692fcb0c1de4 100644 --- a/clang-tools-extra/clang-tidy/performance/InefficientVectorOperationCheck.cpp +++ b/clang-tools-extra/clang-tidy/performance/InefficientVectorOperationCheck.cpp @@ -126,15 +126,14 @@ void InefficientVectorOperationCheck::addMatcher( // // FIXME: Support more types of counter-based loops like decrement loops. Finder->addMatcher( - forStmt( - hasLoopInit(LoopVarInit), - hasCondition(binaryOperator( - hasOperatorName("<"), hasLHS(RefersToLoopVar), - hasRHS(expr(unless(hasDescendant(expr(RefersToLoopVar)))) - .bind(LoopEndExprName)))), - hasIncrement(unaryOperator(hasOperatorName("++"), - hasUnaryOperand(RefersToLoopVar))), - HasInterestingLoopBody, InInterestingCompoundStmt) + forStmt(hasLoopInit(LoopVarInit), + hasCondition(binaryOperator( + hasOperatorName("<"), hasLHS(RefersToLoopVar), + hasRHS(expr(unless(hasDescendant(expr(RefersToLoopVar)))) + .bind(LoopEndExprName)))), + hasIncrement(unaryOperator(hasOperatorName("++"), + hasUnaryOperand(RefersToLoopVar))), + HasInterestingLoopBody, InInterestingCompoundStmt) .bind(LoopCounterName), this); @@ -179,7 +178,7 @@ void InefficientVectorOperationCheck::registerMatchers(MatchFinder *Finder) { void InefficientVectorOperationCheck::check( const MatchFinder::MatchResult &Result) { - auto* Context = Result.Context; + auto *Context = Result.Context; if (Context->getDiagnostics().hasUncompilableErrorOccurred()) return; diff --git a/clang-tools-extra/clang-tidy/performance/InefficientVectorOperationCheck.h b/clang-tools-extra/clang-tidy/performance/InefficientVectorOperationCheck.h index 7a2745f7ae5f5..4f45ff490633a 100644 --- a/clang-tools-extra/clang-tidy/performance/InefficientVectorOperationCheck.h +++ b/clang-tools-extra/clang-tidy/performance/InefficientVectorOperationCheck.h @@ -24,7 +24,7 @@ namespace clang::tidy::performance { class InefficientVectorOperationCheck : public ClangTidyCheck { public: InefficientVectorOperationCheck(StringRef Name, ClangTidyContext *Context); - bool isLanguageVersionSupported(const LangOptions &LangOpts) const override{ + bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { return LangOpts.CPlusPlus; } void registerMatchers(ast_matchers::MatchFinder *Finder) override; diff --git a/clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp b/clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp index 75ef7a697031e..f458e26d964b0 100644 --- a/clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp +++ b/clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp @@ -78,9 +78,9 @@ void MoveConstArgCheck::registerMatchers(MatchFinder *Finder) { this); } -bool isRValueReferenceParam(const Expr *Invocation, - const QualType *InvocationParmType, - const Expr *Arg) { +static bool isRValueReferenceParam(const Expr *Invocation, + const QualType *InvocationParmType, + const Expr *Arg) { if (Invocation && (*InvocationParmType)->isRValueReferenceType() && Arg->isLValue()) { if (!Invocation->getType()->isRecordType()) diff --git a/clang-tools-extra/clang-tidy/performance/PerformanceTidyModule.cpp b/clang-tools-extra/clang-tidy/performance/PerformanceTidyModule.cpp index 9e0fa6f88b36a..10ad9ec6fef4c 100644 --- a/clang-tools-extra/clang-tidy/performance/PerformanceTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/performance/PerformanceTidyModule.cpp @@ -81,6 +81,7 @@ static ClangTidyModuleRegistry::Add // This anchor is used to force the linker to link in the generated object file // and thus register the PerformanceModule. +// NOLINTNEXTLINE(misc-use-internal-linkage) volatile int PerformanceModuleAnchorSource = 0; } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp index ce360dded8633..b6f19811f5e5c 100644 --- a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp +++ b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp @@ -111,10 +111,11 @@ AST_MATCHER_FUNCTION(StatementMatcher, isConstRefReturningFunctionCall) { // an alias to one of its arguments and the arguments need to be checked // for const use as well. return callExpr(argumentCountIs(0), - callee(functionDecl(returns(hasCanonicalType(matchers::isReferenceToConst())), + callee(functionDecl(returns(hasCanonicalType( + matchers::isReferenceToConst())), unless(cxxMethodDecl(unless(isStatic())))) - .bind(FunctionDeclId))) - .bind(InitFunctionCallId); + .bind(FunctionDeclId))) + .bind(InitFunctionCallId); } AST_MATCHER_FUNCTION_P(StatementMatcher, initializerReturnsReferenceToConst, @@ -234,12 +235,14 @@ UnnecessaryCopyInitialization::UnnecessaryCopyInitialization( Options.get("ExcludedContainerTypes", ""))) {} void UnnecessaryCopyInitialization::registerMatchers(MatchFinder *Finder) { - auto LocalVarCopiedFrom = [this](const ast_matchers::internal::Matcher &CopyCtorArg) { - return compoundStmt( - forEachDescendant( - declStmt( - unless(has(decompositionDecl())), - has(varDecl(hasLocalStorage(), + auto LocalVarCopiedFrom = + [this](const ast_matchers::internal::Matcher &CopyCtorArg) { + return compoundStmt( + forEachDescendant( + declStmt( + unless(has(decompositionDecl())), + has(varDecl( + hasLocalStorage(), hasType(qualType( hasCanonicalType(allOf( matchers::isExpensiveToCopy(), @@ -256,10 +259,10 @@ void UnnecessaryCopyInitialization::registerMatchers(MatchFinder *Finder) { isCopyConstructor())), hasArgument(0, CopyCtorArg)) .bind("ctorCall")))) - .bind("newVarDecl"))) - .bind("declStmt"))) - .bind("blockStmt"); - }; + .bind("newVarDecl"))) + .bind("declStmt"))) + .bind("blockStmt"); + }; Finder->addMatcher( LocalVarCopiedFrom(anyOf( diff --git a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.h b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.h index ab0f1ecf61063..38f756f9b452f 100644 --- a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.h +++ b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.h @@ -25,7 +25,7 @@ namespace clang::tidy::performance { class UnnecessaryCopyInitialization : public ClangTidyCheck { public: UnnecessaryCopyInitialization(StringRef Name, ClangTidyContext *Context); - bool isLanguageVersionSupported(const LangOptions &LangOpts) const override{ + bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { return LangOpts.CPlusPlus; } void registerMatchers(ast_matchers::MatchFinder *Finder) override; diff --git a/clang-tools-extra/clang-tidy/plugin/ClangTidyPlugin.cpp b/clang-tools-extra/clang-tidy/plugin/ClangTidyPlugin.cpp index 3caa222b9fa4c..651a63b3aa972 100644 --- a/clang-tools-extra/clang-tidy/plugin/ClangTidyPlugin.cpp +++ b/clang-tools-extra/clang-tidy/plugin/ClangTidyPlugin.cpp @@ -78,6 +78,7 @@ class ClangTidyPluginAction : public PluginASTAction { // This anchor is used to force the linker to link in the generated object file // and thus register the clang-tidy plugin. +// NOLINTNEXTLINE(misc-use-internal-linkage) volatile int ClangTidyPluginAnchorSource = 0; static clang::FrontendPluginRegistry::Add diff --git a/clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp b/clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp index a15cb36dfdaff..98853556588b3 100644 --- a/clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp @@ -42,6 +42,7 @@ static ClangTidyModuleRegistry::Add // This anchor is used to force the linker to link in the generated object file // and thus register the PortabilityModule. +// NOLINTNEXTLINE(misc-use-internal-linkage) volatile int PortabilityModuleAnchorSource = 0; } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/portability/SIMDIntrinsicsCheck.h b/clang-tools-extra/clang-tidy/portability/SIMDIntrinsicsCheck.h index c254a374ee9d5..92fc0af98a25b 100644 --- a/clang-tools-extra/clang-tidy/portability/SIMDIntrinsicsCheck.h +++ b/clang-tools-extra/clang-tidy/portability/SIMDIntrinsicsCheck.h @@ -30,7 +30,7 @@ class SIMDIntrinsicsCheck : public ClangTidyCheck { void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; - private: +private: llvm::SmallString<32> Std; const bool Suggest; }; diff --git a/clang-tools-extra/clang-tidy/readability/ConstReturnTypeCheck.h b/clang-tools-extra/clang-tidy/readability/ConstReturnTypeCheck.h index c3d779eafecb0..e329b3d8496a1 100644 --- a/clang-tools-extra/clang-tidy/readability/ConstReturnTypeCheck.h +++ b/clang-tools-extra/clang-tidy/readability/ConstReturnTypeCheck.h @@ -19,16 +19,16 @@ namespace clang::tidy::readability { /// For the user-facing documentation see: /// http://clang.llvm.org/extra/clang-tidy/checks/readability/const-return-type.html class ConstReturnTypeCheck : public ClangTidyCheck { - public: - ConstReturnTypeCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), - IgnoreMacros(Options.getLocalOrGlobal("IgnoreMacros", true)) {} - void storeOptions(ClangTidyOptions::OptionMap &Opts) override; - void registerMatchers(ast_matchers::MatchFinder *Finder) override; - void check(const ast_matchers::MatchFinder::MatchResult &Result) override; +public: + ConstReturnTypeCheck(StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context), + IgnoreMacros(Options.getLocalOrGlobal("IgnoreMacros", true)) {} + void storeOptions(ClangTidyOptions::OptionMap &Opts) override; + void registerMatchers(ast_matchers::MatchFinder *Finder) override; + void check(const ast_matchers::MatchFinder::MatchResult &Result) override; - private: - const bool IgnoreMacros; +private: + const bool IgnoreMacros; }; } // namespace clang::tidy::readability diff --git a/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp b/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp index bf7a847dff103..ce736a8d16023 100644 --- a/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp @@ -16,29 +16,31 @@ using namespace clang::ast_matchers; -namespace clang { -namespace ast_matchers { +namespace clang::tidy::readability { + +namespace { AST_POLYMORPHIC_MATCHER_P2(hasAnyArgumentWithParam, AST_POLYMORPHIC_SUPPORTED_TYPES(CallExpr, CXXConstructExpr), - internal::Matcher, ArgMatcher, - internal::Matcher, ParamMatcher) { - BoundNodesTreeBuilder Result; + ast_matchers::internal::Matcher, ArgMatcher, + ast_matchers::internal::Matcher, + ParamMatcher) { + ast_matchers::internal::BoundNodesTreeBuilder Result; // The first argument of an overloaded member operator is the implicit object // argument of the method which should not be matched against a parameter, so // we skip over it here. - BoundNodesTreeBuilder Matches; + ast_matchers::internal::BoundNodesTreeBuilder Matches; unsigned ArgIndex = cxxOperatorCallExpr(callee(cxxMethodDecl())) .matches(Node, Finder, &Matches) ? 1 : 0; int ParamIndex = 0; for (; ArgIndex < Node.getNumArgs(); ++ArgIndex) { - BoundNodesTreeBuilder ArgMatches(*Builder); + ast_matchers::internal::BoundNodesTreeBuilder ArgMatches(*Builder); if (ArgMatcher.matches(*(Node.getArg(ArgIndex)->IgnoreParenCasts()), Finder, &ArgMatches)) { - BoundNodesTreeBuilder ParamMatches(ArgMatches); + ast_matchers::internal::BoundNodesTreeBuilder ParamMatches(ArgMatches); if (expr(anyOf(cxxConstructExpr(hasDeclaration(cxxConstructorDecl( hasParameter(ParamIndex, ParamMatcher)))), callExpr(callee(functionDecl( @@ -80,9 +82,10 @@ AST_MATCHER(Expr, usedInBooleanContext) { binaryOperator(hasAnyOperatorName("&&", "||")), unaryOperator(hasOperatorName("!")).bind("NegOnSize")))))) .matches(Node, Finder, Builder); - Builder->removeBindings([ExprName](const BoundNodesMap &Nodes) { - return Nodes.getNode(ExprName).getNodeKind().isNone(); - }); + Builder->removeBindings( + [ExprName](const ast_matchers::internal::BoundNodesMap &Nodes) { + return Nodes.getNode(ExprName).getNodeKind().isNone(); + }); return Result; } @@ -107,8 +110,7 @@ AST_MATCHER_P(UserDefinedLiteral, hasLiteral, return false; } -} // namespace ast_matchers -namespace tidy::readability { +} // namespace using utils::isBinaryOrTernary; @@ -407,5 +409,4 @@ void ContainerSizeEmptyCheck::check(const MatchFinder::MatchResult &Result) { << Container; } -} // namespace tidy::readability -} // namespace clang +} // namespace clang::tidy::readability diff --git a/clang-tools-extra/clang-tidy/readability/ConvertMemberFunctionsToStatic.cpp b/clang-tools-extra/clang-tidy/readability/ConvertMemberFunctionsToStatic.cpp index 1284df6bd99cf..30df40bda57d8 100644 --- a/clang-tools-extra/clang-tidy/readability/ConvertMemberFunctionsToStatic.cpp +++ b/clang-tools-extra/clang-tidy/readability/ConvertMemberFunctionsToStatic.cpp @@ -18,6 +18,8 @@ using namespace clang::ast_matchers; namespace clang::tidy::readability { +namespace { + AST_MATCHER(CXXMethodDecl, isStatic) { return Node.isStatic(); } AST_MATCHER(CXXMethodDecl, hasTrivialBody) { return Node.hasTrivialBody(); } @@ -74,6 +76,8 @@ AST_MATCHER(CXXMethodDecl, usesThis) { return UsageOfThis.Used; } +} // namespace + void ConvertMemberFunctionsToStatic::registerMatchers(MatchFinder *Finder) { Finder->addMatcher( cxxMethodDecl( @@ -81,7 +85,8 @@ void ConvertMemberFunctionsToStatic::registerMatchers(MatchFinder *Finder) { unless(anyOf( isExpansionInSystemHeader(), isVirtual(), isStatic(), hasTrivialBody(), isOverloadedOperator(), cxxConstructorDecl(), - cxxDestructorDecl(), cxxConversionDecl(), isTemplate(), + cxxDestructorDecl(), cxxConversionDecl(), + isExplicitObjectMemberFunction(), isTemplate(), isDependentContext(), ofClass(anyOf( isLambda(), diff --git a/clang-tools-extra/clang-tidy/readability/InconsistentDeclarationParameterNameCheck.cpp b/clang-tools-extra/clang-tidy/readability/InconsistentDeclarationParameterNameCheck.cpp index 5cc22a22b1f50..10aa779117bbd 100644 --- a/clang-tools-extra/clang-tidy/readability/InconsistentDeclarationParameterNameCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/InconsistentDeclarationParameterNameCheck.cpp @@ -131,8 +131,8 @@ findDifferingParamsInDeclaration(const FunctionDecl *ParameterSourceDeclaration, InconsistentDeclarationsContainer findInconsistentDeclarations(const FunctionDecl *OriginalDeclaration, - const FunctionDecl *ParameterSourceDeclaration, - SourceManager &SM, bool Strict) { + const FunctionDecl *ParameterSourceDeclaration, + SourceManager &SM, bool Strict) { InconsistentDeclarationsContainer InconsistentDeclarations; SourceLocation ParameterSourceLocation = ParameterSourceDeclaration->getLocation(); diff --git a/clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.h b/clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.h index 79787845de619..70a17889d244e 100644 --- a/clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.h +++ b/clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.h @@ -43,11 +43,12 @@ class MagicNumbersCheck : public ClangTidyCheck { bool isBitFieldWidth(const clang::ast_matchers::MatchFinder::MatchResult &, const FloatingLiteral &) const { - return false; + return false; } - bool isBitFieldWidth(const clang::ast_matchers::MatchFinder::MatchResult &Result, - const IntegerLiteral &Literal) const; + bool + isBitFieldWidth(const clang::ast_matchers::MatchFinder::MatchResult &Result, + const IntegerLiteral &Literal) const; bool isUserDefinedLiteral( const clang::ast_matchers::MatchFinder::MatchResult &Result, diff --git a/clang-tools-extra/clang-tidy/readability/MakeMemberFunctionConstCheck.cpp b/clang-tools-extra/clang-tidy/readability/MakeMemberFunctionConstCheck.cpp index d42fcba70e81b..85852c2c829a1 100644 --- a/clang-tools-extra/clang-tidy/readability/MakeMemberFunctionConstCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/MakeMemberFunctionConstCheck.cpp @@ -17,6 +17,8 @@ using namespace clang::ast_matchers; namespace clang::tidy::readability { +namespace { + AST_MATCHER(CXXMethodDecl, isStatic) { return Node.isStatic(); } AST_MATCHER(CXXMethodDecl, hasTrivialBody) { return Node.hasTrivialBody(); } @@ -214,6 +216,8 @@ AST_MATCHER(CXXMethodDecl, usesThisAsConst) { return UsageOfThis.Usage == Const; } +} // namespace + void MakeMemberFunctionConstCheck::registerMatchers(MatchFinder *Finder) { Finder->addMatcher( traverse( diff --git a/clang-tools-extra/clang-tidy/readability/MathMissingParenthesesCheck.cpp b/clang-tools-extra/clang-tidy/readability/MathMissingParenthesesCheck.cpp index 64ce94e3fc1db..1d5c6cca5a82d 100644 --- a/clang-tools-extra/clang-tidy/readability/MathMissingParenthesesCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/MathMissingParenthesesCheck.cpp @@ -16,13 +16,15 @@ using namespace clang::ast_matchers; namespace clang::tidy::readability { void MathMissingParenthesesCheck::registerMatchers(MatchFinder *Finder) { - Finder->addMatcher(binaryOperator(unless(hasParent(binaryOperator())), - unless(isAssignmentOperator()), - unless(isComparisonOperator()), - unless(hasAnyOperatorName("&&", "||")), - hasDescendant(binaryOperator())) - .bind("binOp"), - this); + Finder->addMatcher( + binaryOperator( + unless(hasParent(binaryOperator(unless(isAssignmentOperator()), + unless(isComparisonOperator())))), + unless(isAssignmentOperator()), unless(isComparisonOperator()), + unless(hasAnyOperatorName("&&", "||")), + hasDescendant(binaryOperator())) + .bind("binOp"), + this); } static int getPrecedence(const BinaryOperator *BinOp) { @@ -88,10 +90,6 @@ static void addParantheses(const BinaryOperator *BinOp, void MathMissingParenthesesCheck::check( const MatchFinder::MatchResult &Result) { const auto *BinOp = Result.Nodes.getNodeAs("binOp"); - std::vector< - std::pair>> - Insertions; const SourceManager &SM = *Result.SourceManager; const clang::LangOptions &LO = Result.Context->getLangOpts(); addParantheses(BinOp, nullptr, this, SM, LO); diff --git a/clang-tools-extra/clang-tidy/readability/NamespaceCommentCheck.cpp b/clang-tools-extra/clang-tidy/readability/NamespaceCommentCheck.cpp index 64dc941569a96..c04bf361c40ca 100644 --- a/clang-tools-extra/clang-tidy/readability/NamespaceCommentCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/NamespaceCommentCheck.cpp @@ -27,11 +27,15 @@ NamespaceCommentCheck::NamespaceCommentCheck(StringRef Name, "namespace( +(((inline )|([a-zA-Z0-9_:]))+))?\\.? *(\\*/)?$", llvm::Regex::IgnoreCase), ShortNamespaceLines(Options.get("ShortNamespaceLines", 1U)), - SpacesBeforeComments(Options.get("SpacesBeforeComments", 1U)) {} + SpacesBeforeComments(Options.get("SpacesBeforeComments", 1U)), + AllowOmittingNamespaceComments( + Options.get("AllowOmittingNamespaceComments", false)) {} void NamespaceCommentCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { Options.store(Opts, "ShortNamespaceLines", ShortNamespaceLines); Options.store(Opts, "SpacesBeforeComments", SpacesBeforeComments); + Options.store(Opts, "AllowOmittingNamespaceComments", + AllowOmittingNamespaceComments); } void NamespaceCommentCheck::registerMatchers(MatchFinder *Finder) { @@ -106,7 +110,7 @@ void NamespaceCommentCheck::check(const MatchFinder::MatchResult &Result) { // Currently for nested namespace (n1::n2::...) the AST matcher will match foo // then bar instead of a single match. So if we got a nested namespace we have // to skip the next ones. - for (const auto &EndOfNameLocation : Ends) { + for (const SourceLocation &EndOfNameLocation : Ends) { if (Sources.isBeforeInTranslationUnit(ND->getLocation(), EndOfNameLocation)) return; } @@ -140,6 +144,7 @@ void NamespaceCommentCheck::check(const MatchFinder::MatchResult &Result) { SourceRange OldCommentRange(AfterRBrace, AfterRBrace); std::string Message = "%0 not terminated with a closing comment"; + bool HasComment = false; // Try to find existing namespace closing comment on the same line. if (Tok.is(tok::comment) && NextTokenIsOnSameLine) { @@ -158,6 +163,8 @@ void NamespaceCommentCheck::check(const MatchFinder::MatchResult &Result) { return; } + HasComment = true; + // Otherwise we need to fix the comment. NeedLineBreak = Comment.starts_with("/*"); OldCommentRange = @@ -180,8 +187,13 @@ void NamespaceCommentCheck::check(const MatchFinder::MatchResult &Result) { } std::string NamespaceNameForDiag = - ND->isAnonymousNamespace() ? "anonymous namespace" - : ("namespace '" + *NamespaceNameAsWritten + "'"); + ND->isAnonymousNamespace() + ? "anonymous namespace" + : ("namespace '" + *NamespaceNameAsWritten + "'"); + + // If no namespace comment is allowed + if (!HasComment && AllowOmittingNamespaceComments) + return; std::string Fix(SpacesBeforeComments, ' '); Fix.append("// namespace"); diff --git a/clang-tools-extra/clang-tidy/readability/NamespaceCommentCheck.h b/clang-tools-extra/clang-tidy/readability/NamespaceCommentCheck.h index 7607d37b1b2fd..8edd77213f779 100644 --- a/clang-tools-extra/clang-tidy/readability/NamespaceCommentCheck.h +++ b/clang-tools-extra/clang-tidy/readability/NamespaceCommentCheck.h @@ -34,6 +34,7 @@ class NamespaceCommentCheck : public ClangTidyCheck { llvm::Regex NamespaceCommentPattern; const unsigned ShortNamespaceLines; const unsigned SpacesBeforeComments; + const bool AllowOmittingNamespaceComments; llvm::SmallVector Ends; }; diff --git a/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.cpp b/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.cpp index 00999ee8310c1..91a08b9d8de69 100644 --- a/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.cpp @@ -50,10 +50,9 @@ std::optional findQualToken(const VarDecl *Decl, Qualifier Qual, if (FileRange.isInvalid()) return std::nullopt; - tok::TokenKind Tok = - Qual == Qualifier::Const - ? tok::kw_const - : Qual == Qualifier::Volatile ? tok::kw_volatile : tok::kw_restrict; + tok::TokenKind Tok = Qual == Qualifier::Const ? tok::kw_const + : Qual == Qualifier::Volatile ? tok::kw_volatile + : tok::kw_restrict; return utils::lexer::getQualifyingToken(Tok, FileRange, *Result.Context, *Result.SourceManager); diff --git a/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp b/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp index 4c0812f0e6793..d59b0312673b9 100644 --- a/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp @@ -186,6 +186,7 @@ static ClangTidyModuleRegistry::Add // This anchor is used to force the linker to link in the generated object file // and thus register the ReadabilityModule. +// NOLINTNEXTLINE(misc-use-internal-linkage) volatile int ReadabilityModuleAnchorSource = 0; } // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/readability/RedundantDeclarationCheck.cpp b/clang-tools-extra/clang-tidy/readability/RedundantDeclarationCheck.cpp index 7850a6f29995f..053892dffc7b6 100644 --- a/clang-tools-extra/clang-tidy/readability/RedundantDeclarationCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/RedundantDeclarationCheck.cpp @@ -15,10 +15,14 @@ using namespace clang::ast_matchers; namespace clang::tidy::readability { +namespace { + AST_MATCHER(FunctionDecl, doesDeclarationForceExternallyVisibleDefinition) { return Node.doesDeclarationForceExternallyVisibleDefinition(); } +} // namespace + RedundantDeclarationCheck::RedundantDeclarationCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), diff --git a/clang-tools-extra/clang-tidy/readability/RedundantFunctionPtrDereferenceCheck.cpp b/clang-tools-extra/clang-tidy/readability/RedundantFunctionPtrDereferenceCheck.cpp index 44053ebd21dc4..a70719fd8a041 100644 --- a/clang-tools-extra/clang-tidy/readability/RedundantFunctionPtrDereferenceCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/RedundantFunctionPtrDereferenceCheck.cpp @@ -13,7 +13,8 @@ using namespace clang::ast_matchers; namespace clang::tidy::readability { -void RedundantFunctionPtrDereferenceCheck::registerMatchers(MatchFinder *Finder) { +void RedundantFunctionPtrDereferenceCheck::registerMatchers( + MatchFinder *Finder) { Finder->addMatcher( traverse(TK_AsIs, unaryOperator(hasOperatorName("*"), has(implicitCastExpr(hasCastKind( @@ -22,7 +23,8 @@ void RedundantFunctionPtrDereferenceCheck::registerMatchers(MatchFinder *Finder) this); } -void RedundantFunctionPtrDereferenceCheck::check(const MatchFinder::MatchResult &Result) { +void RedundantFunctionPtrDereferenceCheck::check( + const MatchFinder::MatchResult &Result) { const auto *Operator = Result.Nodes.getNodeAs("op"); diag(Operator->getOperatorLoc(), "redundant repeated dereference of function pointer") diff --git a/clang-tools-extra/clang-tidy/readability/RedundantFunctionPtrDereferenceCheck.h b/clang-tools-extra/clang-tidy/readability/RedundantFunctionPtrDereferenceCheck.h index fdcf821bcf60f..a04e9c165bc03 100644 --- a/clang-tools-extra/clang-tidy/readability/RedundantFunctionPtrDereferenceCheck.h +++ b/clang-tools-extra/clang-tidy/readability/RedundantFunctionPtrDereferenceCheck.h @@ -19,7 +19,8 @@ namespace clang::tidy::readability { /// http://clang.llvm.org/extra/clang-tidy/checks/readability/redundant-function-ptr-dereference.html class RedundantFunctionPtrDereferenceCheck : public ClangTidyCheck { public: - RedundantFunctionPtrDereferenceCheck(StringRef Name, ClangTidyContext *Context) + RedundantFunctionPtrDereferenceCheck(StringRef Name, + ClangTidyContext *Context) : ClangTidyCheck(Name, Context) {} void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; diff --git a/clang-tools-extra/clang-tidy/readability/RedundantInlineSpecifierCheck.cpp b/clang-tools-extra/clang-tidy/readability/RedundantInlineSpecifierCheck.cpp index 1693e5c5e9cd4..969bf2d1add6b 100644 --- a/clang-tools-extra/clang-tidy/readability/RedundantInlineSpecifierCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/RedundantInlineSpecifierCheck.cpp @@ -38,8 +38,8 @@ AST_POLYMORPHIC_MATCHER(isInlineSpecified, AST_POLYMORPHIC_MATCHER_P(isInternalLinkage, AST_POLYMORPHIC_SUPPORTED_TYPES(FunctionDecl, VarDecl), - bool, strictMode) { - if (!strictMode) + bool, StrictMode) { + if (!StrictMode) return false; if (const auto *FD = dyn_cast(&Node)) return FD->getStorageClass() == SC_Static || FD->isInAnonymousNamespace(); diff --git a/clang-tools-extra/clang-tidy/readability/RedundantStringCStrCheck.cpp b/clang-tools-extra/clang-tidy/readability/RedundantStringCStrCheck.cpp index 57f13db078020..c90d1521e6b8d 100644 --- a/clang-tools-extra/clang-tidy/readability/RedundantStringCStrCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/RedundantStringCStrCheck.cpp @@ -52,12 +52,11 @@ void RedundantStringCStrCheck::registerMatchers( const auto StringConstructorExpr = expr(anyOf( cxxConstructExpr(argumentCountIs(1), hasDeclaration(cxxMethodDecl(hasName("basic_string")))), - cxxConstructExpr( - argumentCountIs(2), - hasDeclaration(cxxMethodDecl(hasName("basic_string"))), - // If present, the second argument is the alloc object which must not - // be present explicitly. - hasArgument(1, cxxDefaultArgExpr())))); + cxxConstructExpr(argumentCountIs(2), + hasDeclaration(cxxMethodDecl(hasName("basic_string"))), + // If present, the second argument is the alloc object + // which must not be present explicitly. + hasArgument(1, cxxDefaultArgExpr())))); // Match string constructor. const auto StringViewConstructorExpr = cxxConstructExpr( @@ -105,8 +104,9 @@ void RedundantStringCStrCheck::registerMatchers( // Detect: 'dst.append(str.c_str())' -> 'dst.append(str)' Finder->addMatcher( - cxxMemberCallExpr(on(StringExpr), callee(decl(cxxMethodDecl(hasAnyName( - "append", "assign", "compare")))), + cxxMemberCallExpr(on(StringExpr), + callee(decl(cxxMethodDecl( + hasAnyName("append", "assign", "compare")))), argumentCountIs(1), hasArgument(0, StringCStrCallExpr)), this); diff --git a/clang-tools-extra/clang-tidy/readability/SimplifySubscriptExprCheck.h b/clang-tools-extra/clang-tidy/readability/SimplifySubscriptExprCheck.h index 83bab16b2f7aa..deffb09f5db28 100644 --- a/clang-tools-extra/clang-tidy/readability/SimplifySubscriptExprCheck.h +++ b/clang-tools-extra/clang-tidy/readability/SimplifySubscriptExprCheck.h @@ -25,7 +25,7 @@ class SimplifySubscriptExprCheck : public ClangTidyCheck { } void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; - void storeOptions(ClangTidyOptions::OptionMap& Opts) override; + void storeOptions(ClangTidyOptions::OptionMap &Opts) override; std::optional getCheckTraversalKind() const override { return TK_IgnoreUnlessSpelledInSource; } diff --git a/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp b/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp index 7c3aee29c146d..4336c723bd7cd 100644 --- a/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp +++ b/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp @@ -337,8 +337,7 @@ Allow empty enabled checks. This suppresses the "no checks enabled" error when disabling all of the checks. )"), - cl::init(false), - cl::cat(ClangTidyCategory)); + cl::init(false), cl::cat(ClangTidyCategory)); namespace clang::tidy { @@ -370,8 +369,8 @@ static void printStats(const ClangTidyStats &Stats) { } } -static std::unique_ptr createOptionsProvider( - llvm::IntrusiveRefCntPtr FS) { +static std::unique_ptr +createOptionsProvider(llvm::IntrusiveRefCntPtr FS) { ClangTidyGlobalOptions GlobalOptions; if (std::error_code Err = parseLineFilter(LineFilter, GlobalOptions)) { llvm::errs() << "Invalid LineFilter: " << Err.message() << "\n\nUsage:\n"; @@ -448,7 +447,7 @@ static std::unique_ptr createOptionsProvider( std::move(OverrideOptions), std::move(FS)); } -llvm::IntrusiveRefCntPtr +static llvm::IntrusiveRefCntPtr getVfsFromFile(const std::string &OverlayFile, llvm::IntrusiveRefCntPtr BaseFS) { llvm::ErrorOr> Buffer = diff --git a/clang-tools-extra/clang-tidy/utils/IncludeSorter.cpp b/clang-tools-extra/clang-tidy/utils/IncludeSorter.cpp index 83248e1319484..db1ea1bb514f8 100644 --- a/clang-tools-extra/clang-tidy/utils/IncludeSorter.cpp +++ b/clang-tools-extra/clang-tidy/utils/IncludeSorter.cpp @@ -48,8 +48,7 @@ StringRef makeCanonicalName(StringRef Str, IncludeSorter::IncludeStyle Style) { if (StartIndex == StringRef::npos) { StartIndex = 0; } - return Canonical.substr( - 0, Canonical.find_first_of('+', StartIndex)); + return Canonical.substr(0, Canonical.find_first_of('+', StartIndex)); } return removeFirstSuffix( removeFirstSuffix(Str, {".cc", ".cpp", ".c", ".h", ".hpp"}), diff --git a/clang-tools-extra/clang-tidy/utils/NamespaceAliaser.cpp b/clang-tools-extra/clang-tidy/utils/NamespaceAliaser.cpp index 4703ce1269819..22cf23fb2446e 100644 --- a/clang-tools-extra/clang-tidy/utils/NamespaceAliaser.cpp +++ b/clang-tools-extra/clang-tidy/utils/NamespaceAliaser.cpp @@ -16,15 +16,16 @@ namespace clang::tidy::utils { using namespace ast_matchers; +namespace { +AST_MATCHER_P(NamespaceAliasDecl, hasTargetNamespace, + ast_matchers::internal::Matcher, InnerMatcher) { + return InnerMatcher.matches(*Node.getNamespace(), Finder, Builder); +} +} // namespace NamespaceAliaser::NamespaceAliaser(const SourceManager &SourceMgr) : SourceMgr(SourceMgr) {} -AST_MATCHER_P(NamespaceAliasDecl, hasTargetNamespace, - ast_matchers::internal::Matcher, innerMatcher) { - return innerMatcher.matches(*Node.getNamespace(), Finder, Builder); -} - std::optional NamespaceAliaser::createAlias(ASTContext &Context, const Stmt &Statement, StringRef Namespace, diff --git a/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp b/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp index a40433e38a041..7d84a4a9331b1 100644 --- a/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp +++ b/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp @@ -30,7 +30,7 @@ static void verifyRule(const RewriteRuleWith &Rule) { // If a string unintentionally containing '%' is passed as a diagnostic, Clang // will claim the string is ill-formed and assert-fail. This function escapes // such strings so they can be safely used in diagnostics. -std::string escapeForDiagnostic(std::string ToEscape) { +static std::string escapeForDiagnostic(std::string ToEscape) { // Optimize for the common case that the string does not contain `%` at the // cost of an extra scan over the string in the slow case. auto Pos = ToEscape.find('%'); diff --git a/clang-tools-extra/clang-tidy/utils/TypeTraits.cpp b/clang-tools-extra/clang-tidy/utils/TypeTraits.cpp index 68574d22d15f7..44db0c2aed607 100644 --- a/clang-tools-extra/clang-tidy/utils/TypeTraits.cpp +++ b/clang-tools-extra/clang-tidy/utils/TypeTraits.cpp @@ -41,8 +41,7 @@ std::optional isExpensiveToCopy(QualType Type, return std::nullopt; return !Type.isTriviallyCopyableType(Context) && !classHasTrivialCopyAndDestroy(Type) && - !hasDeletedCopyConstructor(Type) && - !Type->isObjCLifetimeType(); + !hasDeletedCopyConstructor(Type) && !Type->isObjCLifetimeType(); } bool recordIsTriviallyDefaultConstructible(const RecordDecl &RecordDecl, diff --git a/clang-tools-extra/clang-tidy/zircon/TemporaryObjectsCheck.cpp b/clang-tools-extra/clang-tidy/zircon/TemporaryObjectsCheck.cpp index bb2976081a692..bb2c71913193b 100644 --- a/clang-tools-extra/clang-tidy/zircon/TemporaryObjectsCheck.cpp +++ b/clang-tools-extra/clang-tidy/zircon/TemporaryObjectsCheck.cpp @@ -17,11 +17,15 @@ using namespace clang::ast_matchers; namespace clang::tidy::zircon { +namespace { + AST_MATCHER_P(CXXRecordDecl, matchesAnyName, ArrayRef, Names) { std::string QualifiedName = Node.getQualifiedNameAsString(); return llvm::is_contained(Names, QualifiedName); } +} // namespace + void TemporaryObjectsCheck::registerMatchers(MatchFinder *Finder) { // Matcher for default constructors. Finder->addMatcher( diff --git a/clang-tools-extra/clang-tidy/zircon/ZirconTidyModule.cpp b/clang-tools-extra/clang-tidy/zircon/ZirconTidyModule.cpp index 000680455d617..0eb5683a94e41 100644 --- a/clang-tools-extra/clang-tidy/zircon/ZirconTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/zircon/ZirconTidyModule.cpp @@ -32,6 +32,6 @@ static ClangTidyModuleRegistry::Add // This anchor is used to force the linker to link in the generated object file // and thus register the ZirconModule. -volatile int ZirconModuleAnchorSource = 0; +volatile int ZirconModuleAnchorSource = 0; // NOLINT(misc-use-internal-linkage) } // namespace clang::tidy diff --git a/clang-tools-extra/clangd/IncludeCleaner.cpp b/clang-tools-extra/clangd/IncludeCleaner.cpp index dc4c8fc498b1f..382ea3ffe342b 100644 --- a/clang-tools-extra/clangd/IncludeCleaner.cpp +++ b/clang-tools-extra/clangd/IncludeCleaner.cpp @@ -117,7 +117,9 @@ bool mayConsiderUnused(const Inclusion &Inc, ParsedAST &AST, std::vector generateMissingIncludeDiagnostics( ParsedAST &AST, llvm::ArrayRef MissingIncludes, - llvm::StringRef Code, HeaderFilter IgnoreHeaders, const ThreadsafeFS &TFS) { + llvm::StringRef Code, HeaderFilter IgnoreHeaders, + HeaderFilter AngledHeaders, HeaderFilter QuotedHeaders, + const ThreadsafeFS &TFS) { std::vector Result; const SourceManager &SM = AST.getSourceManager(); const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID()); @@ -141,7 +143,18 @@ std::vector generateMissingIncludeDiagnostics( AST.getPreprocessor().getHeaderSearchInfo(), MainFile}); llvm::StringRef HeaderRef{Spelling}; + bool Angled = HeaderRef.starts_with("<"); + if (SymbolWithMissingInclude.Providers.front().kind() == + include_cleaner::Header::Kind::Physical) { + for (auto &Filter : Angled ? QuotedHeaders : AngledHeaders) { + if (Filter(ResolvedPath)) { + Angled = !Angled; + break; + } + } + } + // We might suggest insertion of an existing include in edge cases, e.g., // include is present in a PP-disabled region, or spelling of the header // turns out to be the same as one of the unresolved includes in the @@ -151,6 +164,11 @@ std::vector generateMissingIncludeDiagnostics( if (!Replacement.has_value()) continue; + if (Angled != (Spelling.front() == '<')) { + Spelling.front() = Angled ? '<' : '"'; + Spelling.back() = Angled ? '>' : '"'; + } + Diag &D = Result.emplace_back(); D.Message = llvm::formatv("No header providing \"{0}\" is directly included", @@ -481,18 +499,19 @@ bool isPreferredProvider(const Inclusion &Inc, return false; // no header provides the symbol } -std::vector -issueIncludeCleanerDiagnostics(ParsedAST &AST, llvm::StringRef Code, - const IncludeCleanerFindings &Findings, - const ThreadsafeFS &TFS, - HeaderFilter IgnoreHeaders) { +std::vector issueIncludeCleanerDiagnostics( + ParsedAST &AST, llvm::StringRef Code, + const IncludeCleanerFindings &Findings, const ThreadsafeFS &TFS, + HeaderFilter IgnoreHeaders, HeaderFilter AngledHeaders, + HeaderFilter QuotedHeaders) { trace::Span Tracer("IncludeCleaner::issueIncludeCleanerDiagnostics"); std::vector UnusedIncludes = generateUnusedIncludeDiagnostics( AST.tuPath(), Findings.UnusedIncludes, Code, IgnoreHeaders); std::optional RemoveAllUnused = removeAllUnusedIncludes(UnusedIncludes); std::vector MissingIncludeDiags = generateMissingIncludeDiagnostics( - AST, Findings.MissingIncludes, Code, IgnoreHeaders, TFS); + AST, Findings.MissingIncludes, Code, IgnoreHeaders, AngledHeaders, + QuotedHeaders, TFS); std::optional AddAllMissing = addAllMissingIncludes(MissingIncludeDiags); std::optional FixAll; diff --git a/clang-tools-extra/clangd/IncludeCleaner.h b/clang-tools-extra/clangd/IncludeCleaner.h index 3f6e3b2fd45b6..9439eeed6a3e4 100644 --- a/clang-tools-extra/clangd/IncludeCleaner.h +++ b/clang-tools-extra/clangd/IncludeCleaner.h @@ -57,11 +57,11 @@ IncludeCleanerFindings computeIncludeCleanerFindings(ParsedAST &AST, bool AnalyzeAngledIncludes = false); -std::vector -issueIncludeCleanerDiagnostics(ParsedAST &AST, llvm::StringRef Code, - const IncludeCleanerFindings &Findings, - const ThreadsafeFS &TFS, - HeaderFilter IgnoreHeader = {}); +std::vector issueIncludeCleanerDiagnostics( + ParsedAST &AST, llvm::StringRef Code, + const IncludeCleanerFindings &Findings, const ThreadsafeFS &TFS, + HeaderFilter IgnoreHeader = {}, HeaderFilter AngledHeaders = {}, + HeaderFilter QuotedHeaders = {}); /// Converts the clangd include representation to include-cleaner /// include representation. diff --git a/clang-tools-extra/clangd/InlayHints.cpp b/clang-tools-extra/clangd/InlayHints.cpp index bdab2b8a9f377..20a238612a7e4 100644 --- a/clang-tools-extra/clangd/InlayHints.cpp +++ b/clang-tools-extra/clangd/InlayHints.cpp @@ -33,6 +33,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Twine.h" +#include "llvm/ADT/identity.h" #include "llvm/Support/Casting.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FormatVariadic.h" @@ -375,7 +376,11 @@ static FunctionProtoTypeLoc getPrototypeLoc(Expr *Fn) { } if (auto F = Target.getAs()) { - return F; + // In some edge cases the AST can contain a "trivial" FunctionProtoTypeLoc + // which has null parameters. Avoid these as they don't contain useful + // information. + if (llvm::all_of(F.getParams(), llvm::identity())) + return F; } return {}; diff --git a/clang-tools-extra/clangd/ModulesBuilder.cpp b/clang-tools-extra/clangd/ModulesBuilder.cpp index bf77f43bd28bb..d88aa01aad05d 100644 --- a/clang-tools-extra/clangd/ModulesBuilder.cpp +++ b/clang-tools-extra/clangd/ModulesBuilder.cpp @@ -430,10 +430,10 @@ class CachingProjectModules : public ProjectModules { /// Collect the directly and indirectly required module names for \param /// ModuleName in topological order. The \param ModuleName is guaranteed to /// be the last element in \param ModuleNames. -llvm::SmallVector getAllRequiredModules(PathRef RequiredSource, - CachingProjectModules &MDB, - StringRef ModuleName) { - llvm::SmallVector ModuleNames; +llvm::SmallVector getAllRequiredModules(PathRef RequiredSource, + CachingProjectModules &MDB, + StringRef ModuleName) { + llvm::SmallVector ModuleNames; llvm::StringSet<> ModuleNamesSet; auto VisitDeps = [&](StringRef ModuleName, auto Visitor) -> void { @@ -444,7 +444,7 @@ llvm::SmallVector getAllRequiredModules(PathRef RequiredSource, if (ModuleNamesSet.insert(RequiredModuleName).second) Visitor(RequiredModuleName, Visitor); - ModuleNames.push_back(ModuleName); + ModuleNames.push_back(ModuleName.str()); }; VisitDeps(ModuleName, VisitDeps); @@ -494,13 +494,13 @@ llvm::Error ModulesBuilder::ModulesBuilderImpl::getOrBuildModuleFile( // Get Required modules in topological order. auto ReqModuleNames = getAllRequiredModules(RequiredSource, MDB, ModuleName); for (llvm::StringRef ReqModuleName : ReqModuleNames) { - if (BuiltModuleFiles.isModuleUnitBuilt(ModuleName)) + if (BuiltModuleFiles.isModuleUnitBuilt(ReqModuleName)) continue; if (auto Cached = Cache.getModule(ReqModuleName)) { if (IsModuleFileUpToDate(Cached->getModuleFilePath(), BuiltModuleFiles, TFS.view(std::nullopt))) { - log("Reusing module {0} from {1}", ModuleName, + log("Reusing module {0} from {1}", ReqModuleName, Cached->getModuleFilePath()); BuiltModuleFiles.addModuleFile(std::move(Cached)); continue; @@ -508,14 +508,16 @@ llvm::Error ModulesBuilder::ModulesBuilderImpl::getOrBuildModuleFile( Cache.remove(ReqModuleName); } + std::string ReqFileName = + MDB.getSourceForModuleName(ReqModuleName, RequiredSource); llvm::Expected MF = buildModuleFile( - ModuleName, ModuleUnitFileName, getCDB(), TFS, BuiltModuleFiles); + ReqModuleName, ReqFileName, getCDB(), TFS, BuiltModuleFiles); if (llvm::Error Err = MF.takeError()) return Err; - log("Built module {0} to {1}", ModuleName, MF->getModuleFilePath()); + log("Built module {0} to {1}", ReqModuleName, MF->getModuleFilePath()); auto BuiltModuleFile = std::make_shared(std::move(*MF)); - Cache.add(ModuleName, BuiltModuleFile); + Cache.add(ReqModuleName, BuiltModuleFile); BuiltModuleFiles.addModuleFile(std::move(BuiltModuleFile)); } diff --git a/clang-tools-extra/clangd/ParsedAST.cpp b/clang-tools-extra/clangd/ParsedAST.cpp index 9e1f6bb977226..48896e5f4ff87 100644 --- a/clang-tools-extra/clangd/ParsedAST.cpp +++ b/clang-tools-extra/clangd/ParsedAST.cpp @@ -381,8 +381,9 @@ std::vector getIncludeCleanerDiags(ParsedAST &AST, llvm::StringRef Code, Findings.MissingIncludes.clear(); if (SuppressUnused) Findings.UnusedIncludes.clear(); - return issueIncludeCleanerDiagnostics(AST, Code, Findings, TFS, - Cfg.Diagnostics.Includes.IgnoreHeader); + return issueIncludeCleanerDiagnostics( + AST, Code, Findings, TFS, Cfg.Diagnostics.Includes.IgnoreHeader, + Cfg.Style.AngledHeaders, Cfg.Style.QuotedHeaders); } tidy::ClangTidyCheckFactories diff --git a/clang-tools-extra/clangd/test/module_dependencies.test b/clang-tools-extra/clangd/test/module_dependencies.test new file mode 100644 index 0000000000000..79306a73da435 --- /dev/null +++ b/clang-tools-extra/clangd/test/module_dependencies.test @@ -0,0 +1,95 @@ +# A smoke test to check that a simple dependency chain for modules can work. +# +# FIXME: The test fails on Windows; see comments on https://github.com/llvm/llvm-project/pull/142828 +# UNSUPPORTED: system-windows +# +# RUN: rm -fr %t +# RUN: mkdir -p %t +# RUN: split-file %s %t +# +# RUN: sed -e "s|DIR|%/t|g" %t/compile_commands.json.tmpl > %t/compile_commands.json.tmp +# RUN: sed -e "s|CLANG_CC|%clang|g" %t/compile_commands.json.tmp > %t/compile_commands.json +# RUN: sed -e "s|DIR|%/t|g" %t/definition.jsonrpc.tmpl > %t/definition.jsonrpc.tmp +# +# On Windows, we need the URI in didOpen to look like "uri":"file:///C:/..." +# (with the extra slash in the front), so we add it here. +# RUN: sed -E -e 's|"file://([A-Z]):/|"file:///\1:/|g' %/t/definition.jsonrpc.tmp > %/t/definition.jsonrpc +# +# RUN: clangd -experimental-modules-support -lit-test < %t/definition.jsonrpc \ +# RUN: | FileCheck -strict-whitespace %t/definition.jsonrpc + +#--- A-frag.cppm +export module A:frag; +export void printA() {} + +#--- A.cppm +export module A; +export import :frag; + +#--- Use.cpp +import A; +void foo() { + print +} + +#--- compile_commands.json.tmpl +[ + { + "directory": "DIR", + "command": "CLANG_CC -fprebuilt-module-path=DIR -std=c++20 -o DIR/main.cpp.o -c DIR/Use.cpp", + "file": "DIR/Use.cpp" + }, + { + "directory": "DIR", + "command": "CLANG_CC -std=c++20 DIR/A.cppm --precompile -o DIR/A.pcm", + "file": "DIR/A.cppm" + }, + { + "directory": "DIR", + "command": "CLANG_CC -std=c++20 DIR/A-frag.cppm --precompile -o DIR/A-frag.pcm", + "file": "DIR/A-frag.cppm" + } +] + +#--- definition.jsonrpc.tmpl +{ + "jsonrpc": "2.0", + "id": 0, + "method": "initialize", + "params": { + "processId": 123, + "rootPath": "clangd", + "capabilities": { + "textDocument": { + "completion": { + "completionItem": { + "snippetSupport": true + } + } + } + }, + "trace": "off" + } +} +--- +{ + "jsonrpc": "2.0", + "method": "textDocument/didOpen", + "params": { + "textDocument": { + "uri": "file://DIR/Use.cpp", + "languageId": "cpp", + "version": 1, + "text": "import A;\nvoid foo() {\n print\n}\n" + } + } +} + +# CHECK: "message"{{.*}}printA{{.*}}(fix available) + +--- +{"jsonrpc":"2.0","id":1,"method":"textDocument/completion","params":{"textDocument":{"uri":"file://DIR/Use.cpp"},"context":{"triggerKind":1},"position":{"line":2,"character":6}}} +--- +{"jsonrpc":"2.0","id":2,"method":"shutdown"} +--- +{"jsonrpc":"2.0","method":"exit"} diff --git a/clang-tools-extra/clangd/tool/ClangdMain.cpp b/clang-tools-extra/clangd/tool/ClangdMain.cpp index 4bd256d6be22b..b11d194da04db 100644 --- a/clang-tools-extra/clangd/tool/ClangdMain.cpp +++ b/clang-tools-extra/clangd/tool/ClangdMain.cpp @@ -913,7 +913,6 @@ clangd accepts flags on the commandline, and in the CLANGD_FLAGS environment var if (!ResourceDir.empty()) Opts.ResourceDir = ResourceDir; Opts.BuildDynamicSymbolIndex = true; - std::vector> IdxStack; #if CLANGD_ENABLE_REMOTE if (RemoteIndexAddress.empty() != ProjectRoot.empty()) { llvm::errs() << "remote-index-address and project-path have to be " diff --git a/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp b/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp index 0ee748c1ed2d0..ec733cbe9c42d 100644 --- a/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp +++ b/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp @@ -220,13 +220,16 @@ TEST(IncludeCleaner, ComputeMissingHeaders) { TEST(IncludeCleaner, GenerateMissingHeaderDiags) { Annotations MainFile(R"cpp( #include "a.h" +#include "angled_wrapper.h" #include "all.h" $insert_b[[]]#include "baz.h" #include "dir/c.h" $insert_d[[]]$insert_foo[[]]#include "fuzz.h" #include "header.h" -$insert_foobar[[]]#include -$insert_f[[]]$insert_vector[[]] +$insert_foobar[[]]$insert_quoted[[]]$insert_quoted2[[]]#include "quoted_wrapper.h" +$insert_angled[[]]#include +$insert_f[[]]#include +$insert_vector[[]] #define DEF(X) const Foo *X; #define BAZ(X) const X x @@ -237,6 +240,9 @@ TEST(IncludeCleaner, GenerateMissingHeaderDiags) { void foo() { $b[[b]](); + $angled[[angled]](); + $quoted[[quoted]](); + $quoted2[[quoted2]](); ns::$bar[[Bar]] bar; bar.d(); @@ -263,12 +269,22 @@ TEST(IncludeCleaner, GenerateMissingHeaderDiags) { TU.AdditionalFiles["a.h"] = guard("#include \"b.h\""); TU.AdditionalFiles["b.h"] = guard("void b();"); + TU.AdditionalFiles["angled_wrapper.h"] = guard("#include "); + TU.AdditionalFiles["angled.h"] = guard("void angled();"); + TU.ExtraArgs.push_back("-I" + testPath(".")); + + TU.AdditionalFiles["quoted_wrapper.h"] = guard("#include \"quoted.h\""); + TU.AdditionalFiles["quoted.h"] = guard("void quoted();"); + TU.AdditionalFiles["dir/c.h"] = guard("#include \"d.h\""); TU.AdditionalFiles["dir/d.h"] = guard("namespace ns { struct Bar { void d(); }; }"); TU.AdditionalFiles["system/e.h"] = guard("#include "); TU.AdditionalFiles["system/f.h"] = guard("void f();"); + TU.AdditionalFiles["system/quoted2_wrapper.h"] = + guard("#include "); + TU.AdditionalFiles["system/quoted2.h"] = guard("void quoted2();"); TU.ExtraArgs.push_back("-isystem" + testPath("system")); TU.AdditionalFiles["fuzz.h"] = guard("#include \"buzz.h\""); @@ -297,7 +313,15 @@ TEST(IncludeCleaner, GenerateMissingHeaderDiags) { Findings.UnusedIncludes.clear(); std::vector Diags = issueIncludeCleanerDiagnostics( AST, TU.Code, Findings, MockFS(), - {[](llvm::StringRef Header) { return Header.ends_with("buzz.h"); }}); + /*IgnoreHeaders=*/{[](llvm::StringRef Header) { + return Header.ends_with("buzz.h"); + }}, + /*AngledHeaders=*/{[](llvm::StringRef Header) { + return Header.contains("angled.h"); + }}, + /*QuotedHeaders=*/{[](llvm::StringRef Header) { + return Header.contains("quoted.h") || Header.contains("quoted2.h"); + }}); EXPECT_THAT( Diags, UnorderedElementsAre( @@ -306,6 +330,23 @@ TEST(IncludeCleaner, GenerateMissingHeaderDiags) { withFix({Fix(MainFile.range("insert_b"), "#include \"b.h\"\n", "#include \"b.h\""), FixMessage("add all missing includes")})), + AllOf(Diag(MainFile.range("angled"), + "No header providing \"angled\" is directly included"), + withFix({Fix(MainFile.range("insert_angled"), + "#include \n", "#include "), + FixMessage("add all missing includes")})), + AllOf( + Diag(MainFile.range("quoted"), + "No header providing \"quoted\" is directly included"), + withFix({Fix(MainFile.range("insert_quoted"), + "#include \"quoted.h\"\n", "#include \"quoted.h\""), + FixMessage("add all missing includes")})), + AllOf(Diag(MainFile.range("quoted2"), + "No header providing \"quoted2\" is directly included"), + withFix( + {Fix(MainFile.range("insert_quoted2"), + "#include \"quoted2.h\"\n", "#include \"quoted2.h\""), + FixMessage("add all missing includes")})), AllOf(Diag(MainFile.range("bar"), "No header providing \"ns::Bar\" is directly included"), withFix({Fix(MainFile.range("insert_d"), diff --git a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp index c3331d20730f1..e0cd955bb1c9a 100644 --- a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp +++ b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp @@ -1011,11 +1011,16 @@ TEST(ParameterHints, FunctionPointer) { f3_t f3; using f4_t = void(__stdcall *)(int param); f4_t f4; + __attribute__((noreturn)) f4_t f5; void bar() { f1($f1[[42]]); f2($f2[[42]]); f3($f3[[42]]); f4($f4[[42]]); + // This one runs into an edge case in clang's type model + // and we can't extract the parameter name. But at least + // we shouldn't crash. + f5(42); } )cpp", ExpectedHint{"param: ", "f1"}, ExpectedHint{"param: ", "f2"}, diff --git a/clang-tools-extra/clangd/unittests/PrerequisiteModulesTest.cpp b/clang-tools-extra/clangd/unittests/PrerequisiteModulesTest.cpp index 03e65768c26a6..ae2d98ce90d8f 100644 --- a/clang-tools-extra/clangd/unittests/PrerequisiteModulesTest.cpp +++ b/clang-tools-extra/clangd/unittests/PrerequisiteModulesTest.cpp @@ -247,13 +247,11 @@ import Dep; ProjectModules->getRequiredModules(getFullPath("M.cppm")).empty()); // Set the mangler to filter out the invalid flag - ProjectModules->setCommandMangler( - [](tooling::CompileCommand &Command, PathRef) { - auto const It = - std::find(Command.CommandLine.begin(), Command.CommandLine.end(), - "-invalid-unknown-flag"); - Command.CommandLine.erase(It); - }); + ProjectModules->setCommandMangler([](tooling::CompileCommand &Command, + PathRef) { + auto const It = llvm::find(Command.CommandLine, "-invalid-unknown-flag"); + Command.CommandLine.erase(It); + }); // And now it returns a non-empty list of required modules since the // compilation succeeded diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index e0f81a032c38d..882ee0015df17 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -159,6 +159,10 @@ Changes in existing checks false positives on deleted constructors that cannot be used to construct objects, even if they have public or protected access. +- Added an option to :doc:`bugprone-multi-level-implicit-pointer-conversion + ` to + choose whether to enable the check in C code or not. + - Improved :doc:`bugprone-optional-value-conversion ` check to detect conversion in argument of ``std::make_optional``. @@ -187,6 +191,16 @@ Changes in existing checks ` check by fixing a false positive where ``strerror`` was flagged as MT-unsafe. +- Improved :doc:`google-readability-namespace-comments + ` check by adding + the option `AllowOmittingNamespaceComments` to accept if a namespace comment + is omitted entirely. + +- Improved :doc:`llvm-namespace-comment + ` check by adding the option + `AllowOmittingNamespaceComments` to accept if a namespace comment is omitted + entirely. + - Improved :doc:`misc-const-correctness ` check by adding the option `AllowedTypes`, that excludes specified types from const-correctness @@ -223,6 +237,10 @@ Changes in existing checks ` check by avoiding diagnosing designated initializers for ``std::array`` initializations. +- Improved :doc:`modernize-use-integer-sign-comparison + ` check by matching + valid integer expressions not directly wrapped around an implicit cast. + - Improved :doc:`modernize-use-ranges ` check by updating suppress warnings logic for ``nullptr`` in ``std::find``. @@ -236,6 +254,13 @@ Changes in existing checks ` check to support math functions of different precisions. +- Improved :doc:`modernize-use-trailing-return-type + ` check by adding + support to modernize lambda signatures to use trailing return type and adding + two new options: `TransformFunctions` and `TransformLambdas` to control + whether function declarations and lambdas should be transformed by the check. + Fixed false positives when lambda was matched as a function in C++11 mode. + - Improved :doc:`performance-move-const-arg ` check by fixing false negatives on ternary operators calling ``std::move``. @@ -245,6 +270,15 @@ Changes in existing checks tolerating fix-it breaking compilation when functions is used as pointers to avoid matching usage of functions within the current compilation unit. +- Improved :doc:`readability-convert-member-functions-to-static + ` check by + fixing false positives on member functions with an explicit object parameter. + +- Improved :doc:`readability-math-missing-parentheses + ` check by fixing + false negatives where math expressions are the operand of assignment operators + or comparison operators. + - Improved :doc:`readability-qualified-auto ` check by adding the option `AllowedTypes`, that excludes specified types from adding qualifiers. diff --git a/clang-tools-extra/docs/clang-tidy/checks/bugprone/multi-level-implicit-pointer-conversion.rst b/clang-tools-extra/docs/clang-tidy/checks/bugprone/multi-level-implicit-pointer-conversion.rst index e6dc5c13aa025..14df6bd9ccea9 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/bugprone/multi-level-implicit-pointer-conversion.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/bugprone/multi-level-implicit-pointer-conversion.rst @@ -42,3 +42,11 @@ Additionally, it is recommended that developers thoroughly check and verify the safety of the conversion before using an explicit cast. This extra level of caution can help catch potential issues early on in the development process, improving the overall reliability and maintainability of the code. + +Options +------- + +.. option:: EnableInC + + If `true`, enables the check in C code (it is always enabled in C++ code). + Default is `true`. diff --git a/clang-tools-extra/docs/clang-tidy/checks/bugprone/return-const-ref-from-parameter.rst b/clang-tools-extra/docs/clang-tidy/checks/bugprone/return-const-ref-from-parameter.rst index ba47399914de3..325a0a2aa9cc2 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/bugprone/return-const-ref-from-parameter.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/bugprone/return-const-ref-from-parameter.rst @@ -42,7 +42,7 @@ on the control flow of the function, an overload where all problematic This issue can also be resolved by adding ``[[clang::lifetimebound]]``. Clang enable ``-Wdangling`` warning by default which can detect mis-uses of the -annotated function. See `lifetimebound attribute `_ +annotated function. See `lifetimebound attribute `_ for details. .. code-block:: c++ diff --git a/clang-tools-extra/docs/clang-tidy/checks/llvm/namespace-comment.rst b/clang-tools-extra/docs/clang-tidy/checks/llvm/namespace-comment.rst index be90260be73af..23673c9b4cfd4 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/llvm/namespace-comment.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/llvm/namespace-comment.rst @@ -39,3 +39,9 @@ Options An unsigned integer specifying the number of spaces before the comment closing a namespace definition. Default is `1U`. + +.. option:: AllowOmittingNamespaceComments + + When `true`, the check will accept if no namespace comment is present. + The check will only fail if the specified namespace comment is different + than expected. Default is `false`. diff --git a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-trailing-return-type.rst b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-trailing-return-type.rst index 0593a35326aaa..2dac7cc76f418 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-trailing-return-type.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-trailing-return-type.rst @@ -3,7 +3,7 @@ modernize-use-trailing-return-type ================================== -Rewrites function signatures to use a trailing return type +Rewrites function and lambda signatures to use a trailing return type (introduced in C++11). This transformation is purely stylistic. The return type before the function name is replaced by ``auto`` and inserted after the function parameter list (and qualifiers). @@ -16,6 +16,7 @@ Example int f1(); inline int f2(int arg) noexcept; virtual float f3() const && = delete; + auto lambda = []() {}; transforms to: @@ -24,6 +25,7 @@ transforms to: auto f1() -> int; inline auto f2(int arg) -> int noexcept; virtual auto f3() const && -> float = delete; + auto lambda = []() -> void {}; Known Limitations ----------------- @@ -66,3 +68,25 @@ a careless rewrite would produce the following output: This code fails to compile because the S in the context of f refers to the equally named function parameter. Similarly, the S in the context of m refers to the equally named class member. The check can currently only detect and avoid a clash with a function parameter name. + +Options +------- + +.. option:: TransformFunctions + + When set to `true`, function declarations will be transformed to use trailing + return. Default is `true`. + +.. option:: TransformLambdas + + Controls how lambda expressions are transformed to use trailing + return type. Possible values are: + + * `all` - Transform all lambda expressions without an explicit return type + to use trailing return type. If type can not be deduced, ``auto`` will be + used since C++14 and generic message will be emitted otherwise. + * `all_except_auto` - Transform all lambda expressions except those whose return + type can not be deduced. + * `none` - Do not transform any lambda expressions. + + Default is `all`. diff --git a/clang-tools-extra/test/clang-doc/invalid-options.cpp b/clang-tools-extra/test/clang-doc/invalid-options.cpp index 59a0944718e31..15e098ad4c784 100644 --- a/clang-tools-extra/test/clang-doc/invalid-options.cpp +++ b/clang-tools-extra/test/clang-doc/invalid-options.cpp @@ -2,7 +2,7 @@ // RUN: rm -rf %t && touch %t // RUN: not clang-doc %s -output=%t/subdir 2>&1 | FileCheck %s --check-prefix=OUTPUT-FAIL // OUTPUT-FAIL: clang-doc error: -// OUTPUT-FAIL: {{(Not a directory|[Nn]o such file or directory)}} +// OUTPUT-FAIL-SAME: failed to create directory. /// Invalid format option. // RUN: rm -rf %t && mkdir %t && touch %t/file diff --git a/clang-tools-extra/test/clang-doc/json/class-template.cpp b/clang-tools-extra/test/clang-doc/json/class-template.cpp new file mode 100644 index 0000000000000..e3ca086d1d9a4 --- /dev/null +++ b/clang-tools-extra/test/clang-doc/json/class-template.cpp @@ -0,0 +1,29 @@ +// RUN: rm -rf %t && mkdir -p %t +// RUN: clang-doc --output=%t --format=json --executor=standalone %s +// RUN: FileCheck %s < %t/GlobalNamespace/MyClass.json + +template struct MyClass { + T MemberTemplate; + T method(T Param); +}; + +// CHECK: "Name": "MyClass", +// CHECK: "Name": "method", +// CHECK: "Params": [ +// CHECK-NEXT: { +// CHECK-NEXT: "Name": "Param", +// CHECK-NEXT: "Type": "T" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "ReturnType": { +// CHECK-NEXT: "IsBuiltIn": false, +// CHECK-NEXT: "IsTemplate": false, +// CHECK-NEXT: "Name": "T", +// CHECK-NEXT: "QualName": "T" +// CHECK-NEXT: "USR": "0000000000000000000000000000000000000000" +// CHECK: "Name": "MemberTemplate", +// CHECK: "Type": "T" +// CHECK: "Template": { +// CHECK-NEXT: "Parameters": [ +// CHECK-NEXT: "typename T" +// CHECK-NEXT: ] diff --git a/clang-tools-extra/test/clang-doc/json/class.cpp b/clang-tools-extra/test/clang-doc/json/class.cpp new file mode 100644 index 0000000000000..9ae1f14e2d2a6 --- /dev/null +++ b/clang-tools-extra/test/clang-doc/json/class.cpp @@ -0,0 +1,193 @@ +// RUN: rm -rf %t && mkdir -p %t +// RUN: clang-doc --output=%t --format=json --executor=standalone %s +// RUN: FileCheck %s < %t/GlobalNamespace/MyClass.json + +struct Foo; + +// This is a nice class. +// It has some nice methods and fields. +// @brief This is a brief description. +struct MyClass { + int PublicField; + + int myMethod(int MyParam); + static void staticMethod(); + const int& getConst(); + + enum Color { + RED, + GREEN, + BLUE = 5 + }; + + typedef int MyTypedef; + + class NestedClass; +protected: + int protectedMethod(); + + int ProtectedField; +}; + +// CHECK: { +// CHECK-NEXT: "Description": [ +// CHECK-NEXT: { +// CHECK-NEXT: "FullComment": { +// CHECK-NEXT: "Children": [ +// CHECK-NEXT: { +// CHECK-NEXT: "ParagraphComment": { +// CHECK-NEXT: "Children": [ +// CHECK-NEXT: { +// CHECK-NEXT: "TextComment": " This is a nice class." +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "TextComment": " It has some nice methods and fields." +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "TextComment": "" +// CHECK-NEXT: } +// CHECK-NEXT: ] +// CHECK: { +// CHECK-NEXT: "BlockCommandComment": { +// CHECK-NEXT: "Children": [ +// CHECK-NEXT: { +// CHECK-NEXT: "ParagraphComment": { +// CHECK-NEXT: "Children": [ +// CHECK-NEXT: { +// CHECK-NEXT: "TextComment": " This is a brief description." +// CHECK-NEXT: } +// CHECK: "Command": "brief" +// CHECK: "Enums": [ +// CHECK-NEXT: { +// CHECK-NEXT: "Location": { +// CHECK-NEXT: "Filename": "{{.*}}class.cpp", +// CHECK-NEXT: "LineNumber": 17 +// CHECK-NEXT: }, +// CHECK-NEXT: "Members": [ +// CHECK-NEXT: { +// CHECK-NEXT: "Name": "RED", +// CHECK-NEXT: "Value": "0" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "Name": "GREEN", +// CHECK-NEXT: "Value": "1" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "Name": "BLUE", +// CHECK-NEXT: "ValueExpr": "5" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "Name": "Color", +// CHECK-NEXT: "Namespace": [ +// CHECK-NEXT: "MyClass", +// CHECK-NEXT: "GlobalNamespace" +// CHECK-NEXT: ], +// CHECK-NEXT: "Scoped": false, +// CHECK-NEXT: "USR": "{{[0-9A-F]*}}" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// COM: FIXME: FullName is not emitted correctly. +// CHECK-NEXT: "FullName": "", +// CHECK-NEXT: "IsTypedef": false, +// CHECK-NEXT: "Location": { +// CHECK-NEXT: "Filename": "{{.*}}class.cpp", +// CHECK-NEXT: "LineNumber": 10 +// CHECK-NEXT: }, +// CHECK-NEXT: "Name": "MyClass", +// CHECK-NEXT: "Namespace": [ +// CHECK-NEXT: "GlobalNamespace" +// CHECK-NEXT: ], +// CHECK-NEXT: "Path": "GlobalNamespace", +// CHECK-NEXT: "ProtectedFunctions": [ +// CHECK-NEXT: { +// CHECK-NEXT: "IsStatic": false, +// CHECK-NEXT: "Name": "protectedMethod", +// CHECK-NEXT: "Namespace": [ +// CHECK-NEXT: "MyClass", +// CHECK-NEXT: "GlobalNamespace" +// CHECK-NEXT: ], +// CHECK-NEXT: "ReturnType": { +// CHECK-NEXT: "IsBuiltIn": false, +// CHECK-NEXT: "IsTemplate": false, +// CHECK-NEXT: "Name": "int", +// CHECK-NEXT: "QualName": "int", +// CHECK-NEXT: "USR": "{{[0-9A-F]*}}" +// CHECK-NEXT: }, +// CHECK-NEXT: "USR": "{{[0-9A-F]*}}" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "ProtectedMembers": [ +// CHECK-NEXT: { +// CHECK-NEXT: "Name": "ProtectedField", +// CHECK-NEXT: "Type": "int" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "PublicFunctions": [ +// CHECK-NEXT: { +// CHECK-NEXT: "IsStatic": false, +// CHECK-NEXT: "Name": "myMethod", +// CHECK-NEXT: "Namespace": [ +// CHECK-NEXT: "MyClass", +// CHECK-NEXT: "GlobalNamespace" +// CHECK-NEXT: ], +// CHECK-NEXT: "Params": [ +// CHECK-NEXT: { +// CHECK-NEXT: "Name": "MyParam", +// CHECK-NEXT: "Type": "int" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "ReturnType": { +// CHECK-NEXT: "IsBuiltIn": false, +// CHECK-NEXT: "IsTemplate": false, +// CHECK-NEXT: "Name": "int", +// CHECK-NEXT: "QualName": "int", +// CHECK-NEXT: "USR": "{{[0-9A-F]*}}" +// CHECK-NEXT: }, +// CHECK-NEXT: "USR": "{{[0-9A-F]*}}" +// CHECK-NEXT: }, +// CHECK: "IsStatic": true, +// CHECK: "Name": "getConst", +// CHECK: "ReturnType": { +// CHECK-NEXT: "IsBuiltIn": false, +// CHECK-NEXT: "IsTemplate": false, +// CHECK-NEXT: "Name": "const int &", +// CHECK-NEXT: "QualName": "const int &", +// CHECK-NEXT: "USR": "{{[0-9A-F]*}}" +// CHECK-NEXT: }, +// CHECK: "PublicMembers": [ +// CHECK-NEXT: { +// CHECK-NEXT: "Name": "PublicField", +// CHECK-NEXT: "Type": "int" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "Records": [ +// CHECK-NEXT: { +// CHECK-NEXT: "Name": "NestedClass", +// CHECK-NEXT: "Path": "GlobalNamespace{{[\/]+}}MyClass", +// CHECK-NEXT: "QualName": "NestedClass", +// CHECK-NEXT: "USR": "{{[0-9A-F]*}}" +// CHECK-NEXT: } +// CHECK-NEXT: ] +// CHECK-NEXT: "TagType": "struct", +// CHECK-NEXT: "Typedefs": [ +// CHECK-NEXT: { +// CHECK-NEXT: "IsUsing": false, +// CHECK-NEXT: "Location": { +// CHECK-NEXT: "Filename": "{{.*}}class.cpp", +// CHECK-NEXT: "LineNumber": 23 +// CHECK-NEXT: }, +// CHECK-NEXT: "Name": "MyTypedef", +// CHECK-NEXT: "Namespace": [ +// CHECK-NEXT: "MyClass", +// CHECK-NEXT: "GlobalNamespace" +// CHECK-NEXT: ], +// CHECK-NEXT: "TypeDeclaration": "", +// CHECK-NEXT: "USR": "{{[0-9A-F]*}}", +// CHECK-NEXT: "Underlying": { +// CHECK-NEXT: "IsBuiltIn": false, +// CHECK-NEXT: "IsTemplate": false, +// CHECK-NEXT: "Name": "int", +// CHECK-NEXT: "QualName": "int", +// CHECK-NEXT: "USR": "0000000000000000000000000000000000000000" +// CHECK: "USR": "{{[0-9A-F]*}}" +// CHECK-NEXT: } diff --git a/clang-tools-extra/test/clang-doc/json/function-specifiers.cpp b/clang-tools-extra/test/clang-doc/json/function-specifiers.cpp new file mode 100644 index 0000000000000..7005fb7b3e66e --- /dev/null +++ b/clang-tools-extra/test/clang-doc/json/function-specifiers.cpp @@ -0,0 +1,25 @@ +// RUN: rm -rf %t && mkdir -p %t +// RUN: clang-doc --output=%t --format=json --executor=standalone %s +// RUN: FileCheck %s < %t/GlobalNamespace/index.json + +static void myFunction() {} + +void noExceptFunction() noexcept {} + +inline void inlineFunction() {} + +extern void externFunction() {} + +constexpr void constexprFunction() {} + +// CHECK: "Functions": [ +// CHECK-NEXT: { +// CHECK: "IsStatic": true, +// COM: FIXME: Emit ExceptionSpecificationType +// CHECK-NOT: "ExceptionSpecifcation" : "noexcept", +// COM: FIXME: Emit inline +// CHECK-NOT: "IsInline": true, +// COM: FIXME: Emit extern +// CHECK-NOT: "IsExtern": true, +// COM: FIXME: Emit constexpr +// CHECK-NOT: "IsConstexpr": true, diff --git a/clang-tools-extra/test/clang-doc/json/method-template.cpp b/clang-tools-extra/test/clang-doc/json/method-template.cpp new file mode 100644 index 0000000000000..c51a2706d1c22 --- /dev/null +++ b/clang-tools-extra/test/clang-doc/json/method-template.cpp @@ -0,0 +1,40 @@ +// RUN: rm -rf %t && mkdir -p %t +// RUN: clang-doc --output=%t --format=json --executor=standalone %s +// RUN: FileCheck %s < %t/GlobalNamespace/MyClass.json + +struct MyClass { + template T methodTemplate(T param) { + } +}; + +// CHECK: "PublicFunctions": [ +// CHECK-NEXT: { +// CHECK-NEXT: "IsStatic": false, +// CHECK-NEXT: "Location": { +// CHECK-NEXT: "Filename": "{{.*}}method-template.cpp", +// CHECK-NEXT: "LineNumber": 6 +// CHECK-NEXT: }, +// CHECK-NEXT: "Name": "methodTemplate", +// CHECK-NEXT: "Namespace": [ +// CHECK-NEXT: "MyClass", +// CHECK-NEXT: "GlobalNamespace" +// CHECK-NEXT: ], +// CHECK-NEXT: "Params": [ +// CHECK-NEXT: { +// CHECK-NEXT: "Name": "param", +// CHECK-NEXT: "Type": "T" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "ReturnType": { +// CHECK-NEXT: "IsBuiltIn": false, +// CHECK-NEXT: "IsTemplate": false, +// CHECK-NEXT: "Name": "T", +// CHECK-NEXT: "QualName": "T", +// CHECK-NEXT: "USR": "0000000000000000000000000000000000000000" +// CHECK-NEXT: }, +// CHECK-NEXT: "Template": { +// CHECK-NEXT: "Parameters": [ +// CHECK-NEXT: "class T" +// CHECK-NEXT: ] +// CHECK-NEXT: }, +// CHECK-NEXT: "USR": "{{[0-9A-F]*}}" diff --git a/clang-tools-extra/test/clang-doc/json/namespace.cpp b/clang-tools-extra/test/clang-doc/json/namespace.cpp new file mode 100644 index 0000000000000..928864be1feb0 --- /dev/null +++ b/clang-tools-extra/test/clang-doc/json/namespace.cpp @@ -0,0 +1,107 @@ +// RUN: rm -rf %t && mkdir -p %t +// RUN: clang-doc --output=%t --format=json --executor=standalone %s +// RUN: FileCheck %s < %t/GlobalNamespace/index.json + +class MyClass {}; + +void myFunction(int Param); + +namespace NestedNamespace { +} // namespace NestedNamespace + +// FIXME: Global variables are not mapped or serialized. +static int Global; + +enum Color { + RED, + GREEN, + BLUE = 5 +}; + +typedef int MyTypedef; + +// CHECK: { +// CHECK-NEXT: "Enums": [ +// CHECK-NEXT: { +// CHECK-NEXT: "Location": { +// CHECK-NEXT: "Filename": "{{.*}}namespace.cpp", +// CHECK-NEXT: "LineNumber": 15 +// CHECK-NEXT: }, +// CHECK-NEXT: "Members": [ +// CHECK-NEXT: { +// CHECK-NEXT: "Name": "RED", +// CHECK-NEXT: "Value": "0" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "Name": "GREEN", +// CHECK-NEXT: "Value": "1" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "Name": "BLUE", +// CHECK-NEXT: "ValueExpr": "5" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "Name": "Color", +// CHECK-NEXT: "Scoped": false, +// CHECK-NEXT: "USR": "{{[0-9A-F]*}}" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "Functions": [ +// CHECK-NEXT: { +// CHECK-NEXT: "IsStatic": false, +// CHECK-NEXT: "Name": "myFunction", +// CHECK-NEXT: "Params": [ +// CHECK-NEXT: { +// CHECK-NEXT: "Name": "Param", +// CHECK-NEXT: "Type": "int" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "ReturnType": { +// CHECK-NEXT: "IsBuiltIn": false, +// CHECK-NEXT: "IsTemplate": false, +// CHECK-NEXT: "Name": "void", +// CHECK-NEXT: "QualName": "void", +// CHECK-NEXT: "USR": "0000000000000000000000000000000000000000" +// CHECK-NEXT: }, +// CHECK-NEXT: "USR": "{{[0-9A-F]*}}" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "Name": "", +// CHECK-NEXT: "Namespaces": [ +// CHECK-NEXT: { +// CHECK-NEXT: "Name": "NestedNamespace", +// CHECK-NEXT: "Path": "", +// CHECK-NEXT: "QualName": "NestedNamespace", +// CHECK-NEXT: "USR": "{{[0-9A-F]*}}" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "Records": [ +// CHECK-NEXT: { +// CHECK-NEXT: "Name": "MyClass", +// CHECK-NEXT: "Path": "GlobalNamespace", +// CHECK-NEXT: "QualName": "MyClass", +// CHECK-NEXT: "USR": "{{[0-9A-F]*}}" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "Typedefs": [ +// CHECK-NEXT: { +// CHECK-NEXT: "IsUsing": false, +// CHECK-NEXT: "Location": { +// CHECK-NEXT: "Filename": "{{.*}}namespace.cpp", +// CHECK-NEXT: "LineNumber": 21 +// CHECK-NEXT: }, +// CHECK-NEXT: "Name": "MyTypedef", +// CHECK-NEXT: "TypeDeclaration": "", +// CHECK-NEXT: "USR": "{{[0-9A-F]*}}", +// CHECK-NEXT: "Underlying": { +// CHECK-NEXT: "IsBuiltIn": false, +// CHECK-NEXT: "IsTemplate": false, +// CHECK-NEXT: "Name": "int", +// CHECK-NEXT: "QualName": "int", +// CHECK-NEXT: "USR": "0000000000000000000000000000000000000000" +// CHECK-NEXT: } +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "USR": "0000000000000000000000000000000000000000" +// CHECK-NOT: "Variables": [ +// CHECK-NEXT: } diff --git a/clang-tools-extra/test/clang-doc/mustache-index.cpp b/clang-tools-extra/test/clang-doc/mustache-index.cpp new file mode 100644 index 0000000000000..cad4cc8b6931a --- /dev/null +++ b/clang-tools-extra/test/clang-doc/mustache-index.cpp @@ -0,0 +1,75 @@ +// RUN: rm -rf %t && mkdir -p %t +// RUN: clang-doc --format=mustache --output=%t --executor=standalone %s +// RUN: FileCheck %s < %t/GlobalNamespace/index.html + +enum Color { + RED, + BLUE, + GREEN +}; + +class Foo; + +// CHECK: +// CHECK-NEXT:
    +// CHECK-NEXT: +// CHECK-NEXT:
+// CHECK: +// CHECK-NEXT:
    +// CHECK-NEXT: +// CHECK-NEXT:
+ +// CHECK:
+// CHECK-NEXT:

Enumerations

+// CHECK-NEXT:
+// CHECK-NEXT:
+// CHECK-NEXT:
+// CHECK-NEXT:
+// CHECK-NEXT:                      
+// CHECK-NEXT:                          enum Color
+// CHECK-NEXT:                      
+// CHECK-NEXT:                  
+// CHECK-NEXT:
+// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK: +// CHECK-NEXT: +// CHECK-NEXT:
NameValue
RED0
BLUE1
GREEN2
+// CHECK-NEXT:
+// CHECK-NEXT: Defined at line 5 of file {{.*}}mustache-index.cpp +// CHECK-NEXT:
+// CHECK-NEXT:
+// CHECK-NEXT:
+// CHECK-NEXT:
+ +// CHECK:
+// CHECK-NEXT:

Inner Classes

+// CHECK-NEXT:
    +// CHECK-NEXT:
  • +// CHECK-NEXT:
    class Foo
    +// CHECK-NEXT:
  • +// CHECK-NEXT:
+// CHECK-NEXT:
diff --git a/clang-tools-extra/test/clang-doc/mustache-separate-namespace.cpp b/clang-tools-extra/test/clang-doc/mustache-separate-namespace.cpp new file mode 100644 index 0000000000000..ec29b2449169b --- /dev/null +++ b/clang-tools-extra/test/clang-doc/mustache-separate-namespace.cpp @@ -0,0 +1,13 @@ +// RUN: rm -rf %t && mkdir -p %t +// RUN: clang-doc --format=mustache --output=%t --executor=standalone %s +// RUN: FileCheck %s < %t/MyNamespace/index.html + +namespace MyNamespace { + class Foo; +} + +// CHECK:
    +// CHECK-NEXT:
  • +// CHECK-NEXT:
    class Foo
    +// CHECK-NEXT:
  • +// CHECK-NEXT:
diff --git a/clang-tools-extra/test/clang-doc/templates.cpp b/clang-tools-extra/test/clang-doc/templates.cpp index 426a0b16befd4..abe03a7d2d0ea 100644 --- a/clang-tools-extra/test/clang-doc/templates.cpp +++ b/clang-tools-extra/test/clang-doc/templates.cpp @@ -112,22 +112,22 @@ tuple func_with_tuple_param(tuple t) { return t; // YAML-NEXT: - USR: '{{([0-9A-F]{40})}}' // YAML-NEXT: Name: 'func_with_tuple_param' // YAML-NEXT: Description: -// YAML-NEXT: - Kind: 'FullComment' +// YAML-NEXT: - Kind: FullComment // YAML-NEXT: Children: -// YAML-NEXT: - Kind: 'ParagraphComment' +// YAML-NEXT: - Kind: ParagraphComment // YAML-NEXT: Children: -// YAML-NEXT: - Kind: 'TextComment' +// YAML-NEXT: - Kind: TextComment // YAML-NEXT: Text: ' A function with a tuple parameter' -// YAML-NEXT: - Kind: 'ParagraphComment' +// YAML-NEXT: - Kind: ParagraphComment // YAML-NEXT: Children: -// YAML-NEXT: - Kind: 'TextComment' -// YAML-NEXT: - Kind: 'ParamCommandComment' +// YAML-NEXT: - Kind: TextComment +// YAML-NEXT: - Kind: ParamCommandComment // YAML-NEXT: Direction: '[in]' // YAML-NEXT: ParamName: 't' // YAML-NEXT: Children: -// YAML-NEXT: - Kind: 'ParagraphComment' +// YAML-NEXT: - Kind: ParagraphComment // YAML-NEXT: Children: -// YAML-NEXT: - Kind: 'TextComment' +// YAML-NEXT: - Kind: TextComment // YAML-NEXT: Text: ' The input to func_with_tuple_param' // YAML-NEXT: DefLocation: // YAML-NEXT: LineNumber: [[# @LINE - 23]] diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/multi-level-implicit-pointer-conversion.c b/clang-tools-extra/test/clang-tidy/checkers/bugprone/multi-level-implicit-pointer-conversion.c new file mode 100644 index 0000000000000..9dc5dae5c80f5 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/multi-level-implicit-pointer-conversion.c @@ -0,0 +1,11 @@ +// RUN: %check_clang_tidy -check-suffixes=ENABLE-IN-C %s bugprone-multi-level-implicit-pointer-conversion %t -- -config="{CheckOptions: {bugprone-multi-level-implicit-pointer-conversion.EnableInC: true}}" +// RUN: %check_clang_tidy -check-suffixes=DISABLE-IN-C %s bugprone-multi-level-implicit-pointer-conversion %t -- -config="{CheckOptions: {bugprone-multi-level-implicit-pointer-conversion.EnableInC: false}}" + +void free(void*); + +void test() { + char **p; + free(p); + // CHECK-MESSAGES-ENABLE-IN-C: :[[@LINE-1]]:8: warning: multilevel pointer conversion from 'char **' to 'void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion] + free((void *)p); +} diff --git a/clang-tools-extra/test/clang-tidy/checkers/google/readability-namespace-comments-missing-nested-namespaces.cpp b/clang-tools-extra/test/clang-tidy/checkers/google/readability-namespace-comments-missing-nested-namespaces.cpp new file mode 100644 index 0000000000000..de42df30cb796 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/google/readability-namespace-comments-missing-nested-namespaces.cpp @@ -0,0 +1,32 @@ +// RUN: %check_clang_tidy %s google-readability-namespace-comments %t -std=c++20 \ +// RUN: '-config={CheckOptions: { \ +// RUN: google-readability-namespace-comments.AllowOmittingNamespaceComments: true, \ +// RUN: google-readability-namespace-comments.ShortNamespaceLines: 0, \ +// RUN: }}' + +// accept if namespace comments are fully omitted +namespace n1::n2 { +namespace /*comment1*/n3/*comment2*/::/*comment3*/inline/*comment4*/n4/*comment5*/ { +void f(); +}} + +namespace n5::inline n6 { +void f(); +} + +namespace n7::inline n8 { +void f(); +} + +// accept if namespace comments are partly omitted (e.g. only for nested namespace) +namespace n1::n2 { +namespace n3::n4 { +void f(); +} +} // namespace n1::n2 + +// fail if namespace comment is different than expected +namespace n9::inline n10 { +void f(); +} // namespace n9::n10 +// CHECK-MESSAGES: :[[@LINE-1]]:2: warning: namespace 'n9::inline n10' ends with a comment that refers to a wrong namespace 'n9::n10' [google-readability-namespace-comments] diff --git a/clang-tools-extra/test/clang-tidy/checkers/google/readability-namespace-comments-missing.cpp b/clang-tools-extra/test/clang-tidy/checkers/google/readability-namespace-comments-missing.cpp new file mode 100644 index 0000000000000..019add1ed06d2 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/google/readability-namespace-comments-missing.cpp @@ -0,0 +1,40 @@ +// RUN: %check_clang_tidy %s google-readability-namespace-comments %t \ +// RUN: -config='{CheckOptions: { \ +// RUN: google-readability-namespace-comments.AllowOmittingNamespaceComments: true, \ +// RUN: google-readability-namespace-comments.ShortNamespaceLines: 0, \ +// RUN: }}' + +// accept if namespace comments are fully omitted +namespace n1 { +namespace /* a comment */ n2 /* another comment */ { +void f(); +}} + +#define MACRO macro_expansion +namespace MACRO { +void f(); +} + +namespace [[deprecated("foo")]] namespace_with_attr { +inline namespace inline_namespace { +void f(); +} +} + +namespace [[]] { +void f(); +} + +// accept if namespace comments are partly omitted (e.g. only for nested namespace) +namespace n3 { +namespace n4 { +void f(); +} // n4 +} + +// fail if namespace comment is different than expected +namespace n1 { +void f(); +} // namespace n2 +// CHECK-MESSAGES: :[[@LINE-1]]:2: warning: namespace 'n1' ends with a comment that refers to a wrong namespace 'n2' [google-readability-namespace-comments] + diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-integer-sign-comparison.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-integer-sign-comparison.cpp index e0a84ef5aed26..d93a05ac38050 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-integer-sign-comparison.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-integer-sign-comparison.cpp @@ -121,3 +121,81 @@ int AllComparisons() { return 0; } + +namespace PR127471 { + int getSignedValue(); + unsigned int getUnsignedValue(); + + void callExprTest() { + + if (getSignedValue() < getUnsignedValue()) + return; +// CHECK-MESSAGES: :[[@LINE-2]]:13: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison] +// CHECK-FIXES: if (std::cmp_less(getSignedValue() , getUnsignedValue())) + + int sVar = 0; + if (getUnsignedValue() > sVar) + return; +// CHECK-MESSAGES: :[[@LINE-2]]:13: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison] +// CHECK-FIXES: if (std::cmp_greater(getUnsignedValue() , sVar)) + + unsigned int uVar = 0; + if (getSignedValue() > uVar) + return; +// CHECK-MESSAGES: :[[@LINE-2]]:13: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison] +// CHECK-FIXES: if (std::cmp_greater(getSignedValue() , uVar)) + + } + + // Add a class with member functions for testing member function calls + class TestClass { + public: + int getSignedValue() { return -5; } + unsigned int getUnsignedValue() { return 5; } + }; + + void memberFunctionTests() { + TestClass obj; + + if (obj.getSignedValue() < obj.getUnsignedValue()) + return; +// CHECK-MESSAGES: :[[@LINE-2]]:13: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison] +// CHECK-FIXES: if (std::cmp_less(obj.getSignedValue() , obj.getUnsignedValue())) + } + + void castFunctionTests() { + // C-style casts with function calls + if ((int)getUnsignedValue() < (unsigned int)getSignedValue()) + return; +// CHECK-MESSAGES: :[[@LINE-2]]:13: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison] +// CHECK-FIXES: if (std::cmp_less(getUnsignedValue(),getSignedValue())) + + + // Static casts with function calls + if (static_cast(getUnsignedValue()) < static_cast(getSignedValue())) + return; +// CHECK-MESSAGES: :[[@LINE-2]]:13: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison] +// CHECK-FIXES: if (std::cmp_less(getUnsignedValue(),getSignedValue())) + } + + // Define tests + #define SIGNED_FUNC getSignedValue() + #define UNSIGNED_FUNC getUnsignedValue() + + void defineTests() { + if (SIGNED_FUNC < UNSIGNED_FUNC) + return; +// CHECK-MESSAGES: :[[@LINE-2]]:13: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison] +// CHECK-FIXES: if (std::cmp_less(SIGNED_FUNC , UNSIGNED_FUNC)) + } + + // Template tests (should not warn) + template + void templateFunctionTest(T1 value) { + if (value() < getUnsignedValue()) + return; + + if (value() < (getSignedValue() || getUnsignedValue())) + return; + } +} // namespace PR127471 diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-trailing-return-type-transform-lambdas-cxx14.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-trailing-return-type-transform-lambdas-cxx14.cpp new file mode 100644 index 0000000000000..33051c63e4f17 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-trailing-return-type-transform-lambdas-cxx14.cpp @@ -0,0 +1,24 @@ +// RUN: %check_clang_tidy -std=c++14-or-later %s modernize-use-trailing-return-type %t -- -- -fno-delayed-template-parsing + +namespace std { + template + class vector {}; + + class string {}; +} // namespace std + +void test_lambda_positive() { + auto l1 = [](auto x) { return x; }; + // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use a trailing return type for this lambda [modernize-use-trailing-return-type] + // CHECK-FIXES: {{^}} auto l1 = [](auto x) -> auto { return x; };{{$}} +} + +template