Summary: This patch could be treated as a rebase of D33960. It also fixes PR35547. A fix for `llvm/test/Other/close-stderr.ll` is proposed in D68164. Seems the consensus is that the test is passing by chance and I'm not sure how important it is for us. So it is removed like in D33960 for now. The rest of the test fixes are just adding `--crash` flag to `not` tool. ** The reason it fixes PR35547 is `exit` does cleanup including calling class destructor whereas `abort` does not do any cleanup. In multithreading environment such as ThinLTO or JIT, threads may share states which mostly are ManagedStatic<>. If faulting thread tearing down a class when another thread is using it, there are chances of memory corruption. This is bad 1. It will stop error reporting like pretty stack printer; 2. The memory corruption is distracting and nondeterministic in terms of error message, and corruption type (depending one the timing, it could be double free, heap free after use, etc.). Reviewers: rnk, chandlerc, zturner, sepavloff, MaskRay, espindola Reviewed By: rnk, MaskRay Subscribers: wuzish, jholewinski, qcolombet, dschuff, jyknight, emaste, sdardis, nemanjai, jvesely, nhaehnle, sbc100, arichardson, jgravelle-google, aheejin, kbarton, fedor.sergeev, asb, rbar, johnrusso, simoncook, apazos, sabuasal, niosHD, jrtc27, zzheng, edward-jones, atanasyan, rogfer01, MartinMosbeck, brucehoult, the_o, PkmX, jocewei, jsji, lenary, s.egerton, pzheng, cfe-commits, MaskRay, filcab, davide, MatzeB, mehdi_amini, hiraditya, steven_wu, dexonsmith, rupprecht, seiya, llvm-commits Tags: #llvm, #clang Differential Revision: https://reviews.llvm.org/D67847
215 lines
5.8 KiB
LLVM
215 lines
5.8 KiB
LLVM
|
|
; RUN: not --crash llc < %s -march=xcore -code-model=medium 2>&1 | FileCheck %s -check-prefix=BAD_CM
|
|
; RUN: not --crash llc < %s -march=xcore -code-model=kernel 2>&1 | FileCheck %s -check-prefix=BAD_CM
|
|
; RUN: not --crash llc < %s -march=xcore -code-model=tiny 2>&1 | FileCheck %s -check-prefix=BAD_CM
|
|
; BAD_CM: Target only supports CodeModel Small or Large
|
|
|
|
|
|
; RUN: llc < %s -march=xcore | FileCheck %s
|
|
; RUN: llc < %s -march=xcore -code-model=small | FileCheck %s
|
|
; RUN: llc < %s -march=xcore -code-model=large | FileCheck %s -check-prefix=LARGE
|
|
|
|
|
|
; CHECK-LABEL: test:
|
|
; CHECK: zext r0, 1
|
|
; CHECK: bt r0, [[JUMP:.LBB[0-9_]*]]
|
|
; CHECK: ldaw r0, dp[A2]
|
|
; CHECK: retsp 0
|
|
; CHECK: [[JUMP]]
|
|
; CHECK: ldaw r0, dp[A1]
|
|
; CHECK: retsp 0
|
|
; LARGE-LABEL: test:
|
|
; LARGE: zext r0, 1
|
|
; LARGE: ldaw r11, cp[.LCPI{{[0-9_]*}}]
|
|
; LARGE: mov r1, r11
|
|
; LARGE: ldaw r11, cp[.LCPI{{[0-9_]*}}]
|
|
; LARGE: bt r0, [[JUMP:.LBB[0-9_]*]]
|
|
; LARGE: mov r11, r1
|
|
; LARGE: [[JUMP]]
|
|
; LARGE: ldw r0, r11[0]
|
|
; LARGE: retsp 0
|
|
@A1 = external global [50000 x i32]
|
|
@A2 = external global [50000 x i32]
|
|
define [50000 x i32]* @test(i1 %bool) nounwind {
|
|
entry:
|
|
%Addr = select i1 %bool, [50000 x i32]* @A1, [50000 x i32]* @A2
|
|
ret [50000 x i32]* %Addr
|
|
}
|
|
|
|
|
|
; CHECK: .section .cp.rodata.cst4,"aMc",@progbits,4
|
|
; CHECK: .long 65536
|
|
; CHECK: .text
|
|
; CHECK-LABEL: f:
|
|
; CHECK: ldc r1, 65532
|
|
; CHECK: add r1, r0, r1
|
|
; CHECK: ldw r1, r1[0]
|
|
; CHECK: ldw r2, cp[.LCPI{{[0-9_]*}}]
|
|
; CHECK: add r0, r0, r2
|
|
; CHECK: ldw r0, r0[0]
|
|
; CHECK: add r0, r1, r0
|
|
; CHECK: ldw r1, dp[l]
|
|
; CHECK: add r0, r0, r1
|
|
; CHECK: ldw r1, dp[l+4]
|
|
; CHECK: add r0, r0, r1
|
|
; CHECK: ldw r1, dp[l+392]
|
|
; CHECK: add r0, r0, r1
|
|
; CHECK: ldw r1, dp[l+396]
|
|
; CHECK: add r0, r0, r1
|
|
; CHECK: ldw r1, dp[s]
|
|
; CHECK: add r0, r0, r1
|
|
; CHECK: ldw r1, dp[s+36]
|
|
; CHECK: add r0, r0, r1
|
|
; CHECK: retsp 0
|
|
;
|
|
; LARGE: .section .cp.rodata.cst4,"aMc",@progbits,4
|
|
; LARGE: .long 65536
|
|
; LARGE: .section .cp.rodata,"ac",@progbits
|
|
; LARGE: .long l
|
|
; LARGE: .long l+4
|
|
; LARGE: .long l+392
|
|
; LARGE: .long l+396
|
|
; LARGE: .text
|
|
; LARGE-LABEL: f:
|
|
; LARGE: ldc r1, 65532
|
|
; LARGE: add r1, r0, r1
|
|
; LARGE: ldw r1, r1[0]
|
|
; LARGE: ldw r2, cp[.LCPI{{[0-9_]*}}]
|
|
; LARGE: add r0, r0, r2
|
|
; LARGE: ldw r0, r0[0]
|
|
; LARGE: add r0, r1, r0
|
|
; LARGE: ldw r1, cp[.LCPI{{[0-9_]*}}]
|
|
; LARGE: ldw r1, r1[0]
|
|
; LARGE: add r0, r0, r1
|
|
; LARGE: ldw r1, cp[.LCPI{{[0-9_]*}}]
|
|
; LARGE: ldw r1, r1[0]
|
|
; LARGE: add r0, r0, r1
|
|
; LARGE: ldw r1, cp[.LCPI{{[0-9_]*}}]
|
|
; LARGE: ldw r1, r1[0]
|
|
; LARGE: add r0, r0, r1
|
|
; LARGE: ldw r1, cp[.LCPI{{[0-9_]*}}]
|
|
; LARGE: ldw r1, r1[0]
|
|
; LARGE: add r0, r0, r1
|
|
; LARGE: ldw r1, dp[s]
|
|
; LARGE: add r0, r0, r1
|
|
; LARGE: ldw r1, dp[s+36]
|
|
; LARGE: add r0, r0, r1
|
|
; LARGE: retsp 0
|
|
define i32 @f(i32* %i) {
|
|
entry:
|
|
%0 = getelementptr inbounds i32, i32* %i, i32 16383
|
|
%1 = load i32, i32* %0
|
|
%2 = getelementptr inbounds i32, i32* %i, i32 16384
|
|
%3 = load i32, i32* %2
|
|
%4 = add nsw i32 %1, %3
|
|
%5 = load i32, i32* getelementptr inbounds ([100 x i32], [100 x i32]* @l, i32 0, i32 0)
|
|
%6 = add nsw i32 %4, %5
|
|
%7 = load i32, i32* getelementptr inbounds ([100 x i32], [100 x i32]* @l, i32 0, i32 1)
|
|
%8 = add nsw i32 %6, %7
|
|
%9 = load i32, i32* getelementptr inbounds ([100 x i32], [100 x i32]* @l, i32 0, i32 98)
|
|
%10 = add nsw i32 %8, %9
|
|
%11 = load i32, i32* getelementptr inbounds ([100 x i32], [100 x i32]* @l, i32 0, i32 99)
|
|
%12 = add nsw i32 %10, %11
|
|
%13 = load i32, i32* getelementptr inbounds ([10 x i32], [10 x i32]* @s, i32 0, i32 0)
|
|
%14 = add nsw i32 %12, %13
|
|
%15 = load i32, i32* getelementptr inbounds ([10 x i32], [10 x i32]* @s, i32 0, i32 9)
|
|
%16 = add nsw i32 %14, %15
|
|
ret i32 %16
|
|
}
|
|
|
|
|
|
; CHECK-LABEL: UnknownSize:
|
|
; CHECK: ldw r0, dp[NoSize+40]
|
|
; CHECK-NEXT: retsp 0
|
|
;
|
|
; LARGE: .section .cp.rodata,"ac",@progbits
|
|
; LARGE: .LCPI{{[0-9_]*}}
|
|
; LARGE-NEXT: .long NoSize
|
|
; LARGE-NEXT: .text
|
|
; LARGE-LABEL: UnknownSize:
|
|
; LARGE: ldw r0, cp[.LCPI{{[0-9_]*}}]
|
|
; LARGE-NEXT: ldw r0, r0[0]
|
|
; LARGE-NEXT: retsp 0
|
|
@NoSize = external global [0 x i32]
|
|
define i32 @UnknownSize() nounwind {
|
|
entry:
|
|
%0 = load i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @NoSize, i32 0, i32 10)
|
|
ret i32 %0
|
|
}
|
|
|
|
|
|
; CHECK-LABEL: UnknownStruct:
|
|
; CHECK: ldaw r0, dp[Unknown]
|
|
; CHECK-NEXT: retsp 0
|
|
;
|
|
; LARGE: .section .cp.rodata,"ac",@progbits
|
|
; LARGE: .LCPI{{[0-9_]*}}
|
|
; LARGE-NEXT: .long Unknown
|
|
; LARGE-NEXT: .text
|
|
; LARGE-LABEL: UnknownStruct:
|
|
; LARGE: ldw r0, cp[.LCPI{{[0-9_]*}}]
|
|
; LARGE-NEXT: retsp 0
|
|
%Struct = type opaque
|
|
@Unknown = external global %Struct
|
|
define %Struct* @UnknownStruct() nounwind {
|
|
entry:
|
|
ret %Struct* @Unknown
|
|
}
|
|
|
|
|
|
; CHECK: .section .dp.bss,"awd",@nobits
|
|
; CHECK-LABEL: l:
|
|
; CHECK: .space 400
|
|
; LARGE: .section .dp.bss.large,"awd",@nobits
|
|
; LARGE-LABEL: l:
|
|
; LARGE: .space 400
|
|
@l = global [100 x i32] zeroinitializer
|
|
|
|
; CHECK-LABEL: s:
|
|
; CHECK: .space 40
|
|
; LARGE: .section .dp.bss,"awd",@nobits
|
|
; LARGE-LABEL: s:
|
|
; LARGE: .space 40
|
|
@s = global [10 x i32] zeroinitializer
|
|
|
|
; CHECK: .section .dp.rodata,"awd",@progbits
|
|
; CHECK-LABEL: cl:
|
|
; CHECK: .space 400
|
|
; LARGE: .section .dp.rodata.large,"awd",@progbits
|
|
; LARGE-LABEL: cl:
|
|
; LARGE: .space 400
|
|
@cl = constant [100 x i32] zeroinitializer
|
|
|
|
; CHECK-LABEL: cs:
|
|
; CHECK: .space 40
|
|
; LARGE: .section .dp.rodata,"awd",@progbits
|
|
; LARGE-LABEL: cs:
|
|
; LARGE: .space 40
|
|
@cs = constant [10 x i32] zeroinitializer
|
|
|
|
; CHECK: .section .cp.rodata,"ac",@progbits
|
|
; CHECK-LABEL: icl:
|
|
; CHECK: .space 400
|
|
; LARGE: .section .cp.rodata.large,"ac",@progbits
|
|
; LARGE-LABEL: icl:
|
|
; LARGE: .space 400
|
|
@icl = internal constant [100 x i32] zeroinitializer
|
|
|
|
; CHECK-LABEL: cs:
|
|
; CHECK: .space 40
|
|
; LARGE: .section .cp.rodata,"ac",@progbits
|
|
; LARGE-LABEL: cs:
|
|
; LARGE: .space 40
|
|
@ics = internal constant [10 x i32] zeroinitializer
|
|
|
|
; CHECK: .section .cp.namedsection,"ac",@progbits
|
|
; CHECK-LABEL: cpsec:
|
|
; CHECK: .long 0
|
|
@cpsec = constant i32 0, section ".cp.namedsection"
|
|
|
|
; CHECK: .section .dp.namedsection,"awd",@progbits
|
|
; CHECK-LABEL: dpsec:
|
|
; CHECK: .long 0
|
|
@dpsec = global i32 0, section ".dp.namedsection"
|
|
|