| # RUN: llc %s -mtriple=s390x-linux-gnu -mcpu=z13 \ |
| # RUN: -start-before=register-coalescer -o - 2>&1 > /dev/null |
| |
| # Test that the SystemZ shouldCoalesce() implementation does not crash in |
| # case of an undef use in another MBB. This was discovered in testing with |
| # -systemz-subreg-liveness. |
| |
| --- | |
| @g_74 = external dso_local unnamed_addr global i32, align 4 |
| @g_193 = external dso_local unnamed_addr global i32, align 4 |
| |
| define dso_local void @main() local_unnamed_addr { |
| %1 = load i32, i32* @g_193 |
| %2 = or i32 %1, -1395153718 |
| %3 = sdiv i32 -1395153718, %2 |
| br i1 undef, label %5, label %4 |
| |
| ; <label>:4: ; preds = %0 |
| store i32 %3, i32* @g_74 |
| store i32 -9, i32* @g_74 |
| ret void |
| |
| ; <label>:5: ; preds = %0 |
| unreachable |
| } |
| |
| ... |
| --- |
| name: main |
| alignment: 16 |
| tracksRegLiveness: true |
| registers: |
| - { id: 0, class: grx32bit } |
| - { id: 1, class: addr64bit } |
| - { id: 2, class: gr32bit } |
| - { id: 3, class: gr32bit } |
| - { id: 4, class: gr64bit } |
| - { id: 5, class: gr128bit } |
| - { id: 6, class: gr128bit } |
| - { id: 7, class: grx32bit } |
| - { id: 8, class: gr32bit } |
| - { id: 9, class: gr128bit } |
| body: | |
| bb.0 (%ir-block.0): |
| successors: %bb.2(0x00000001), %bb.1(0x7fffffff) |
| |
| %1:addr64bit = LARL @g_193 |
| %2:gr32bit = IIFMux 2899813578 |
| %3:gr32bit = COPY killed %2 |
| %3:gr32bit = O %3, killed %1, 0, $noreg, implicit-def dead $cc :: (dereferenceable load (s32) from @g_193) |
| %4:gr64bit = LGFI -1395153718 |
| undef %5.subreg_l64:gr128bit = COPY killed %4 |
| %6:gr128bit = COPY killed %5 |
| dead %6:gr128bit = DSGFR %6, killed %3 |
| %7:grx32bit = LHIMux 0 |
| CHIMux killed %7, 0, implicit-def $cc |
| BRC 14, 6, %bb.2, implicit killed $cc |
| J %bb.1 |
| |
| bb.1 (%ir-block.4): |
| %8:gr32bit = LHIMux -9 |
| STRL killed %8, @g_74 :: (store (s32) into @g_74) |
| Return |
| |
| bb.2 (%ir-block.5): |
| dead %0:grx32bit = COPY undef %6.subreg_l32 |
| |
| ... |