Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LLVM Assertion in autovectorization when compiling with release + overflow-checks since 1.73 #120813

Closed
DavidBJaffe opened this issue Feb 8, 2024 · 4 comments
Assignees
Labels
A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. C-bug Category: This is a bug. I-crash Issue: The compiler crashes (SIGSEGV, SIGABRT, etc). Use I-ICE instead when the compiler panics. llvm-fixed-upstream Issue expected to be fixed by the next major LLVM upgrade, or backported fixes P-high High priority regression-from-stable-to-stable Performance or correctness regression from one stable version to another. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@DavidBJaffe
Copy link

Using Rust 1.76.0 on an Apple M1 Pro with OSX 14.3, using cargo b with opt-level = 3:

fn main() {
    let mut slobber = Vec::<([u8; 52], [u8; 16], usize)>::new();
    slobber.push(([0; 52], [0; 16], 0));
    let mut dels = Vec::<([u8; 16], [u8; 10], i8)>::new();
    let i = 0;
    while i < slobber.len() {
        let j = slobber.len();
        let mut counts = Vec::<(usize, [u8; 16], usize)>::new();
        let mut k = i;
        while k < j {
            let l = slobber.len();
            counts.push((0, [0; 16], 0));
            k = l;
        }
        for u in 1..counts.len() {
            let (b1, b2) = (counts[0].1, counts[u].1);
            let mut diffs = 0;
            for m in 0..16 {
                if b1[m] != b2[m] {
                    diffs += 1;
                }
            }
            if diffs <= 0 {
                dels.push(([0; 16], [0; 10], 0));
            }
        }
    }
}

this happens

mac% cargo b
   Compiling bugsy v0.0.1 (/Users/davidjaffe/repos/infinimmune/bugsy)
error: could not compile `bugsy` (bin "bugsy")

Caused by:
  process didn't exit successfully: `/Users/davidjaffe/.rustup/toolchains/1.76.0-aarch64-apple-darwin/bin/rustc --crate-name bugsy src/main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=100 --crate-type bin --emit=dep-info,link -C opt-level=3 -C embed-bitcode=no -C debuginfo=2 -C split-debuginfo=unpacked -C debug-assertions=on -C metadata=188901b3f11ecd49 -C extra-filename=-188901b3f11ecd49 --out-dir /Users/davidjaffe/repos/infinimmune/bugsy/target/debug/deps -C incremental=/Users/davidjaffe/repos/infinimmune/bugsy/target/debug/incremental -L dependency=/Users/davidjaffe/repos/infinimmune/bugsy/target/debug/deps` (signal: 5, SIGTRAP: trace/breakpoint trap)

The error depends on the optimization level and overflow checking.

@DavidBJaffe DavidBJaffe added the C-bug Category: This is a bug. label Feb 8, 2024
@rustbot rustbot added the needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. label Feb 8, 2024
@saethlin saethlin added I-crash Issue: The compiler crashes (SIGSEGV, SIGABRT, etc). Use I-ICE instead when the compiler panics. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. regression-from-stable-to-stable Performance or correctness regression from one stable version to another. labels Feb 8, 2024
@rustbot rustbot added the I-prioritize Issue: Indicates that prioritization has been requested for this issue. label Feb 8, 2024
@saethlin saethlin added I-crash Issue: The compiler crashes (SIGSEGV, SIGABRT, etc). Use I-ICE instead when the compiler panics. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. and removed I-crash Issue: The compiler crashes (SIGSEGV, SIGABRT, etc). Use I-ICE instead when the compiler panics. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. I-prioritize Issue: Indicates that prioritization has been requested for this issue. needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. labels Feb 8, 2024
@saethlin
Copy link
Member

saethlin commented Feb 8, 2024

This is an LLVM assertion that can be hit by compiling for the aarch64-unknown-linux-gnu as well. I suspect any aarch64 target would hit it.

The regression is in nightly-2023-08-09, which is when #114048, the LLVM 17 update landed.

#5  0x00007dc16fedbd46 in __assert_fail (
    assertion=0x7dc167ca4fce <.L.str.95> "VT.isVector() == N1.getValueType().isVector() && \"TRUNCATE result type type should be vector iff the operand \" \"type is vector!\"", 
    file=0x7dc167e993bd <str.6.llvm> "/checkout/src/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp", line=5734, 
    function=0x7dc1672a701b <.L__PRETTY_FUNCTION__._ZN4llvm12SelectionDAG7getNodeEjRKNS_5SDLocENS_3EVTENS_7SDValueENS_11SDNodeFlagsE> "SDValue llvm::SelectionDAG::getNode(unsigned int, const SDLoc &, EVT, SDValue, const SDNodeFlags)") at assert.c:103
#6  0x00007dc16ecf7219 in llvm::SelectionDAG::getNode(unsigned int, llvm::SDLoc const&, llvm::EVT, llvm::SDValue, llvm::SDNodeFlags) [clone .cold.0] () from /home/ben/rust-master/build/x86_64-unknown-linux-gnu/stage1/lib/libLLVM-17-rust-1.78.0-nightly.so
#7  0x00007dc16e070915 in llvm::SelectionDAG::getZExtOrTrunc(llvm::SDValue, llvm::SDLoc const&, llvm::EVT) ()
   from /home/ben/rust-master/build/x86_64-unknown-linux-gnu/stage1/lib/libLLVM-17-rust-1.78.0-nightly.so
#8  0x00007dc16ca33838 in llvm::AArch64TargetLowering::ReplaceBITCASTResults(llvm::SDNode*, llvm::SmallVectorImpl<llvm::SDValue>&, llvm::SelectionDAG&) const ()
   from /home/ben/rust-master/build/x86_64-unknown-linux-gnu/stage1/lib/libLLVM-17-rust-1.78.0-nightly.so
#9  0x00007dc16ece7e31 in llvm::DAGTypeLegalizer::PromoteIntegerResult(llvm::SDNode*, unsigned int) [clone .cold.0] ()
   from /home/ben/rust-master/build/x86_64-unknown-linux-gnu/stage1/lib/libLLVM-17-rust-1.78.0-nightly.so
#10 0x00007dc16de03705 in llvm::DAGTypeLegalizer::run() ()
   from /home/ben/rust-master/build/x86_64-unknown-linux-gnu/stage1/lib/libLLVM-17-rust-1.78.0-nightly.so
#11 0x00007dc16e2812c9 in llvm::SelectionDAG::LegalizeTypes() ()
   from /home/ben/rust-master/build/x86_64-unknown-linux-gnu/stage1/lib/libLLVM-17-rust-1.78.0-nightly.so
#12 0x00007dc16e2819ca in llvm::SelectionDAGISel::CodeGenAndEmitDAG() ()
   from /home/ben/rust-master/build/x86_64-unknown-linux-gnu/stage1/lib/libLLVM-17-rust-1.78.0-nightly.so
#13 0x00007dc16e48aa1a in llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) ()
   from /home/ben/rust-master/build/x86_64-unknown-linux-gnu/stage1/lib/libLLVM-17-rust-1.78.0-nightly.so
#14 0x00007dc16e1461f9 in llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) ()
   from /home/ben/rust-master/build/x86_64-unknown-linux-gnu/stage1/lib/libLLVM-17-rust-1.78.0-nightly.so
#15 0x00007dc16de332c0 in llvm::MachineFunctionPass::runOnFunction(llvm::Function&) ()
   from /home/ben/rust-master/build/x86_64-unknown-linux-gnu/stage1/lib/libLLVM-17-rust-1.78.0-nightly.so
#16 0x00007dc16e24a4be in llvm::FPPassManager::runOnFunction(llvm::Function&) ()
   from /home/ben/rust-master/build/x86_64-unknown-linux-gnu/stage1/lib/libLLVM-17-rust-1.78.0-nightly.so
#17 0x00007dc16e2493b2 in llvm::FPPassManager::runOnModule(llvm::Module&) ()
   from /home/ben/rust-master/build/x86_64-unknown-linux-gnu/stage1/lib/libLLVM-17-rust-1.78.0-nightly.so
#18 0x00007dc16e4f957a in llvm::legacy::PassManagerImpl::run(llvm::Module&) ()
   from /home/ben/rust-master/build/x86_64-unknown-linux-gnu/stage1/lib/libLLVM-17-rust-1.78.0-nightly.so
#19 0x00007dc171362893 in LLVMRustWriteOutputFile ()
   from /home/ben/rust-master/build/x86_64-unknown-linux-gnu/stage1/lib/librustc_driver-0bac2e639c27cdd1.so

@saethlin saethlin changed the title SIGTRAP using 1.76.0 on Apple M1 Pro LLVM Assertion in autovectorization when compiling with release + overflow-checks since 1.73 Feb 8, 2024
@DianQK
Copy link
Member

DianQK commented Feb 9, 2024

A reduced case:

target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
target triple = "aarch64-unknown-linux-gnu"

define void @foo(ptr %0, <16 x i1> %1) {
bb1.i:
  %.bc = bitcast <16 x i1> %1 to <2 x i8>
  %.extract100 = extractelement <2 x i8> %.bc, i64 0
  %_47 = icmp eq i8 %.extract100, 0
  br i1 %_47, label %bb20, label %bb23

bb20:                                             ; preds = %bb1.i
  store <16 x i8> zeroinitializer, ptr %0, align 1
  br label %bb23

bb23:                                             ; preds = %bb20, %bb1.i
  ret void
}

https://llvm.godbolt.org/z/narrKadhK

Upstream issue: llvm/llvm-project#81216

(I'm on vacation, and I'm not familiar with it. So I won't be assigning it to myself for a while. :) )

@apiraino
Copy link
Contributor

apiraino commented Feb 9, 2024

WG-prioritization assigning priority (Zulip discussion).

@rustbot label -I-prioritize +P-high

@rustbot rustbot added the P-high High priority label Feb 9, 2024
@nikic nikic added the llvm-fixed-upstream Issue expected to be fixed by the next major LLVM upgrade, or backported fixes label Feb 12, 2024
@nikic nikic self-assigned this Feb 14, 2024
@nikic
Copy link
Contributor

nikic commented Feb 16, 2024

Should be fixed in beta & nightly.

@nikic nikic closed this as completed Feb 16, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. C-bug Category: This is a bug. I-crash Issue: The compiler crashes (SIGSEGV, SIGABRT, etc). Use I-ICE instead when the compiler panics. llvm-fixed-upstream Issue expected to be fixed by the next major LLVM upgrade, or backported fixes P-high High priority regression-from-stable-to-stable Performance or correctness regression from one stable version to another. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests

6 participants