[llvm] r332707 - StackColoring: better handling of statically unreachable code

via llvm-commits llvm-commits at lists.llvm.org
Fri May 18 10:07:06 PDT 2018


Hi Than,

I don't know if you noticed, but the test you added in this commit is causing a failure on one of the bots. Can you take a look?

http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/builds/17217

FAIL: LLVM :: CodeGen/X86/PR37310.mir (25736 of 40490)
******************** TEST 'LLVM :: CodeGen/X86/PR37310.mir' FAILED ********************
Script:
--
C:\ps4-buildslave2\llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast\llvm.obj\bin\llc.EXE -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7 -start-before isel -no-stack-coloring=false -stop-after stack-coloring -o - C:\ps4-buildslave2\llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast\llvm.src\test\CodeGen\X86\PR37310.mir
--
Exit Code: 1

Command Output (stdout):
--
$ "C:\ps4-buildslave2\llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast\llvm.obj\bin\llc.EXE" "-mtriple=x86_64-unknown-linux-gnu" "-mcpu=corei7" "-start-before" "isel" "-no-stack-coloring=false" "-stop-after" "stack-coloring" "-o" "-" "C:\ps4-buildslave2\llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast\llvm.src\test\CodeGen\X86\PR37310.mir"
# command stderr:
LLVM ERROR: "isel" pass is not registered.


error: command failed with exit status: 1

--

********************

Douglas Yung

> -----Original Message-----
> From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On
> Behalf Of Than McIntosh via llvm-commits
> Sent: Friday, May 18, 2018 5:26
> To: llvm-commits at lists.llvm.org
> Subject: [llvm] r332707 - StackColoring: better handling of statically
> unreachable code
> 
> Author: thanm
> Date: Fri May 18 05:25:30 2018
> New Revision: 332707
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=332707&view=rev
> Log:
> StackColoring: better handling of statically unreachable code
> 
> Summary:
> Avoid assert/crash during liveness calculation in situations where the
> incoming machine function has statically unreachable BBs.
> 
> Fixes PR37130.
> 
> Subscribers: llvm-commits
> 
> Differential Revision: https://reviews.llvm.org/D46265
> 
> Added:
>     llvm/trunk/test/CodeGen/X86/PR37310.mir
> Modified:
>     llvm/trunk/lib/CodeGen/StackColoring.cpp
> 
> Modified: llvm/trunk/lib/CodeGen/StackColoring.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/CodeGen/StackColoring.cpp?rev=332707&r1=332706&r
> 2=332707&view=diff
> =======================================================================
> =======
> --- llvm/trunk/lib/CodeGen/StackColoring.cpp (original)
> +++ llvm/trunk/lib/CodeGen/StackColoring.cpp Fri May 18 05:25:30 2018
> @@ -782,8 +782,11 @@ void StackColoring::calculateLocalLivene
>        for (MachineBasicBlock::const_pred_iterator PI = BB-
> >pred_begin(),
>             PE = BB->pred_end(); PI != PE; ++PI) {
>          LivenessMap::const_iterator I = BlockLiveness.find(*PI);
> -        assert(I != BlockLiveness.end() && "Predecessor not found");
> -        LocalLiveIn |= I->second.LiveOut;
> +        // PR37130: transformations prior to stack coloring can
> +        // sometimes leave behind statically unreachable blocks; these
> +        // can be safely skipped here.
> +        if (I != BlockLiveness.end())
> +          LocalLiveIn |= I->second.LiveOut;
>        }
> 
>        // Compute LiveOut by subtracting out lifetimes that end in this
> 
> Added: llvm/trunk/test/CodeGen/X86/PR37310.mir
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/test/CodeGen/X86/PR37310.mir?rev=332707&view=auto
> =======================================================================
> =======
> --- llvm/trunk/test/CodeGen/X86/PR37310.mir (added)
> +++ llvm/trunk/test/CodeGen/X86/PR37310.mir Fri May 18 05:25:30 2018
> @@ -0,0 +1,159 @@
> +# RUN: llc -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7 -start-
> before isel -no-stack-coloring=false -stop-after stack-coloring -o - %s
> +
> +# Test to insure that the liveness analysis in the StackColoring
> +# pass gracefully handles statically unreachable blocks. See PR 37310.
> +
> +# This MIR testcase was created by compiling the following test, first
> +# with "clang -emit-llvm -S" and then "llc -stop-before stack-
> coloring",
> +# and finally editing the resulting MIR by hand to introduce a
> statically
> +# unreachable BB (to wit: rename all bb.3 to bb.4, rename bb.2 to
> bb.3,
> +# then add bb.2 with unconditional jump to bb.4).
> +
> +# Original C code:
> +# extern int inita(int *);
> +# void foo(int x) {
> +#   if (x != 3) {
> +#     int q[128];
> +#     inita(&q[0]);
> +#     return;
> +#   }
> +#   int r[128];
> +#   inita(&r[x]);
> +# }
> +
> +--- |
> +
> +  define void @foo(i32 %x) {
> +  entry:
> +    %q = alloca [128 x i32], align 16
> +    %r = alloca [128 x i32], align 16
> +    %cmp = icmp eq i32 %x, 3
> +    br i1 %cmp, label %if.end, label %if.then
> +
> +  if.then:                                          ; preds = %entry
> +    %0 = bitcast [128 x i32]* %q to i8*
> +    call void @llvm.lifetime.start.p0i8(i64 512, i8* nonnull %0)
> +    %arrayidx2 = bitcast [128 x i32]* %q to i32*
> +    %call = call i32 @inita(i32* nonnull %arrayidx2)
> +    call void @llvm.lifetime.end.p0i8(i64 512, i8* nonnull %0)
> +    br label %return
> +
> +  unreachable:
> +    br label %return
> +
> +  if.end:                                           ; preds = %entry
> +    %1 = bitcast [128 x i32]* %r to i8*
> +    call void @llvm.lifetime.start.p0i8(i64 512, i8* nonnull %1)
> +    %arrayidx1 = getelementptr inbounds [128 x i32], [128 x i32]* %r,
> i64 0, i64 3
> +    %call2 = call i32 @inita(i32* nonnull %arrayidx1)
> +    call void @llvm.lifetime.end.p0i8(i64 512, i8* nonnull %1)
> +    br label %return
> +
> +  return:                                           ; preds = %if.end,
> %if.then
> +    ret void
> +  }
> +
> +  declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
> +
> +  declare i32 @inita(i32*)
> +
> +  declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture)
> +
> +  declare void @llvm.stackprotector(i8*, i8**)
> +
> +  !llvm.module.flags = !{!0}
> +  !llvm.ident = !{!1}
> +
> +  !0 = !{i32 1, !"wchar_size", i32 4}
> +  !1 = !{!"clang version 7.0.0 (trunk 331069) (llvm/trunk 331070)"}
> +
> +...
> +---
> +name:            foo
> +alignment:       4
> +exposesReturnsTwice: false
> +legalized:       false
> +regBankSelected: false
> +selected:        false
> +failedISel:      false
> +tracksRegLiveness: true
> +registers:
> +  - { id: 0, class: gr32, preferred-register: '' }
> +  - { id: 1, class: gr32, preferred-register: '' }
> +  - { id: 2, class: gr64, preferred-register: '' }
> +  - { id: 3, class: gr32, preferred-register: '' }
> +  - { id: 4, class: gr64, preferred-register: '' }
> +  - { id: 5, class: gr32, preferred-register: '' }
> +liveins:
> +  - { reg: '$edi', virtual-reg: '%0' }
> +frameInfo:
> +  isFrameAddressTaken: false
> +  isReturnAddressTaken: false
> +  hasStackMap:     false
> +  hasPatchPoint:   false
> +  stackSize:       0
> +  offsetAdjustment: 0
> +  maxAlignment:    16
> +  adjustsStack:    false
> +  hasCalls:        true
> +  stackProtector:  ''
> +  maxCallFrameSize: 4294967295
> +  hasOpaqueSPAdjustment: false
> +  hasVAStart:      false
> +  hasMustTailInVarArgFunc: false
> +  localFrameSize:  0
> +  savePoint:       ''
> +  restorePoint:    ''
> +fixedStack:
> +stack:
> +  - { id: 0, name: q, type: default, offset: 0, size: 512, alignment:
> 16,
> +      stack-id: 0, callee-saved-register: '', callee-saved-restored:
> true,
> +      debug-info-variable: '', debug-info-expression: '', debug-info-
> location: '' }
> +  - { id: 1, name: r, type: default, offset: 0, size: 512, alignment:
> 16,
> +      stack-id: 0, callee-saved-register: '', callee-saved-restored:
> true,
> +      debug-info-variable: '', debug-info-expression: '', debug-info-
> location: '' }
> +constants:
> +body:             |
> +  bb.0.entry:
> +    successors: %bb.3(0x40000000), %bb.1(0x40000000)
> +    liveins: $edi
> +
> +    %0:gr32 = COPY $edi
> +    %1:gr32 = SUB32ri8 %0, 3, implicit-def $eflags
> +    JE_1 %bb.3, implicit $eflags
> +    JMP_1 %bb.1
> +
> +  bb.1.if.then:
> +    successors: %bb.4(0x80000000)
> +
> +    LIFETIME_START %stack.0.q
> +    ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def
> dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
> +    %2:gr64 = LEA64r %stack.0.q, 1, $noreg, 0, $noreg
> +    $rdi = COPY %2
> +    CALL64pcrel32 @inita, csr_64, implicit $rsp, implicit $ssp,
> implicit $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def $eax
> +    ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead
> $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
> +    %3:gr32 = COPY $eax
> +    LIFETIME_END %stack.0.q
> +    JMP_1 %bb.4
> +
> +  bb.2.unreachable:
> +    successors: %bb.4(0x80000000)
> +
> +    JMP_1 %bb.4
> +
> +  bb.3.if.end:
> +    successors: %bb.4(0x80000000)
> +
> +    LIFETIME_START %stack.1.r
> +    %4:gr64 = LEA64r %stack.1.r, 1, $noreg, 12, $noreg
> +    ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def
> dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
> +    $rdi = COPY %4
> +    CALL64pcrel32 @inita, csr_64, implicit $rsp, implicit $ssp,
> implicit $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def $eax
> +    ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead
> $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
> +    %5:gr32 = COPY $eax
> +    LIFETIME_END %stack.1.r
> +
> +  bb.4.return:
> +    RET 0
> +
> +...
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list