[PATCH] D149699: [InstCombine] Improve bswap optimization

Nathan Chancellor via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun May 7 17:55:09 PDT 2023


nathanchance added a comment.

This patch causes an assertion failure when building the Linux kernel for PowerPC. A reduced LLVM IR reproducer (and the C reproducer it was derived from):

  target datalayout = "e-m:e-Fn32-i64:64-n32:64-S128-v256:256:256-v512:512:512"
  target triple = "powerpc64le-unknown-linux-gnu"
  
  @_end = external global [0 x i8]
  
  define void @__attribute__kexec_setup(ptr %kernel_end) {
  entry:
    %0 = call i64 @llvm.bswap.i64(i64 and (i64 ptrtoint (ptr @_end to i64), i64 4095))
    store i64 %0, ptr %kernel_end, align 8
    ret void
  }
  
  ; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
  declare i64 @llvm.bswap.i64(i64) #0
  
  attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }



  extern char _end[];
  long kernel_end;
  void __attribute__kexec_setup() {
    kernel_end = __builtin_bswap64(({ (long)_end & 4095; }));
  }



  $ opt -O3 -disable-output reduced.ll
  opt: /mnt/nvme/tmp/cvise.COqG3u2BwX/src/llvm/include/llvm/Support/Casting.h:578: decltype(auto) llvm::cast(From *) [To = llvm::BinaryOperator, From = llvm::Value]: Assertion `isa<To>(Val) && "cast<Ty>() argument of incompatible type!"' failed.
  PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
  Stack dump:
  0.	Program arguments: opt -O3 -disable-output reduced.ll
   #0 0x00005628ee047568 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/mnt/nvme/tmp/cvise.COqG3u2BwX/install/llvm-bad/bin/opt+0x4b8b568)
   #1 0x00005628ee0452ee llvm::sys::RunSignalHandlers() (/mnt/nvme/tmp/cvise.COqG3u2BwX/install/llvm-bad/bin/opt+0x4b892ee)
   #2 0x00005628ee047d28 SignalHandler(int) Signals.cpp:0:0
   #3 0x00007fd4ef6efab0 (/usr/lib/libc.so.6+0x39ab0)
   #4 0x00007fd4ef73f26c (/usr/lib/libc.so.6+0x8926c)
   #5 0x00007fd4ef6efa08 raise (/usr/lib/libc.so.6+0x39a08)
   #6 0x00007fd4ef6d8538 abort (/usr/lib/libc.so.6+0x22538)
   #7 0x00007fd4ef6d845c (/usr/lib/libc.so.6+0x2245c)
   #8 0x00007fd4ef6e83d6 (/usr/lib/libc.so.6+0x323d6)
   #9 0x00005628edc4a2c2 llvm::Instruction* foldBitOrderCrossLogicOp<9u>(llvm::Value*, llvm::IRBuilder<llvm::TargetFolder, llvm::IRBuilderCallbackInserter>&) InstCombineCalls.cpp:0:0
  #10 0x00005628edc46269 llvm::InstCombinerImpl::visitCallInst(llvm::CallInst&) InstCombineCalls.cpp:0:0
  #11 0x00005628edbec59f llvm::InstCombinerImpl::run() InstructionCombining.cpp:0:0
  #12 0x00005628edbeee45 combineInstructionsOverFunction(llvm::Function&, llvm::InstructionWorklist&, llvm::AAResults*, llvm::AssumptionCache&, llvm::TargetLibraryInfo&, llvm::TargetTransformInfo&, llvm::DominatorTree&, llvm::OptimizationRemarkEmitter&, llvm::BlockFrequencyInfo*, llvm::ProfileSummaryInfo*, unsigned int, llvm::LoopInfo*) InstructionCombining.cpp:0:0
  #13 0x00005628edbee605 llvm::InstCombinePass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/mnt/nvme/tmp/cvise.COqG3u2BwX/install/llvm-bad/bin/opt+0x4732605)
  #14 0x00005628ee24841d llvm::detail::PassModel<llvm::Function, llvm::InstCombinePass, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) PassBuilder.cpp:0:0
  #15 0x00005628edb00004 llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/mnt/nvme/tmp/cvise.COqG3u2BwX/install/llvm-bad/bin/opt+0x4644004)
  #16 0x00005628ec6ba78d llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) BPFTargetMachine.cpp:0:0
  #17 0x00005628edb04273 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/mnt/nvme/tmp/cvise.COqG3u2BwX/install/llvm-bad/bin/opt+0x4648273)
  #18 0x00005628ec6ba52d llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) BPFTargetMachine.cpp:0:0
  #19 0x00005628edaff1f4 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/mnt/nvme/tmp/cvise.COqG3u2BwX/install/llvm-bad/bin/opt+0x46431f4)
  #20 0x00005628ec1a08eb llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::StringRef, llvm::ArrayRef<llvm::PassPlugin>, llvm::opt_tool::OutputKind, llvm::opt_tool::VerifierKind, bool, bool, bool, bool, bool, bool) (/mnt/nvme/tmp/cvise.COqG3u2BwX/install/llvm-bad/bin/opt+0x2ce48eb)
  #21 0x00005628ec1b0111 main (/mnt/nvme/tmp/cvise.COqG3u2BwX/install/llvm-bad/bin/opt+0x2cf4111)
  #22 0x00007fd4ef6d9850 (/usr/lib/libc.so.6+0x23850)
  #23 0x00007fd4ef6d990a __libc_start_main (/usr/lib/libc.so.6+0x2390a)
  #24 0x00005628ec19a265 _start (/mnt/nvme/tmp/cvise.COqG3u2BwX/install/llvm-bad/bin/opt+0x2cde265)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D149699/new/

https://reviews.llvm.org/D149699



More information about the llvm-commits mailing list