Issue 204036
Summary [CodeGen] Improper `undef` propagation in RegisterCoalescer undef copy elimination.
Labels llvm:codegen
Assignees bababuck
Reporter bababuck
    During elimination of `undef` copies in the register coalescer, `undef` isn't propagated to uses that are sub-register definitions.

First reported https://github.com/llvm/llvm-project/pull/200532#issuecomment-4694421891. @DKLoehr 

```
--- |
  ; ModuleID = 'repro.ll'
  source_filename = "repro.cc"
  target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
  target triple = "thumbv7-unknown-linux-android29"

  @test_crash_format = dso_local local_unnamed_addr global i32 0, align 4
  @global_out = external local_unnamed_addr global ptr, align 4

  ; Function Attrs: mustprogress nofree norecurse noreturn nosync nounwind optsize memory(readwrite, argmem: write, inaccessiblemem: none, target_mem: none)
  define dso_local void @_Z10test_crashv() local_unnamed_addr #0 {
  entry:
    %0 = load i32, ptr @test_crash_format, align 4, !tbaa !5
    %1 = insertelement <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 poison, i32 poison, i32 poison, i32 undef>, i32 %0, i64 6
    br label %for.cond

  for.cond: ; preds = %for.cond, %entry
    %i.0 = phi i32 [ undef, %entry ], [ %inc, %for.cond ]
    %2 = insertelement <8 x i32> %1, i32 %i.0, i64 4
    %3 = insertelement <8 x i32> %2, i32 %i.0, i64 5
    %4 = load ptr, ptr @global_out, align 4, !tbaa !9
    store <8 x i32> %3, ptr %4, align 32, !tbaa !11
    %inc = add nsw i32 %i.0, 1
    br label %for.cond, !llvm.loop !12
  }

  attributes #0 = { mustprogress nofree norecurse noreturn nosync nounwind optsize memory(readwrite, argmem: write, inaccessiblemem: none, target_mem: none) "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="generic" "target-features"="+armv7-a,+d32,+dsp,+fp64,+neon,+read-tp-tpidruro,+thumb-mode,+vfp2,+vfp2sp,+vfp3,+vfp3d16,+vfp3d16sp,+vfp3sp,-aes,-fp-armv8,-fp-armv8d16,-fp-armv8d16sp,-fp-armv8sp,-fp16,-fp16fml,-fullfp16,-sha2,-vfp4,-vfp4d16,-vfp4d16sp,-vfp4sp" }

  !llvm.module.flags = !{!0, !1, !2, !3}
  !llvm.ident = !{!4}
 !llvm.errno.tbaa = !{!5}

  !0 = !{i32 1, !"min_enum_size", i32 4}
  !1 = !{i32 8, !"PIC Level", i32 2}
  !2 = !{i32 7, !"PIE Level", i32 2}
 !3 = !{i32 7, !"frame-pointer", i32 2}
  !4 = !{!"clang version 23.0.0git ([email protected]:bababuck/llvm-project.git a6351d882ca3086c62e052fbc4f7f585e157213b)"}
  !5 = !{!6, !6, i64 0}
  !6 = !{!"int", !7, i64 0}
  !7 = !{!"omnipotent char", !8, i64 0}
  !8 = !{!"Simple C++ TBAA"}
  !9 = !{!10, !10, i64 0}
  !10 = !{!"any pointer", !7, i64 0}
  !11 = !{!7, !7, i64 0}
  !12 = distinct !{!12, !13}
  !13 = !{!"llvm.loop.mustprogress"}
...
---
name: _Z10test_crashv
alignment:       2
exposesReturnsTwice: false
legalized: false
regBankSelected: false
selected:        false
failedISel: false
tracksRegLiveness: true
hasWinCFI:       false
noPhis: true
isSSA:           false
noVRegs:         false
hasFakeUses: false
callsEHReturn:   false
callsUnwindInit: false
hasEHContTarget: false
hasEHScopes:     false
hasEHFunclets:   false
isOutlined: false
debugInstrRef:   false
failsVerification: false
tracksDebugUserValues: false
registers:
  - { id: 0, class: dpair, preferred-register: '', flags: [  ] }
  - { id: 1, class: dpair, preferred-register: '', flags: [  ] }
  - { id: 2, class: gprnopc, preferred-register: '', flags: [  ] }
  - { id: 3, class: gpr, preferred-register: '', flags: [  ] }
  - { id: 4, class: gpr, preferred-register: '', flags: [  ] }
  - { id: 5, class: rgpr, preferred-register: '', flags: [  ] }
  - { id: 6, class: dpr, preferred-register: '', flags: [  ] }
  - { id: 7, class: dpr, preferred-register: '', flags: [  ] }
  - { id: 8, class: qpr, preferred-register: '', flags: [  ] }
  - { id: 9, class: dpr, preferred-register: '', flags: [  ] }
  - { id: 10, class: dpr, preferred-register: '', flags: [  ] }
  - { id: 11, class: dpr, preferred-register: '', flags: [  ] }
  - { id: 12, class: dpr, preferred-register: '', flags: [  ] }
  - { id: 13, class: rgpr, preferred-register: '', flags: [  ] }
  - { id: 14, class: gpr, preferred-register: '', flags: [  ] }
  - { id: 15, class: qpr, preferred-register: '', flags: [  ] }
  - { id: 16, class: dpr, preferred-register: '', flags: [  ] }
  - { id: 17, class: dpr, preferred-register: '', flags: [  ] }
  - { id: 18, class: gpr, preferred-register: '', flags: [  ] }
  - { id: 19, class: qpr, preferred-register: '', flags: [  ] }
  - { id: 20, class: rgpr, preferred-register: '', flags: [  ] }
  - { id: 21, class: gprnopc, preferred-register: '', flags: [  ] }
liveins:         []
frameInfo:
 isFrameAddressTaken: false
  isReturnAddressTaken: false
  hasStackMap: false
  hasPatchPoint:   false
  stackSize:       0
  offsetAdjustment: 0
  maxAlignment:    1
  adjustsStack:    false
  hasCalls:        false
 framePointerPolicy: all
  stackProtector:  ''
  functionContext: ''
 maxCallFrameSize: 0
  cvBytesOfCalleeSavedRegisters: 0
 hasOpaqueSPAdjustment: false
  hasVAStart:      false
 hasMustTailInVarArgFunc: false
  hasTailCall:     false
 isCalleeSavedInfoValid: false
  localFrameSize:  0
fixedStack: []
stack:           []
entry_values:    []
callSites: []
debugValueSubstitutions: []
constants:       []
machineFunctionInfo:
 isLRSpilled:     false
body:             |
  bb.0.entry:
    successors: %bb.1(0x80000000)

    %5:rgpr = t2MOVi32imm @test_crash_format
    %6:dpr = VLD1LNd32 killed %5, 4, undef %6, 0, 14 /* CC::al */, $noreg :: (dereferenceable load (s32) from @test_crash_format, !tbaa !5)
    undef %8.dsub_0:qpr = COPY undef %9:dpr
    %8.dsub_1:qpr = COPY killed %6
 %11:dpr = COPY %8.dsub_0
    %13:rgpr = t2MOVi32imm @global_out
 %21:gprnopc = IMPLICIT_DEF

  bb.1.for.cond:
    successors: %bb.1(0x80000000)

    %2:gprnopc = COPY killed %21
    %12:dpr = COPY %11
    %12:dpr = VSETLNi32 %12, %2, 0, 14 /* CC::al */, $noreg
    %14:gpr = t2LDRi12 %13, 0, 14 /* CC::al */, $noreg :: (dereferenceable load (s32) from @global_out, !tbaa !9)
    %15:qpr = COPY %8
    %15.dsub_0:qpr = COPY %12
    %16:dpr = COPY killed %12
    %17:dpr = COPY killed %16
 %17:dpr = VSETLNi32 %17, %2, 1, 14 /* CC::al */, $noreg
    %18:gpr = COPY killed %14
    %18:gpr = VST1q32wb_fixed %18, 16, undef %0:dpair, 14 /* CC::al */, $noreg :: (store (s128) into %ir.4, align 32, !tbaa !11)
 %19:qpr = COPY killed %15
    %19.dsub_0:qpr = COPY killed %17
    VST1q64 killed %18, 16, killed %19, 14 /* CC::al */, $noreg :: (store (s128) into %ir.4 + 16, basealign 32, !tbaa !11)
    %20:rgpr = nsw t2ADDri killed %2, 1, 14 /* CC::al */, $noreg, $noreg
    %3:gpr = COPY killed %20
 %21:gprnopc = COPY killed %3
    t2B %bb.1, 14 /* CC::al */, $noreg
...
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to