llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
27.82k stars 11.46k forks source link

"Instruction does not dominate all uses" error with shufflevector and icmp #64929

Closed vient closed 7 months ago

vient commented 1 year ago

Compiling LLVM 17.0.0-rc3 with full LTO and PGO, got the following error

Instruction does not dominate all uses!
  %157 = icmp eq <2 x ptr> %156, %138
  %155 = shufflevector <2 x i1> %157, <2 x i1> %154, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
LLVM ERROR: Broken module found, compilation aborted!

Link commands look like this

/work/stage1/install/bin/clang++ -march=x86-64-v3 -fno-pie -gdwarf-4 -g1 -Wno-backend-plugin -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -fprofile-instr-use="/work/stage2-prof-gen/profiles/clang.profdata" -flto=full -O3 -DNDEBUG -Wl,--emit-relocs -no-pie -fuse-ld=lld -fuse-ld=lld -Wl,--color-diagnostics -fprofile-instr-use="/work/stage2-prof-gen/profiles/clang.profdata" -flto=full    -Wl,--gc-sections tools/dsymutil/CMakeFiles/dsymutil.dir/dsymutil.cpp.o tools/dsymutil/CMakeFiles/dsymutil.dir/BinaryHolder.cpp.o tools/dsymutil/CMakeFiles/dsymutil.dir/CFBundle.cpp.o tools/dsymutil/CMakeFiles/dsymutil.dir/DebugMap.cpp.o tools/dsymutil/CMakeFiles/dsymutil.dir/DwarfLinkerForBinary.cpp.o tools/dsymutil/CMakeFiles/dsymutil.dir/MachODebugMapParser.cpp.o tools/dsymutil/CMakeFiles/dsymutil.dir/MachOUtils.cpp.o tools/dsymutil/CMakeFiles/dsymutil.dir/Reproducer.cpp.o tools/dsymutil/CMakeFiles/dsymutil.dir/SymbolMap.cpp.o -o bin/dsymutil  -Wl,-rpath,"\$ORIGIN/../lib:"  lib/libLLVMX86CodeGen.a  lib/libLLVMX86Desc.a  lib/libLLVMX86Info.a  lib/libLLVMAsmPrinter.a  lib/libLLVMCodeGen.a  lib/libLLVMCodeGenTypes.a  lib/libLLVMDWARFLinker.a  lib/libLLVMDWARFLinkerParallel.a  lib/libLLVMDebugInfoDWARF.a  lib/libLLVMMC.a  lib/libLLVMObject.a  lib/libLLVMOption.a  lib/libLLVMRemarks.a  lib/libLLVMSupport.a  lib/libLLVMTarget.a  lib/libLLVMTargetParser.a  -lpthread  lib/libLLVMMCDisassembler.a  lib/libLLVMCFGuard.a  lib/libLLVMGlobalISel.a  lib/libLLVMInstrumentation.a  lib/libLLVMSelectionDAG.a  lib/libLLVMAsmPrinter.a  lib/libLLVMCodeGen.a  lib/libLLVMCodeGenTypes.a  lib/libLLVMTarget.a  lib/libLLVMBitWriter.a  lib/libLLVMObjCARCOpts.a  lib/libLLVMScalarOpts.a  lib/libLLVMAggressiveInstCombine.a  lib/libLLVMInstCombine.a  lib/libLLVMTransformUtils.a  lib/libLLVMAnalysis.a  lib/libLLVMProfileData.a  lib/libLLVMSymbolize.a  lib/libLLVMDebugInfoPDB.a  lib/libLLVMDebugInfoMSF.a  lib/libLLVMDebugInfoBTF.a  lib/libLLVMDebugInfoDWARF.a  lib/libLLVMObject.a  lib/libLLVMMCParser.a  lib/libLLVMMC.a  lib/libLLVMDebugInfoCodeView.a  lib/libLLVMIRReader.a  lib/libLLVMBitReader.a  lib/libLLVMAsmParser.a  lib/libLLVMCore.a  lib/libLLVMRemarks.a  lib/libLLVMBitstreamReader.a  lib/libLLVMTextAPI.a  lib/libLLVMBinaryFormat.a  lib/libLLVMTargetParser.a  lib/libLLVMSupport.a  -lrt  -ldl  -lpthread  -lm  /usr/lib/x86_64-linux-gnu/libz.so  lib/libLLVMDemangle.a

I assume it may be better to provide you with a reproducer? I don't have it at the moment since it occurred in CI.

fhahn commented 1 year ago

I assume it may be better to provide you with a reproducer?

Yes, unfortunately without a reproducer there's not much we can do to fix that, especially the build above uses PGO.

vient commented 1 year ago

Here is the reproducer that worked on my system. Only LLVM code is now used: I compile clang 17.0.0-rc3, compile profiled version, gather profiles on clang itself and then try to use that profile.

Generated clang.profdata which is used in the "build PGO compiler" step

Full reproducer ```bash #!/bin/bash -eux apt update apt install --yes git export LLD_IN_TEST=1 LLVM_GIT_BRANCH="llvmorg-17.0.0-rc3" DEBUG_FLAGS="-gdwarf-4 -g1" LLVM_C_FLAGS="-march=x86-64-v3 -fno-pie ${DEBUG_FLAGS}" LLVM_CXX_FLAGS="${LLVM_C_FLAGS}" LLVM_SHARED_LINKER_FLAGS="-Wl,--emit-relocs" LLVM_EXE_LINKER_FLAGS="${LLVM_SHARED_LINKER_FLAGS} -no-pie" TOPLEV="$(realpath work)" LLVM_PROJECT_DIR="${TOPLEV}/llvm-project" BASE_COMPILER_DIR="${TOPLEV}/stage1" BINUTILS_INCLUDE_DIR="${TOPLEV}/binutils/include" mkdir -p "${TOPLEV}" cd "$_" git clone --depth 1 git://sourceware.org/git/binutils-gdb.git binutils & git clone -b "${LLVM_GIT_BRANCH}" --depth=1 https://github.com/llvm/llvm-project.git & apt install --yes \ apt-transport-https \ build-essential \ cmake \ coreutils \ curl \ libc6-dev-i386 \ linux-tools-generic \ psmisc \ python3 \ python3-pip \ sed \ software-properties-common \ vim \ wget python3 -m pip install --break-system-packages ninja wait mkdir -p "${BASE_COMPILER_DIR}" cd "$_" cmake -G Ninja "${LLVM_PROJECT_DIR}/llvm" \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_FLAGS="${LLVM_C_FLAGS}" \ -DCMAKE_CXX_FLAGS="${LLVM_CXX_FLAGS}" \ -DCMAKE_EXE_LINKER_FLAGS="-no-pie" \ -DCMAKE_INSTALL_PREFIX="${BASE_COMPILER_DIR}/install" \ -DCOMPILER_RT_BUILD_LIBFUZZER=OFF \ -DCOMPILER_RT_BUILD_SANITIZERS=OFF \ -DCOMPILER_RT_BUILD_XRAY=OFF \ -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld;bolt" \ -DLLVM_ENABLE_RUNTIMES="compiler-rt" \ -DLLVM_TARGETS_TO_BUILD=X86 ninja install ninja -t clean # build self-profiling compiler mkdir -p "${TOPLEV}/stage2-prof-gen" cd "$_" CPATH="${BASE_COMPILER_DIR}/install/bin" LLVM_EXE_LINKER_FLAGS="${LLVM_EXE_LINKER_FLAGS} -fuse-ld=lld" LLVM_SHARED_LINKER_FLAGS="${LLVM_SHARED_LINKER_FLAGS} -fuse-ld=lld" cmake -G Ninja "${LLVM_PROJECT_DIR}/llvm" \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_COMPILER="${CPATH}/clang" \ -DCMAKE_C_FLAGS="${LLVM_C_FLAGS} -Xclang -mllvm -Xclang -vp-counters-per-site=256" \ -DCMAKE_CXX_COMPILER="${CPATH}/clang++" \ -DCMAKE_CXX_FLAGS="${LLVM_CXX_FLAGS} -Xclang -mllvm -Xclang -vp-counters-per-site=256" \ -DCMAKE_EXE_LINKER_FLAGS="${LLVM_EXE_LINKER_FLAGS}" \ -DCMAKE_SHARED_LINKER_FLAGS="${LLVM_SHARED_LINKER_FLAGS}" \ -DCMAKE_INSTALL_PREFIX="${TOPLEV}/stage2-prof-gen/install" \ -DLLVM_BINUTILS_INCDIR="${BINUTILS_INCLUDE_DIR}" \ -DLLVM_BUILD_INSTRUMENTED=IR \ -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld" \ -DLLVM_ENABLE_RUNTIMES="compiler-rt" \ -DLLVM_ENABLE_TERMINFO=OFF \ -DLLVM_PROFILE_DATA_DIR="${TOPLEV}/stage2-prof-gen/profiles/%p" \ -DLLVM_TARGETS_TO_BUILD=X86 \ -DLLVM_USE_LINKER=lld ninja install ninja -t clean # gather compiler profiles CPATH="${TOPLEV}/stage2-prof-gen/install/bin" mkdir -p "${TOPLEV}/stage3-train-llvm-release" cd "$_" cmake -G Ninja "${LLVM_PROJECT_DIR}/llvm" \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_COMPILER="${CPATH}/clang" \ -DCMAKE_C_FLAGS="${LLVM_C_FLAGS}" \ -DCMAKE_CXX_COMPILER="${CPATH}/clang++" \ -DCMAKE_CXX_FLAGS="${LLVM_CXX_FLAGS}" \ -DCMAKE_EXE_LINKER_FLAGS="-no-pie" \ -DCMAKE_INSTALL_PREFIX="${PWD}/install" \ -DCOMPILER_RT_BUILD_LIBFUZZER=OFF \ -DCOMPILER_RT_BUILD_SANITIZERS=OFF \ -DCOMPILER_RT_BUILD_XRAY=OFF \ -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld;bolt" \ -DLLVM_ENABLE_RUNTIMES="compiler-rt" \ -DLLVM_TARGETS_TO_BUILD=X86 \ -DLLVM_USE_LINKER=lld ninja rm -rf "${TOPLEV}/stage3-train"* # merge profiles cd "${TOPLEV}/stage2-prof-gen/profiles" "${BASE_COMPILER_DIR}/install/bin/llvm-profdata" merge -output=clang.profdata ./* # build PGO compiler mkdir -p "${TOPLEV}/stage2-prof-use-lto" cd "$_" CPATH="${BASE_COMPILER_DIR}/install/bin" cmake -G Ninja "${LLVM_PROJECT_DIR}/llvm" \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_COMPILER="${CPATH}/clang" \ -DCMAKE_C_FLAGS="${LLVM_C_FLAGS} -Wno-backend-plugin" \ -DCMAKE_CXX_COMPILER="${CPATH}/clang++" \ -DCMAKE_CXX_FLAGS="${LLVM_CXX_FLAGS} -Wno-backend-plugin" \ -DCMAKE_EXE_LINKER_FLAGS="${LLVM_EXE_LINKER_FLAGS}" \ -DCMAKE_INSTALL_PREFIX="${TOPLEV}/stage2-prof-use-lto/install" \ -DCMAKE_SHARED_LINKER_FLAGS="${LLVM_SHARED_LINKER_FLAGS}" \ -DLLVM_BINUTILS_INCDIR="${BINUTILS_INCLUDE_DIR}" \ -DLLVM_ENABLE_LTO=Full \ -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld;bolt" \ -DLLVM_ENABLE_RUNTIMES="compiler-rt" \ -DLLVM_PARALLEL_LINK_JOBS=30 \ -DLLVM_PROFDATA_FILE="${TOPLEV}/stage2-prof-gen/profiles/clang.profdata" \ -DLLVM_TARGETS_TO_BUILD=X86 \ -DLLVM_USE_LINKER=lld ninja bin/dsymutil # error ```
Error ```console /test/work/stage1/install/bin/clang++ -march=x86-64-v3 -fno-pie -gdwarf-4 -g1 -Wno-backend-plugin -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -fprofile-instr-use="/test/work/stage2-prof-gen/profiles/clang.profdata" -flto=full -O3 -DNDEBUG -Wl,--emit-relocs -no-pie -fuse-ld=lld -fuse-ld=lld -Wl,--color-diagnostics -fprofile-instr-use="/test/work/stage2-prof-gen/profiles/clang.profdata" -flto=full -Wl,--gc-sections tools/dsymutil/CMakeFiles/dsymutil.dir/dsymutil.cpp.o tools/dsymutil/CMakeFiles/dsymutil.dir/BinaryHolder.cpp.o tools/dsymutil/CMakeFiles/dsymutil.dir/CFBundle.cpp.o tools/dsymutil/CMakeFiles/dsymutil.dir/DebugMap.cpp.o tools/dsymutil/CMakeFiles/dsymutil.dir/DwarfLinkerForBinary.cpp.o tools/dsymutil/CMakeFiles/dsymutil.dir/MachODebugMapParser.cpp.o tools/dsymutil/CMakeFiles/dsymutil.dir/MachOUtils.cpp.o tools/dsymutil/CMakeFiles/dsymutil.dir/Reproducer.cpp.o tools/dsymutil/CMakeFiles/dsymutil.dir/SymbolMap.cpp.o -o bin/dsymutil -Wl,-rpath,"\$ORIGIN/../lib:" lib/libLLVMX86CodeGen.a lib/libLLVMX86Desc.a lib/libLLVMX86Info.a lib/libLLVMAsmPrinter.a lib/libLLVMCodeGen.a lib/libLLVMCodeGenTypes.a lib/libLLVMDWARFLinker.a lib/libLLVMDWARFLinkerParallel.a lib/libLLVMDebugInfoDWARF.a lib/libLLVMMC.a lib/libLLVMObject.a lib/libLLVMOption.a lib/libLLVMRemarks.a lib/libLLVMSupport.a lib/libLLVMTarget.a lib/libLLVMTargetParser.a lib/libLLVMMCDisassembler.a lib/libLLVMCFGuard.a lib/libLLVMGlobalISel.a lib/libLLVMInstrumentation.a lib/libLLVMSelectionDAG.a lib/libLLVMAsmPrinter.a lib/libLLVMCodeGen.a lib/libLLVMCodeGenTypes.a lib/libLLVMTarget.a lib/libLLVMBitWriter.a lib/libLLVMObjCARCOpts.a lib/libLLVMScalarOpts.a lib/libLLVMAggressiveInstCombine.a lib/libLLVMInstCombine.a lib/libLLVMTransformUtils.a lib/libLLVMAnalysis.a lib/libLLVMProfileData.a lib/libLLVMSymbolize.a lib/libLLVMDebugInfoPDB.a lib/libLLVMDebugInfoMSF.a lib/libLLVMDebugInfoBTF.a lib/libLLVMDebugInfoDWARF.a lib/libLLVMObject.a lib/libLLVMMCParser.a lib/libLLVMMC.a lib/libLLVMDebugInfoCodeView.a lib/libLLVMIRReader.a lib/libLLVMBitReader.a lib/libLLVMAsmParser.a lib/libLLVMCore.a lib/libLLVMRemarks.a lib/libLLVMBitstreamReader.a lib/libLLVMTextAPI.a lib/libLLVMBinaryFormat.a lib/libLLVMTargetParser.a lib/libLLVMSupport.a -lrt -ldl -lm /usr/lib/x86_64-linux-gnu/libz.so lib/libLLVMDemangle.a && : Instruction does not dominate all uses! %157 = icmp eq <2 x ptr> %156, %138 %155 = shufflevector <2 x i1> %157, <2 x i1> %154, <4 x i32> LLVM ERROR: Broken module found, compilation aborted! ```

Edit: updated reproducer to work in ubuntu:23.04 docker container.

vient commented 11 months ago

Removed unneeded parts from reproducer, confirmed that it reproduces on 17.0.1 Reproduces only with LTO=Full but not with Thin or Off.

Save this to repro_64929.sh and run docker run -it -v $PWD:/test ubuntu:23.04 /test/repro_64929.sh

#!/bin/bash -eux

apt update
apt install --yes git apt-transport-https build-essential cmake coreutils curl libc6-dev-i386 linux-tools-generic psmisc python3 python3-pip sed software-properties-common vim wget
python3 -m pip install --break-system-packages ninja

LLVM_GIT_BRANCH="llvmorg-17.0.1"

TOPLEV="$(dirname "$(realpath -s "${BASH_SOURCE[0]}")")"
LLVM_PROJECT_DIR="${TOPLEV}/llvm-project"
BASE_COMPILER_DIR="${TOPLEV}/stage1"
BINUTILS_INCLUDE_DIR="${TOPLEV}/binutils/include"

mkdir -p "${TOPLEV}"
cd "$_"

git clone --depth 1 git://sourceware.org/git/binutils-gdb.git binutils
git clone -b "${LLVM_GIT_BRANCH}" --depth=1 https://github.com/llvm/llvm-project.git

# build base compiler
mkdir -p "${BASE_COMPILER_DIR}"
cd "$_"
cmake -G Ninja "${LLVM_PROJECT_DIR}/llvm" \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX="${BASE_COMPILER_DIR}/install" \
    -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld" \
    -DLLVM_ENABLE_RUNTIMES="compiler-rt" \
    -DLLVM_TARGETS_TO_BUILD=X86
ninja install
ninja -t clean

# build self-profiling compiler
mkdir -p "${TOPLEV}/stage2-prof-gen"
cd "$_"
CPATH="${BASE_COMPILER_DIR}/install/bin"
LLVM_EXE_LINKER_FLAGS="-fuse-ld=lld"
LLVM_SHARED_LINKER_FLAGS="-fuse-ld=lld"
cmake -G Ninja "${LLVM_PROJECT_DIR}/llvm" \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_C_COMPILER="${CPATH}/clang" \
    -DCMAKE_C_FLAGS="-Xclang -mllvm -Xclang -vp-counters-per-site=256" \
    -DCMAKE_CXX_COMPILER="${CPATH}/clang++" \
    -DCMAKE_CXX_FLAGS="-Xclang -mllvm -Xclang -vp-counters-per-site=256" \
    -DCMAKE_EXE_LINKER_FLAGS="${LLVM_EXE_LINKER_FLAGS}" \
    -DCMAKE_SHARED_LINKER_FLAGS="${LLVM_SHARED_LINKER_FLAGS}" \
    -DCMAKE_INSTALL_PREFIX="${TOPLEV}/stage2-prof-gen/install" \
    -DLLVM_BINUTILS_INCDIR="${BINUTILS_INCLUDE_DIR}" \
    -DLLVM_BUILD_INSTRUMENTED=IR \
    -DLLVM_ENABLE_PROJECTS="clang;lld" \
    -DLLVM_PROFILE_DATA_DIR="${TOPLEV}/stage2-prof-gen/profiles/%p" \
    -DLLVM_TARGETS_TO_BUILD=X86 \
    -DLLVM_USE_LINKER=lld
ninja install
ninja -t clean

# gather compiler profiles
CPATH="${TOPLEV}/stage2-prof-gen/install/bin"

mkdir -p "${TOPLEV}/stage3-train-llvm-release"
cd "$_"
cmake -G Ninja "${LLVM_PROJECT_DIR}/llvm" \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_C_COMPILER="${CPATH}/clang" \
    -DCMAKE_CXX_COMPILER="${CPATH}/clang++" \
    -DCMAKE_INSTALL_PREFIX="${PWD}/install" \
    -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" \
    -DLLVM_TARGETS_TO_BUILD=X86 \
    -DLLVM_USE_LINKER=lld
ninja bin/llvm-addr2line  # random small target

rm -rf "${TOPLEV}/stage3-train"*

# merge profiles
cd "${TOPLEV}/stage2-prof-gen/profiles"
"${BASE_COMPILER_DIR}/install/bin/llvm-profdata" merge -output=clang.profdata ./*

# use PGO
mkdir -p "${TOPLEV}/stage2-prof-use-lto"
cd "$_"
CPATH="${BASE_COMPILER_DIR}/install/bin"
cmake -G Ninja "${LLVM_PROJECT_DIR}/llvm" \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_C_COMPILER="${CPATH}/clang" \
    -DCMAKE_CXX_COMPILER="${CPATH}/clang++" \
    -DCMAKE_INSTALL_PREFIX="${TOPLEV}/stage2-prof-use-lto/install" \
    -DLLVM_BINUTILS_INCDIR="${BINUTILS_INCLUDE_DIR}" \
    -DLLVM_ENABLE_LTO=Full \
    -DLLVM_ENABLE_PROJECTS="clang;lld" \
    -DLLVM_PROFDATA_FILE="${TOPLEV}/stage2-prof-gen/profiles/clang.profdata" \
    -DLLVM_TARGETS_TO_BUILD=X86 \
    -DLLVM_USE_LINKER=lld
ninja bin/dsymutil  # fails here
vient commented 7 months ago

Fixed in 17.0.5 here

fhahn commented 7 months ago

@vient Thanks for checking with the latest released version and for closing!