[llvm] [SimplifyCFG] Fold the contiguous wrapping cases into ICmp. (PR #161000)

Nathan Chancellor via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 8 12:33:47 PDT 2025


nathanchance wrote:

I am seeing a "Broken module" error when building the Linux kernel with full LTO (it shows up for AArch64  / `ARCH=arm64` and RISCV / `ARCH=riscv`) after this change (original report: https://github.com/ClangBuiltLinux/linux/issues/2126)

```
PHINode should have one entry for each predecessor of its parent basic block!
  %97 = phi i32 [ %94, %91 ], [ -38, undef ], [ -38, %78 ]
LLVM ERROR: Broken module found, compilation aborted!
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace and instructions to reproduce the bug.
Stack dump:
0.	Program arguments: ld.lld -EL -maarch64elf -z norelro -mllvm -import-instr-limit=5 -z noexecstack -r -o drivers/gpu/drm/nouveau/nouveau.o @drivers/gpu/drm/nouveau/nouveau.mod
1.	Running pass "verify" on module "ld-temp.o"
 #0 0x0000762378bfe41a llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/lib/x86_64-linux-gnu/libLLVM.so.22.0+0x4a3241a)
 #1 0x0000762378bfbc27 llvm::sys::RunSignalHandlers() (/lib/x86_64-linux-gnu/libLLVM.so.22.0+0x4a2fc27)
 #2 0x0000762378bff184 (/lib/x86_64-linux-gnu/libLLVM.so.22.0+0x4a33184)
 #3 0x0000762373c90df0 (/lib/x86_64-linux-gnu/libc.so.6+0x3fdf0)
 #4 0x0000762373ce595c (/lib/x86_64-linux-gnu/libc.so.6+0x9495c)
 #5 0x0000762373c90cc2 raise (/lib/x86_64-linux-gnu/libc.so.6+0x3fcc2)
 #6 0x0000762373c794ac abort (/lib/x86_64-linux-gnu/libc.so.6+0x284ac)
 #7 0x0000762378b3ed1b llvm::report_fatal_error(llvm::Twine const&, bool) (/lib/x86_64-linux-gnu/libLLVM.so.22.0+0x4972d1b)
 #8 0x0000762378b3eb6a (/lib/x86_64-linux-gnu/libLLVM.so.22.0+0x4972b6a)
 #9 0x0000762378ddb941 (/lib/x86_64-linux-gnu/libLLVM.so.22.0+0x4c0f941)
#10 0x0000762378da70e7 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/lib/x86_64-linux-gnu/libLLVM.so.22.0+0x4bdb0e7)
#11 0x000076237a61cbb7 llvm::lto::opt(llvm::lto::Config const&, llvm::TargetMachine*, unsigned int, llvm::Module&, bool, llvm::ModuleSummaryIndex*, llvm::ModuleSummaryIndex const*, std::vector<unsigned char, std::allocator<unsigned char>> const&) (/lib/x86_64-linux-gnu/libLLVM.so.22.0+0x6450bb7)
#12 0x000076237a61d352 llvm::lto::backend(llvm::lto::Config const&, std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>, unsigned int, llvm::Module&, llvm::ModuleSummaryIndex&) (/lib/x86_64-linux-gnu/libLLVM.so.22.0+0x6451352)
#13 0x000076237a607acd llvm::lto::LTO::runRegularLTO(std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>) (/lib/x86_64-linux-gnu/libLLVM.so.22.0+0x643bacd)
#14 0x000076237a6070a8 llvm::lto::LTO::run(std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>, llvm::FileCache) (/lib/x86_64-linux-gnu/libLLVM.so.22.0+0x643b0a8)
#15 0x00006426634c129d lld::elf::BitcodeCompiler::compile() (/usr/lib/llvm-22/bin/lld+0x34029d)
#16 0x000064266341809c void lld::elf::LinkerDriver::compileBitcodeFiles<llvm::object::ELFType<(llvm::endianness)1, true>>(bool) (/usr/lib/llvm-22/bin/lld+0x29709c)
#17 0x00006426633fd468 void lld::elf::LinkerDriver::link<llvm::object::ELFType<(llvm::endianness)1, true>>(llvm::opt::InputArgList&) (/usr/lib/llvm-22/bin/lld+0x27c468)
#18 0x00006426633e5457 lld::elf::LinkerDriver::linkerMain(llvm::ArrayRef<char const*>) (/usr/lib/llvm-22/bin/lld+0x264457)
#19 0x00006426633e1041 lld::elf::link(llvm::ArrayRef<char const*>, llvm::raw_ostream&, llvm::raw_ostream&, bool, bool) (/usr/lib/llvm-22/bin/lld+0x260041)
#20 0x00006426633040ce lld::unsafeLldMain(llvm::ArrayRef<char const*>, llvm::raw_ostream&, llvm::raw_ostream&, llvm::ArrayRef<lld::DriverDef>, bool) (/usr/lib/llvm-22/bin/lld+0x1830ce)
#21 0x00006426633032f2 lld_main(int, char**, llvm::ToolContext const&) (/usr/lib/llvm-22/bin/lld+0x1822f2)
#22 0x00006426633039aa main (/usr/lib/llvm-22/bin/lld+0x1829aa)
#23 0x0000762373c7aca8 (/lib/x86_64-linux-gnu/libc.so.6+0x29ca8)
#24 0x0000762373c7ad65 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29d65)
#25 0x0000642663302f31 _start (/usr/lib/llvm-22/bin/lld+0x181f31)
```

I was able to find two `.o` files within this module that reproduced this issue when linked together and reduced each of them with `cvise`.

```
$ cat gr.i
struct nvkm_subdev {
  int *device;
};
enum nvkm_memory_target {
  NVKM_MEM_TARGET_INST
} nvkm_memory_new(int *, enum nvkm_memory_target, long, int, _Bool, int **);
struct {
  struct nvkm_subdev base;
  struct {
    _Bool init;
  } ctxbuf[];
} *r535_gr_promote_ctx_gr;
typedef struct {
  char bNonmapped;
} NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY;
typedef struct {
  NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY promoteEntry[];
} NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS;
int *r535_gr_promote_ctx_pmem_0;
NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS r535_gr_promote_ctx_ctrl;
int r535_gr_promote_ctx_ctrl_0, r535_gr_promote_ctx_gr_1_0_0;
char r535_gr_promote_ctx_gr_1_0_1;
void r535_gr_promote_ctx() {
  struct nvkm_subdev subdev = r535_gr_promote_ctx_gr->base;
  int *device = subdev.device;
  for (int i = 0;;) {
    NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY *entry =
        &r535_gr_promote_ctx_ctrl.promoteEntry[r535_gr_promote_ctx_ctrl_0];
    nvkm_memory_new(device, r535_gr_promote_ctx_gr->ctxbuf[i].init,
                    r535_gr_promote_ctx_gr_1_0_0, r535_gr_promote_ctx_gr_1_0_1,
                    r535_gr_promote_ctx_gr, &r535_gr_promote_ctx_pmem_0);
    entry->bNonmapped = 1;
  }
}

$ cat memory.i
enum { false, true };
enum nvkm_memory_target {
  NVKM_MEM_TARGET_INST_SR_LOST,
  NVKM_MEM_TARGET_INST
} nvkm_instobj_new(int *, _Bool, int **);
int nvkm_memory_new_pmemory, nvkm_memory_new_ret, nvkm_memory_new_imem;
int *nvkm_memory_new_memory;
int nvkm_memory_new(int *device, enum nvkm_memory_target target) {
  _Bool preserve = true;
  switch (target) {
  case NVKM_MEM_TARGET_INST_SR_LOST:
    preserve = false;
  case NVKM_MEM_TARGET_INST:
    break;
  default:
    return 8;
  }
  nvkm_instobj_new(&nvkm_memory_new_imem, preserve, &nvkm_memory_new_memory);
  if (nvkm_memory_new_ret)
    nvkm_memory_new_pmemory = *nvkm_memory_new_memory;
  return 0;
}

$ clang --target=aarch64-linux -O2 -flto -Wall -Wextra -c -o gr.{o,i}

$ clang --target=aarch64-linux -O2 -flto -Wall -Wextra -c -o memory.{o,i}
memory.i:8:26: warning: unused parameter 'device' [-Wunused-parameter]
    8 | int nvkm_memory_new(int *device, enum nvkm_memory_target target) {
      |                          ^
1 warning generated.

$ ld.lld -EL -maarch64elf -z norelro -z noexecstack -r -o /dev/null {gr,memory}.o
PHINode should have one entry for each predecessor of its parent basic block!
  %20 = phi i32 [ %4, %3 ], [ %15, %3 ], [ %15, %16 ]
LLVM ERROR: Broken module found, compilation aborted!
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace and instructions to reproduce the bug.
Stack dump:
0.      Program arguments: ld.lld -EL -maarch64elf -z norelro -z noexecstack -r -o /dev/null gr.o memory.o
1.      Running pass "verify" on module "ld-temp.o"
 #0 0x000055dd2972c9d8 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (ld.lld+0x355f9d8)
 #1 0x000055dd29729fc5 llvm::sys::RunSignalHandlers() (ld.lld+0x355cfc5)
 #2 0x000055dd2972d741 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #3 0x00007f3f2363e540 (/usr/lib/libc.so.6+0x3e540)
 #4 0x00007f3f2369894c (/usr/lib/libc.so.6+0x9894c)
 #5 0x00007f3f2363e410 raise (/usr/lib/libc.so.6+0x3e410)
 #6 0x00007f3f2362557a abort (/usr/lib/libc.so.6+0x2557a)
 #7 0x000055dd2969b385 llvm::report_fatal_error(llvm::Twine const&, bool) (ld.lld+0x34ce385)
 #8 0x000055dd2969b1c6 (ld.lld+0x34ce1c6)
 #9 0x000055dd2d34baa6 (ld.lld+0x717eaa6)
#10 0x000055dd2d314ab7 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (ld.lld+0x7147ab7)
#11 0x000055dd2af45fae llvm::lto::opt(llvm::lto::Config const&, llvm::TargetMachine*, unsigned int, llvm::Module&, bool, llvm::ModuleSummaryIndex*, llvm::ModuleSummaryIndex const*, std::vector<unsigned char, std::allocator<unsigned char>> const&) (ld.lld+0x4d78fae)
#12 0x000055dd2af46988 llvm::lto::backend(llvm::lto::Config const&, std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>, unsigned int, llvm::Module&, llvm::ModuleSummaryIndex&) (ld.lld+0x4d79988)
#13 0x000055dd2af2c3d1 llvm::lto::LTO::runRegularLTO(std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>) (ld.lld+0x4d5f3d1)
#14 0x000055dd2af2b5cc llvm::lto::LTO::run(std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>, llvm::FileCache) (ld.lld+0x4d5e5cc)
#15 0x000055dd2995d217 lld::elf::BitcodeCompiler::compile() (ld.lld+0x3790217)
#16 0x000055dd2989029f void lld::elf::LinkerDriver::compileBitcodeFiles<llvm::object::ELFType<(llvm::endianness)1, true>>(bool) (ld.lld+0x36c329f)
#17 0x000055dd2986f050 void lld::elf::LinkerDriver::link<llvm::object::ELFType<(llvm::endianness)1, true>>(llvm::opt::InputArgList&) (ld.lld+0x36a2050)
#18 0x000055dd2985369d lld::elf::LinkerDriver::linkerMain(llvm::ArrayRef<char const*>) (ld.lld+0x368669d)
#19 0x000055dd2984fbca lld::elf::link(llvm::ArrayRef<char const*>, llvm::raw_ostream&, llvm::raw_ostream&, bool, bool) (ld.lld+0x3682bca)
#20 0x000055dd29731752 lld::unsafeLldMain(llvm::ArrayRef<char const*>, llvm::raw_ostream&, llvm::raw_ostream&, llvm::ArrayRef<lld::DriverDef>, bool) (ld.lld+0x3564752)
#21 0x000055dd296791a5 lld_main(int, char**, llvm::ToolContext const&) (ld.lld+0x34ac1a5)
#22 0x000055dd296797e7 main (ld.lld+0x34ac7e7)
#23 0x00007f3f23627675 (/usr/lib/libc.so.6+0x27675)
#24 0x00007f3f23627729 __libc_start_main (/usr/lib/libc.so.6+0x27729)
#25 0x000055dd29678da5 _start (ld.lld+0x34abda5)
```

If there is any other information I can provide, I am more than happy to do so.

https://github.com/llvm/llvm-project/pull/161000


More information about the llvm-commits mailing list