summaryrefslogtreecommitdiffstats
path: root/clang/test/Driver/clang_cpp.c
diff options
context:
space:
mode:
authorHal Finkel <hfinkel@anl.gov>2014-12-05 01:57:22 +0000
committerHal Finkel <hfinkel@anl.gov>2014-12-05 01:57:22 +0000
commitd013d99fe0298a4e0edeb7f20331189429becee9 (patch)
treea1c41219b57c25743ad59b9f06fe0e5696bc968a /clang/test/Driver/clang_cpp.c
parent024360e4bc118cb9fea1749698c25d33263125e5 (diff)
downloadbcm5719-llvm-d013d99fe0298a4e0edeb7f20331189429becee9.tar.gz
bcm5719-llvm-d013d99fe0298a4e0edeb7f20331189429becee9.zip
Consider subregs when calling MI::registerDefIsDead for phys deps
The scheduling dependency graph is built bottom-up within each scheduling region, and ScheduleDAGInstrs::addPhysRegDeps is called to add output/anti dependencies, based on physical registers, to the SUs for instructions based on those that come before them. In the test case, we start before post-RA scheduling with a block that looks like this: ... INLINEASM <... andc $0,$0,$2 stdcx. $0,0,$3 bne- 1b > [sideeffect] [mayload] [maystore] [attdialect], $0:[regdef-ec:G8RC], %X6<earlyclobber,def,dead>, $1:[mem], %X3<kill>, $2:[reguse:G8RC], %X5<kill>, $3:[reguse:G8RC], %X3, $4:[mem], %X3, $5:[clobber], %CC<earlyclobber,imp-def,dead>, <<badref>> ... %X4<def,dead> = ANDIo8 %X4<kill>, 1, %CR0<imp-def,dead>, %CR0GT<imp-def> ... %R29<def> = ISEL %R3<undef>, %R4<kill>, %CR0GT<kill> where it is relevant that %CC is an alias to %CR0, and that %CR0GT is a subregister of %CR0. However, for post-RA scheduling, no dependency was added to prevent the INLINEASM from being scheduled in between the ANDIo8 and the ISEL (which communicate via the %CR0GT register). In ScheduleDAGInstrs::addPhysRegDeps, when called for the %CC operand, we'd iterate over all of its aliases (which include %CC itself and also %CR0), and look for previously-encountered defs of those registers. We'd find the ANDIo8, but decide not to add a dependency between the INLINEASM and the ANDIo8 because both the INLINEASM's def of %CC is dead, and also the ANDIo8 def of %CR0 is dead. This ignores, however, that ANDIo8 has a non-dead def of %CR0GT, a subregister of %CR0, and thus a dependency still must exist. To fix this problem, when calling registerDefIsDead on the SU with the def, we also check all subregisters for possible non-dead defs, and add the dependency if any are found. Fixes PR21742. llvm-svn: 223440
Diffstat (limited to 'clang/test/Driver/clang_cpp.c')
0 files changed, 0 insertions, 0 deletions
OpenPOWER on IntegriCloud