| 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