nathanchance wrote: I am seeing a backend error when building the Linux kernel for PowerPC after this change. `cvise` spits out the following C reproducer:
```c typedef unsigned __u8; typedef unsigned __u32; typedef long __u64; typedef __u8 u8; typedef __u32 u32; typedef __u64 u64; enum { true } typedef __kernel_size_t; typedef _Bool bool; typedef __kernel_size_t size_t; typedef u32 uint32_t; struct { struct _ddebug *descs; } __drm_dev_dbg(struct _ddebug *, ...); struct ttm_resource { uint32_t mem_type; struct xe_exec_queue *q; }; struct xe_tile { struct xe_device *xe; struct xe_gt *primary_gt; }; struct xe_device { struct { u8 is_dgfx; } info; }; struct xe_gt { struct xe_tile *tile; }; struct xe_bb { u32 cs; u32 len; } *xe_bb_new(struct xe_gt *, u32, bool); struct xe_sched_job *xe_bb_create_migration_job(struct xe_exec_queue *, struct xe_bb *, u64, u32); struct xe_bo { size_t size; }; struct xe_res_cursor { } xe_sched_job_add_migrate_flush(struct xe_sched_job *, u32); struct xe_migrate { struct xe_exec_queue *q; struct xe_tile *tile; }; u64 xe_migrate_res_sizes(struct xe_migrate *, struct xe_res_cursor *); u32 pte_update_size(struct xe_migrate *, u32, struct ttm_resource *, struct xe_res_cursor *, u64 *, u64 *, u32 *, u32, u32, u32); u32 xe_migrate_ccs_copy(struct xe_migrate *, struct xe_bb *, u64, bool, u64, bool, u32, u64, bool); struct dma_fence *xe_migrate_copy(struct xe_migrate *m, struct xe_bo *src_bo, struct xe_bo *dst_bo, struct ttm_resource *src, struct ttm_resource *dst) { struct xe_gt *gt = m->tile->primary_gt; struct xe_device *xe = _Generic(gt, struct xe_gt *: _Generic(gt, struct xe_gt *: gt->tile)->xe); struct dma_fence *fence = 0; u64 size = src_bo->size; struct xe_res_cursor src_it, dst_it, ccs_it; u64 src_L0_ofs, dst_L0_ofs; u32 src_L0_pt, dst_L0_pt; u64 src_L0, dst_L0; int pass = 0; int err; bool src_is_pltt = src; bool dst_is_pltt = dst; bool src_is_vram = src->mem_type; bool dst_is_vram = dst->mem_type; bool type_device = src_bo; bool needs_ccs_emit = xe; bool copy_ccs = dst_bo; bool copy_system_ccs = dst_is_vram; bool use_comp_pat = type_device; while (size) { u32 batch_size = 2; struct xe_sched_job *job; struct xe_bb *bb; u32 flush_flags; u32 update_idx; u64 ccs_ofs, ccs_size; u32 ccs_pt; u32 pte_flags; bool usm = xe; u32 avail_pts = dst_L0 = xe_migrate_res_sizes(m, &dst_it); __drm_dev_dbg(0, pass); pte_flags = use_comp_pat; pte_update_size(m, pte_flags, src, &src_it, &src_L0, &src_L0_ofs, &src_L0_pt, 0, 0, avail_pts); pte_update_size(m, pte_flags, dst, &dst_it, &src_L0, &dst_L0_ofs, &dst_L0_pt, 0, avail_pts, avail_pts); if (copy_system_ccs) pte_update_size(m, 0, 0, &ccs_it, &ccs_size, &ccs_ofs, &ccs_pt, 0, avail_pts, avail_pts); bb = xe_bb_new(gt, batch_size, usm); if (bb) goto err_sync; update_idx = bb->len; if (needs_ccs_emit) xe_migrate_ccs_copy( m, bb, src_L0_ofs, xe->info.is_dgfx ? src_is_vram : src_is_pltt dst_L0_ofs, xe->info.is_dgfx ? dst_is_vram : dst_is_pltt, src_L0, ccs_ofs, copy_ccs); xe_bb_create_migration_job(m->q, bb, usm, update_idx); goto err; xe_sched_job_add_migrate_flush(job, flush_flags); if (err) err: err_sync:; } return fence; } ``` ``` $ clang --target=powerpc64 -O2 -c -o /dev/null xe_migrate.i fatal error: error in backend: Found 2 machine code errors. PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script. Stack dump: 0. Program arguments: clang --target=powerpc64 -O2 -c -o /dev/null xe_migrate.i 1. <eof> parser at end of file 2. Code generation 3. Running pass 'Function Pass Manager' on module 'xe_migrate.i'. 4. Running pass 'PowerPC MI Peephole Optimization' on function '@xe_migrate_copy' #0 0x0000560579e59068 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (clang-21+0x373a068) #1 0x0000560579e56ba5 llvm::sys::RunSignalHandlers() (clang-21+0x3737ba5) #2 0x0000560579dd8067 (anonymous namespace)::CrashRecoveryContextImpl::HandleCrash(int, unsigned long) CrashRecoveryContext.cpp:0:0 #3 0x0000560579dd7fff llvm::CrashRecoveryContext::HandleExit(int) (clang-21+0x36b8fff) #4 0x0000560579e53647 llvm::sys::Process::Exit(int, bool) (clang-21+0x3734647) #5 0x0000560578a2f796 (clang-21+0x2310796) #6 0x0000560579dde519 llvm::report_fatal_error(llvm::Twine const&, bool) (clang-21+0x36bf519) #7 0x00005605794c32be (clang-21+0x2da42be) #8 0x00005605794c3926 llvm::MachineFunction::verify(llvm::Pass*, char const*, llvm::raw_ostream*, bool) const (clang-21+0x2da4926) #9 0x0000560578b69108 (anonymous namespace)::PPCMIPeephole::runOnMachineFunction(llvm::MachineFunction&) PPCMIPeephole.cpp:0:0 #10 0x00005605793c2833 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (clang-21+0x2ca3833) #11 0x000056057993c4f5 llvm::FPPassManager::runOnFunction(llvm::Function&) (clang-21+0x321d4f5) #12 0x0000560579944522 llvm::FPPassManager::runOnModule(llvm::Module&) (clang-21+0x3225522) #13 0x000056057993cebb llvm::legacy::PassManagerImpl::run(llvm::Module&) (clang-21+0x321debb) #14 0x000056057a58ff3f clang::emitBackendOutput(clang::CompilerInstance&, clang::CodeGenOptions&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>, clang::BackendConsumer*) (clang-21+0x3e70f3f) #15 0x000056057a5a4d63 clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (clang-21+0x3e85d63) #16 0x000056057bbabb49 clang::ParseAST(clang::Sema&, bool, bool) (clang-21+0x548cb49) #17 0x000056057ab14c06 clang::FrontendAction::Execute() (clang-21+0x43f5c06) #18 0x000056057aa83b4d clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (clang-21+0x4364b4d) #19 0x000056057abe28dc clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (clang-21+0x44c38dc) #20 0x0000560578a2f042 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (clang-21+0x2310042) #21 0x0000560578a2b09f ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0 #22 0x000056057a8e9989 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::$_0>(long) Job.cpp:0:0 #23 0x0000560579dd7f9e llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (clang-21+0x36b8f9e) #24 0x000056057a8e91c3 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (clang-21+0x41ca1c3) #25 0x000056057a8ab2bc clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (clang-21+0x418c2bc) #26 0x000056057a8ab4d7 clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (clang-21+0x418c4d7) #27 0x000056057a8c7278 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (clang-21+0x41a8278) #28 0x0000560578a2a943 clang_main(int, char**, llvm::ToolContext const&) (clang-21+0x230b943) #29 0x0000560578a3a907 main (clang-21+0x231b907) #30 0x00007f8b95a376b5 (/usr/lib/libc.so.6+0x276b5) #31 0x00007f8b95a37769 __libc_start_main (/usr/lib/libc.so.6+0x27769) #32 0x0000560578a28b25 _start (clang-21+0x2309b25) clang: error: clang frontend command failed with exit code 70 (use -v to see invocation) ClangBuiltLinux clang version 21.0.0git (https://github.com/llvm/llvm-project.git bf79d4819edeb54c6cf528db63676110992908a8) ... ``` Here is the optimized IR from the parent change: ```llvm ; ModuleID = 'xe_migrate.i' source_filename = "xe_migrate.i" target datalayout = "E-m:e-Fi64-i64:64-i128:128-n32:64" target triple = "powerpc64" %struct.xe_res_cursor = type {} %struct.anon = type { ptr } ; Function Attrs: nounwind uwtable define dso_local noalias noundef ptr @xe_migrate_copy(ptr noundef %m, ptr noundef readonly captures(none) %src_bo, ptr noundef readnone captures(address_is_null) %dst_bo, ptr noundef %src, ptr noundef %dst) local_unnamed_addr #0 { entry: %src_it = alloca %struct.xe_res_cursor, align 1 %src_L0_ofs = alloca i64, align 8 %dst_L0_ofs = alloca i64, align 8 %src_L0_pt = alloca i32, align 4 %dst_L0_pt = alloca i32, align 4 %src_L0 = alloca i64, align 8 %ccs_ofs = alloca i64, align 8 %ccs_size = alloca i64, align 8 %ccs_pt = alloca i32, align 4 %tmp = alloca %struct.anon, align 8 %tile = getelementptr inbounds nuw i8, ptr %m, i64 8 %0 = load ptr, ptr %tile, align 8, !tbaa !3 %primary_gt = getelementptr inbounds nuw i8, ptr %0, i64 8 %1 = load ptr, ptr %primary_gt, align 8, !tbaa !10 %2 = load ptr, ptr %1, align 8, !tbaa !14 %3 = load ptr, ptr %2, align 8, !tbaa !16 %4 = load i32, ptr %src_bo, align 4, !tbaa !17 call void @llvm.lifetime.start.p0(i64 0, ptr nonnull %src_it) #3 call void @llvm.lifetime.start.p0(i64 0, ptr nonnull %src_it) #3 call void @llvm.lifetime.start.p0(i64 0, ptr nonnull %src_it) #3 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %src_L0_ofs) #3 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %dst_L0_ofs) #3 call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %src_L0_pt) #3 call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %dst_L0_pt) #3 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %src_L0) #3 %tobool = icmp ne ptr %src, null %tobool4 = icmp ne ptr %dst, null %5 = load i32, ptr %src, align 8, !tbaa !20 %tobool6 = icmp ne i32 %5, 0 %6 = load i32, ptr %dst, align 8, !tbaa !20 %tobool9 = icmp ne i32 %6, 0 %tobool13 = icmp ne ptr %3, null %tobool15 = icmp ne ptr %dst_bo, null %tobool20.not = icmp eq i32 %4, 0 br i1 %tobool20.not, label %while.end, label %while.body.lr.ph while.body.lr.ph: ; preds = %entry %conv60 = zext i1 %tobool13 to i64 br label %while.body while.body: ; preds = %if.end65, %while.body.lr.ph call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %ccs_ofs) #3 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %ccs_size) #3 call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %ccs_pt) #3 %call = call i64 @xe_migrate_res_sizes(ptr noundef %m, ptr noundef nonnull %src_it) #3 %conv23 = trunc i64 %call to i32 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %tmp) #3 call void (ptr, ptr, ...) @__drm_dev_dbg(ptr dead_on_unwind nonnull writable sret(%struct.anon) align 8 %tmp, ptr noundef null, i32 noundef signext 0) #3 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %tmp) #3 %call26 = call zeroext i32 @pte_update_size(ptr noundef %m, i32 noundef zeroext 1, ptr noundef nonnull %src, ptr noundef nonnull %src_it, ptr noundef nonnull %src_L0, ptr noundef nonnull %src_L0_ofs, ptr noundef nonnull %src_L0_pt, i32 noundef zeroext 0, i32 noundef zeroext 0, i32 noundef zeroext %conv23) #3 %call27 = call zeroext i32 @pte_update_size(ptr noundef %m, i32 noundef zeroext 1, ptr noundef nonnull %dst, ptr noundef nonnull %src_it, ptr noundef nonnull %src_L0, ptr noundef nonnull %dst_L0_ofs, ptr noundef nonnull %dst_L0_pt, i32 noundef zeroext 0, i32 noundef zeroext %conv23, i32 noundef zeroext %conv23) #3 br i1 %tobool9, label %if.then, label %if.end if.then: ; preds = %while.body %call29 = call zeroext i32 @pte_update_size(ptr noundef %m, i32 noundef zeroext 0, ptr noundef null, ptr noundef nonnull %src_it, ptr noundef nonnull %ccs_size, ptr noundef nonnull %ccs_ofs, ptr noundef nonnull %ccs_pt, i32 noundef zeroext 0, i32 noundef zeroext %conv23, i32 noundef zeroext %conv23) #3 br label %if.end if.end: ; preds = %if.then, %while.body %call31 = call ptr @xe_bb_new(ptr noundef nonnull %1, i32 noundef zeroext 2, i1 noundef zeroext %tobool13) #3 %tobool32.not = icmp eq ptr %call31, null br i1 %tobool32.not, label %if.end34, label %if.end65 if.end34: ; preds = %if.end %7 = load i32, ptr inttoptr (i64 4 to ptr), align 4, !tbaa !22 br i1 %tobool13, label %if.then36, label %if.end58 if.then36: ; preds = %if.end34 %8 = load i64, ptr %src_L0_ofs, align 8, !tbaa !24 %9 = load i32, ptr %3, align 4, !tbaa !26 %tobool37.not = icmp eq i32 %9, 0 %cond.v = select i1 %tobool37.not, i1 %tobool, i1 %tobool6 %10 = load i64, ptr %dst_L0_ofs, align 8, !tbaa !24 %cond53.v = select i1 %tobool37.not, i1 %tobool4, i1 %tobool9 %11 = load i64, ptr %src_L0, align 8, !tbaa !24 %conv55 = trunc i64 %11 to i32 %12 = load i64, ptr %ccs_ofs, align 8, !tbaa !24 %call57 = call zeroext i32 @xe_migrate_ccs_copy(ptr noundef %m, ptr noundef null, i64 noundef %8, i1 noundef zeroext %cond.v, i64 noundef %10, i1 noundef zeroext %cond53.v, i32 noundef zeroext %conv55, i64 noundef %12, i1 noundef zeroext %tobool15) #3 br label %if.end58 if.end58: ; preds = %if.then36, %if.end34 %13 = load ptr, ptr %m, align 8, !tbaa !29 %call61 = call ptr @xe_bb_create_migration_job(ptr noundef %13, ptr noundef null, i64 noundef %conv60, i32 noundef zeroext %7) #3 br label %if.end65 if.end65: ; preds = %if.end58, %if.end call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %ccs_pt) #3 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %ccs_size) #3 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %ccs_ofs) #3 br label %while.body while.end: ; preds = %entry call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %src_L0) #3 call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %dst_L0_pt) #3 call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %src_L0_pt) #3 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %dst_L0_ofs) #3 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %src_L0_ofs) #3 call void @llvm.lifetime.end.p0(i64 0, ptr nonnull %src_it) #3 call void @llvm.lifetime.end.p0(i64 0, ptr nonnull %src_it) #3 call void @llvm.lifetime.end.p0(i64 0, ptr nonnull %src_it) #3 ret ptr null } ; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) declare void @llvm.lifetime.start.p0(i64 immarg, ptr captures(none)) #1 declare i64 @xe_migrate_res_sizes(ptr noundef, ptr noundef) local_unnamed_addr #2 declare void @__drm_dev_dbg(ptr dead_on_unwind writable sret(%struct.anon) align 8, ptr noundef, ...) local_unnamed_addr #2 ; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) declare void @llvm.lifetime.end.p0(i64 immarg, ptr captures(none)) #1 declare zeroext i32 @pte_update_size(ptr noundef, i32 noundef zeroext, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef zeroext, i32 noundef zeroext, i32 noundef zeroext) local_unnamed_addr #2 declare ptr @xe_bb_new(ptr noundef, i32 noundef zeroext, i1 noundef zeroext) local_unnamed_addr #2 declare zeroext i32 @xe_migrate_ccs_copy(ptr noundef, ptr noundef, i64 noundef, i1 noundef zeroext, i64 noundef, i1 noundef zeroext, i32 noundef zeroext, i64 noundef, i1 noundef zeroext) local_unnamed_addr #2 declare ptr @xe_bb_create_migration_job(ptr noundef, ptr noundef, i64 noundef, i32 noundef zeroext) local_unnamed_addr #2 attributes #0 = { nounwind uwtable "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="ppc64" "target-features"="+altivec,-bpermd,-crbits,-crypto,-direct-move,-extdiv,-htm,-isa-v206-instructions,-isa-v207-instructions,-isa-v30-instructions,-power8-vector,-power9-vector,-privileged,-quadword-atomics,-rop-protect,-spe,-vsx" } attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="ppc64" "target-features"="+altivec,-bpermd,-crbits,-crypto,-direct-move,-extdiv,-htm,-isa-v206-instructions,-isa-v207-instructions,-isa-v30-instructions,-power8-vector,-power9-vector,-privileged,-quadword-atomics,-rop-protect,-spe,-vsx" } attributes #3 = { nounwind } !llvm.module.flags = !{!0, !1} !llvm.ident = !{!2} !0 = !{i32 1, !"wchar_size", i32 4} !1 = !{i32 7, !"uwtable", i32 2} !2 = !{!"ClangBuiltLinux clang version 21.0.0git (https://github.com/llvm/llvm-project.git 5645d6710904107d66a45f1c3ee0ee25924ff08a)"} !3 = !{!4, !9, i64 8} !4 = !{!"xe_migrate", !5, i64 0, !9, i64 8} !5 = !{!"p1 _ZTS13xe_exec_queue", !6, i64 0} !6 = !{!"any pointer", !7, i64 0} !7 = !{!"omnipotent char", !8, i64 0} !8 = !{!"Simple C/C++ TBAA"} !9 = !{!"p1 _ZTS7xe_tile", !6, i64 0} !10 = !{!11, !13, i64 8} !11 = !{!"xe_tile", !12, i64 0, !13, i64 8} !12 = !{!"p1 _ZTS9xe_device", !6, i64 0} !13 = !{!"p1 _ZTS5xe_gt", !6, i64 0} !14 = !{!15, !9, i64 0} !15 = !{!"xe_gt", !9, i64 0} !16 = !{!11, !12, i64 0} !17 = !{!18, !19, i64 0} !18 = !{!"xe_bo", !19, i64 0} !19 = !{!"int", !7, i64 0} !20 = !{!21, !19, i64 0} !21 = !{!"ttm_resource", !19, i64 0, !5, i64 8} !22 = !{!23, !19, i64 4} !23 = !{!"xe_bb", !19, i64 0, !19, i64 4} !24 = !{!25, !25, i64 0} !25 = !{!"long", !7, i64 0} !26 = !{!27, !19, i64 0} !27 = !{!"xe_device", !28, i64 0} !28 = !{!"", !19, i64 0} !29 = !{!4, !5, i64 0} ``` which has no backend errors but the IR produced after this change does ```llvm ; ModuleID = 'xe_migrate.i' source_filename = "xe_migrate.i" target datalayout = "E-m:e-Fi64-i64:64-i128:128-n32:64" target triple = "powerpc64" %struct.xe_res_cursor = type {} %struct.anon = type { ptr } ; Function Attrs: nounwind uwtable define dso_local noalias noundef ptr @xe_migrate_copy(ptr noundef %m, ptr noundef readonly captures(none) %src_bo, ptr noundef readnone captures(address_is_null) %dst_bo, ptr noundef %src, ptr noundef %dst) local_unnamed_addr #0 { entry: %src_it = alloca %struct.xe_res_cursor, align 1 %src_L0_ofs = alloca i64, align 8 %dst_L0_ofs = alloca i64, align 8 %src_L0_pt = alloca i32, align 4 %dst_L0_pt = alloca i32, align 4 %src_L0 = alloca i64, align 8 %ccs_ofs = alloca i64, align 8 %ccs_size = alloca i64, align 8 %ccs_pt = alloca i32, align 4 %tmp = alloca %struct.anon, align 8 %tile = getelementptr inbounds nuw i8, ptr %m, i64 8 %0 = load ptr, ptr %tile, align 8, !tbaa !3 %primary_gt = getelementptr inbounds nuw i8, ptr %0, i64 8 %1 = load ptr, ptr %primary_gt, align 8, !tbaa !10 %2 = load ptr, ptr %1, align 8, !tbaa !14 %3 = load ptr, ptr %2, align 8, !tbaa !16 %4 = load i32, ptr %src_bo, align 4, !tbaa !17 call void @llvm.lifetime.start.p0(i64 0, ptr nonnull %src_it) #3 call void @llvm.lifetime.start.p0(i64 0, ptr nonnull %src_it) #3 call void @llvm.lifetime.start.p0(i64 0, ptr nonnull %src_it) #3 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %src_L0_ofs) #3 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %dst_L0_ofs) #3 call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %src_L0_pt) #3 call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %dst_L0_pt) #3 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %src_L0) #3 %tobool = icmp ne ptr %src, null %tobool4 = icmp ne ptr %dst, null %5 = load i32, ptr %src, align 8, !tbaa !20 %tobool6 = icmp ne i32 %5, 0 %6 = load i32, ptr %dst, align 8, !tbaa !20 %tobool9 = icmp ne i32 %6, 0 %tobool13 = icmp ne ptr %3, null %tobool15 = icmp ne ptr %dst_bo, null %tobool20.not = icmp eq i32 %4, 0 br i1 %tobool20.not, label %while.end, label %while.body.lr.ph while.body.lr.ph: ; preds = %entry %conv60 = zext i1 %tobool13 to i64 br label %while.body while.body: ; preds = %if.end65, %while.body.lr.ph call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %ccs_ofs) #3 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %ccs_size) #3 call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %ccs_pt) #3 %call = call i64 @xe_migrate_res_sizes(ptr noundef %m, ptr noundef nonnull %src_it) #3 %conv23 = trunc i64 %call to i32 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %tmp) #3 call void (ptr, ptr, ...) @__drm_dev_dbg(ptr dead_on_unwind nonnull writable sret(%struct.anon) align 8 %tmp, ptr noundef null, i32 noundef signext 0) #3 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %tmp) #3 %call26 = call zeroext i32 @pte_update_size(ptr noundef %m, i32 noundef zeroext 1, ptr noundef nonnull %src, ptr noundef nonnull %src_it, ptr noundef nonnull %src_L0, ptr noundef nonnull %src_L0_ofs, ptr noundef nonnull %src_L0_pt, i32 noundef zeroext 0, i32 noundef zeroext 0, i32 noundef zeroext %conv23) #3 %call27 = call zeroext i32 @pte_update_size(ptr noundef %m, i32 noundef zeroext 1, ptr noundef nonnull %dst, ptr noundef nonnull %src_it, ptr noundef nonnull %src_L0, ptr noundef nonnull %dst_L0_ofs, ptr noundef nonnull %dst_L0_pt, i32 noundef zeroext 0, i32 noundef zeroext %conv23, i32 noundef zeroext %conv23) #3 br i1 %tobool9, label %if.then, label %if.end if.then: ; preds = %while.body %call29 = call zeroext i32 @pte_update_size(ptr noundef %m, i32 noundef zeroext 0, ptr noundef null, ptr noundef nonnull %src_it, ptr noundef nonnull %ccs_size, ptr noundef nonnull %ccs_ofs, ptr noundef nonnull %ccs_pt, i32 noundef zeroext 0, i32 noundef zeroext %conv23, i32 noundef zeroext %conv23) #3 br label %if.end if.end: ; preds = %if.then, %while.body %call31 = call ptr @xe_bb_new(ptr noundef nonnull %1, i32 noundef zeroext 2, i1 noundef zeroext %tobool13) #3 %tobool32.not = icmp eq ptr %call31, null br i1 %tobool32.not, label %if.end34, label %if.end65 if.end34: ; preds = %if.end %7 = load i32, ptr inttoptr (i64 4 to ptr), align 4, !tbaa !22 br i1 %tobool13, label %if.then36, label %if.end58 if.then36: ; preds = %if.end34 %8 = load i64, ptr %src_L0_ofs, align 8, !tbaa !24 %9 = load i32, ptr %3, align 4, !tbaa !26 %tobool37.not = icmp eq i32 %9, 0 %tobool.tobool6 = select i1 %tobool37.not, i1 %tobool, i1 %tobool6 %10 = load i64, ptr %dst_L0_ofs, align 8, !tbaa !24 %cond53.in = select i1 %tobool37.not, i1 %tobool4, i1 %tobool9 %11 = load i64, ptr %src_L0, align 8, !tbaa !24 %conv55 = trunc i64 %11 to i32 %12 = load i64, ptr %ccs_ofs, align 8, !tbaa !24 %call57 = call zeroext i32 @xe_migrate_ccs_copy(ptr noundef %m, ptr noundef null, i64 noundef %8, i1 noundef zeroext %tobool.tobool6, i64 noundef %10, i1 noundef zeroext %cond53.in, i32 noundef zeroext %conv55, i64 noundef %12, i1 noundef zeroext %tobool15) #3 br label %if.end58 if.end58: ; preds = %if.then36, %if.end34 %13 = load ptr, ptr %m, align 8, !tbaa !29 %call61 = call ptr @xe_bb_create_migration_job(ptr noundef %13, ptr noundef null, i64 noundef %conv60, i32 noundef zeroext %7) #3 br label %if.end65 if.end65: ; preds = %if.end58, %if.end call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %ccs_pt) #3 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %ccs_size) #3 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %ccs_ofs) #3 br label %while.body while.end: ; preds = %entry call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %src_L0) #3 call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %dst_L0_pt) #3 call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %src_L0_pt) #3 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %dst_L0_ofs) #3 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %src_L0_ofs) #3 call void @llvm.lifetime.end.p0(i64 0, ptr nonnull %src_it) #3 call void @llvm.lifetime.end.p0(i64 0, ptr nonnull %src_it) #3 call void @llvm.lifetime.end.p0(i64 0, ptr nonnull %src_it) #3 ret ptr null } ; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) declare void @llvm.lifetime.start.p0(i64 immarg, ptr captures(none)) #1 declare i64 @xe_migrate_res_sizes(ptr noundef, ptr noundef) local_unnamed_addr #2 declare void @__drm_dev_dbg(ptr dead_on_unwind writable sret(%struct.anon) align 8, ptr noundef, ...) local_unnamed_addr #2 ; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) declare void @llvm.lifetime.end.p0(i64 immarg, ptr captures(none)) #1 declare zeroext i32 @pte_update_size(ptr noundef, i32 noundef zeroext, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef zeroext, i32 noundef zeroext, i32 noundef zeroext) local_unnamed_addr #2 declare ptr @xe_bb_new(ptr noundef, i32 noundef zeroext, i1 noundef zeroext) local_unnamed_addr #2 declare zeroext i32 @xe_migrate_ccs_copy(ptr noundef, ptr noundef, i64 noundef, i1 noundef zeroext, i64 noundef, i1 noundef zeroext, i32 noundef zeroext, i64 noundef, i1 noundef zeroext) local_unnamed_addr #2 declare ptr @xe_bb_create_migration_job(ptr noundef, ptr noundef, i64 noundef, i32 noundef zeroext) local_unnamed_addr #2 attributes #0 = { nounwind uwtable "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="ppc64" "target-features"="+64bit,+altivec,+fpu,+fres,+frsqrte,+fsqrt,+hard-float,+mfocrf,+stfiwx" } attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="ppc64" "target-features"="+64bit,+altivec,+fpu,+fres,+frsqrte,+fsqrt,+hard-float,+mfocrf,+stfiwx" } attributes #3 = { nounwind } !llvm.module.flags = !{!0, !1} !llvm.ident = !{!2} !0 = !{i32 1, !"wchar_size", i32 4} !1 = !{i32 7, !"uwtable", i32 2} !2 = !{!"ClangBuiltLinux clang version 21.0.0git (https://github.com/llvm/llvm-project.git bf79d4819edeb54c6cf528db63676110992908a8)"} !3 = !{!4, !9, i64 8} !4 = !{!"xe_migrate", !5, i64 0, !9, i64 8} !5 = !{!"p1 _ZTS13xe_exec_queue", !6, i64 0} !6 = !{!"any pointer", !7, i64 0} !7 = !{!"omnipotent char", !8, i64 0} !8 = !{!"Simple C/C++ TBAA"} !9 = !{!"p1 _ZTS7xe_tile", !6, i64 0} !10 = !{!11, !13, i64 8} !11 = !{!"xe_tile", !12, i64 0, !13, i64 8} !12 = !{!"p1 _ZTS9xe_device", !6, i64 0} !13 = !{!"p1 _ZTS5xe_gt", !6, i64 0} !14 = !{!15, !9, i64 0} !15 = !{!"xe_gt", !9, i64 0} !16 = !{!11, !12, i64 0} !17 = !{!18, !19, i64 0} !18 = !{!"xe_bo", !19, i64 0} !19 = !{!"int", !7, i64 0} !20 = !{!21, !19, i64 0} !21 = !{!"ttm_resource", !19, i64 0, !5, i64 8} !22 = !{!23, !19, i64 4} !23 = !{!"xe_bb", !19, i64 0, !19, i64 4} !24 = !{!25, !25, i64 0} !25 = !{!"long", !7, i64 0} !26 = !{!27, !19, i64 0} !27 = !{!"xe_device", !28, i64 0} !28 = !{!"", !19, i64 0} !29 = !{!4, !5, i64 0} ``` ``` $ llc -o /dev/null good-xe_migrate.ll $ llc -o /dev/null bad-xe_migrate.ll LLVM ERROR: Found 2 machine code errors. PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace. Stack dump: 0. Program arguments: llc -o /dev/null bad-xe_migrate.ll 1. Running pass 'Function Pass Manager' on module 'bad-xe_migrate.ll'. 2. Running pass 'PowerPC MI Peephole Optimization' on function '@xe_migrate_copy' #0 0x000056384e6475a8 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (llc+0x34ca5a8) #1 0x000056384e645075 llvm::sys::RunSignalHandlers() (llc+0x34c8075) #2 0x000056384e647ca1 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0 #3 0x00007f7cbee4def0 (/usr/lib/libc.so.6+0x3def0) #4 0x00007f7cbeea774c (/usr/lib/libc.so.6+0x9774c) #5 0x00007f7cbee4ddc0 raise (/usr/lib/libc.so.6+0x3ddc0) #6 0x00007f7cbee3557a abort (/usr/lib/libc.so.6+0x2557a) #7 0x000056384e5afa14 llvm::report_fatal_error(llvm::Twine const&, bool) (llc+0x3432a14) #8 0x000056384d796e3e (llc+0x2619e3e) #9 0x000056384d7974a6 llvm::MachineFunction::verify(llvm::Pass*, char const*, llvm::raw_ostream*, bool) const (llc+0x261a4a6) #10 0x000056384cd04c98 (anonymous namespace)::PPCMIPeephole::runOnMachineFunction(llvm::MachineFunction&) PPCMIPeephole.cpp:0:0 #11 0x000056384d667473 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (llc+0x24ea473) #12 0x000056384dbd1f35 llvm::FPPassManager::runOnFunction(llvm::Function&) (llc+0x2a54f35) #13 0x000056384dbda102 llvm::FPPassManager::runOnModule(llvm::Module&) (llc+0x2a5d102) #14 0x000056384dbd298b llvm::legacy::PassManagerImpl::run(llvm::Module&) (llc+0x2a5598b) #15 0x000056384cb9e386 main (llc+0x1a21386) #16 0x00007f7cbee376b5 (/usr/lib/libc.so.6+0x276b5) #17 0x00007f7cbee37769 __libc_start_main (/usr/lib/libc.so.6+0x27769) #18 0x000056384cb98025 _start (llc+0x1a1b025) ``` The diff of the IR: ```diff diff --git a/good-xe_migrate.ll b/bad-xe_migrate.ll index 6222a0e..6632523 100644 --- a/good-xe_migrate.ll +++ b/bad-xe_migrate.ll @@ -79,13 +79,13 @@ if.then36: ; preds = %if.end34 %8 = load i64, ptr %src_L0_ofs, align 8, !tbaa !24 %9 = load i32, ptr %3, align 4, !tbaa !26 %tobool37.not = icmp eq i32 %9, 0 - %cond.v = select i1 %tobool37.not, i1 %tobool, i1 %tobool6 + %tobool.tobool6 = select i1 %tobool37.not, i1 %tobool, i1 %tobool6 %10 = load i64, ptr %dst_L0_ofs, align 8, !tbaa !24 - %cond53.v = select i1 %tobool37.not, i1 %tobool4, i1 %tobool9 + %cond53.in = select i1 %tobool37.not, i1 %tobool4, i1 %tobool9 %11 = load i64, ptr %src_L0, align 8, !tbaa !24 %conv55 = trunc i64 %11 to i32 %12 = load i64, ptr %ccs_ofs, align 8, !tbaa !24 - %call57 = call zeroext i32 @xe_migrate_ccs_copy(ptr noundef %m, ptr noundef null, i64 noundef %8, i1 noundef zeroext %cond.v, i64 noundef %10, i1 noundef zeroext %cond53.v, i32 noundef zeroext %conv55, i64 noundef %12, i1 noundef zeroext %tobool15) #3 + %call57 = call zeroext i32 @xe_migrate_ccs_copy(ptr noundef %m, ptr noundef null, i64 noundef %8, i1 noundef zeroext %tobool.tobool6, i64 noundef %10, i1 noundef zeroext %cond53.in, i32 noundef zeroext %conv55, i64 noundef %12, i1 noundef zeroext %tobool15) #3 br label %if.end58 if.end58: ; preds = %if.then36, %if.end34 @@ -129,9 +129,9 @@ declare zeroext i32 @xe_migrate_ccs_copy(ptr noundef, ptr noundef, i64 noundef, declare ptr @xe_bb_create_migration_job(ptr noundef, ptr noundef, i64 noundef, i32 noundef zeroext) local_unnamed_addr #2 -attributes #0 = { nounwind uwtable "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="ppc64" "target-features"="+altivec,-bpermd,-crbits,-crypto,-direct-move,-extdiv,-htm,-isa-v206-instructions,-isa-v207-instructions,-isa-v30-instructions,-power8-vector,-power9-vector,-privileged,-quadword-atomics,-rop-protect,-spe,-vsx" } +attributes #0 = { nounwind uwtable "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="ppc64" "target-features"="+64bit,+altivec,+fpu,+fres,+frsqrte,+fsqrt,+hard-float,+mfocrf,+stfiwx" } attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } -attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="ppc64" "target-features"="+altivec,-bpermd,-crbits,-crypto,-direct-move,-extdiv,-htm,-isa-v206-instructions,-isa-v207-instructions,-isa-v30-instructions,-power8-vector,-power9-vector,-privileged,-quadword-atomics,-rop-protect,-spe,-vsx" } +attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="ppc64" "target-features"="+64bit,+altivec,+fpu,+fres,+frsqrte,+fsqrt,+hard-float,+mfocrf,+stfiwx" } attributes #3 = { nounwind } !llvm.module.flags = !{!0, !1} @@ -139,7 +139,7 @@ attributes #3 = { nounwind } !0 = !{i32 1, !"wchar_size", i32 4} !1 = !{i32 7, !"uwtable", i32 2} -!2 = !{!"ClangBuiltLinux clang version 21.0.0git (https://github.com/llvm/llvm-project.git 5645d6710904107d66a45f1c3ee0ee25924ff08a)"} +!2 = !{!"ClangBuiltLinux clang version 21.0.0git (https://github.com/llvm/llvm-project.git bf79d4819edeb54c6cf528db63676110992908a8)"} !3 = !{!4, !9, i64 8} !4 = !{!"xe_migrate", !5, i64 0, !9, i64 8} !5 = !{!"p1 _ZTS13xe_exec_queue", !6, i64 0} ``` https://github.com/llvm/llvm-project/pull/144594 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits