forked from OSchip/llvm-project
118 lines
4.7 KiB
LLVM
118 lines
4.7 KiB
LLVM
; RUN: not llc -O0 -global-isel -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefix=ERROR
|
|
; RUN: llc -O0 -global-isel -global-isel-abort=0 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefix=FALLBACK
|
|
; RUN: llc -O0 -global-isel -global-isel-abort=2 -verify-machineinstrs %s -o %t.out 2> %t.err
|
|
; RUN: FileCheck %s --check-prefix=FALLBACK-WITH-REPORT-OUT < %t.out
|
|
; RUN: FileCheck %s --check-prefix=FALLBACK-WITH-REPORT-ERR < %t.err
|
|
; This file checks that the fallback path to selection dag works.
|
|
; The test is fragile in the sense that it must be updated to expose
|
|
; something that fails with global-isel.
|
|
; When we cannot produce a test case anymore, that means we can remove
|
|
; the fallback path.
|
|
|
|
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
|
|
target triple = "aarch64--"
|
|
|
|
; We use __fixunstfti as the common denominator for __fixunstfti on Linux and
|
|
; ___fixunstfti on iOS
|
|
; ERROR: Unable to lower arguments
|
|
; FALLBACK: ldr q0,
|
|
; FALLBACK-NEXT: bl __fixunstfti
|
|
;
|
|
; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for ABIi128
|
|
; FALLBACK-WITH-REPORT-OUT-LABEL: ABIi128:
|
|
; FALLBACK-WITH-REPORT-OUT: ldr q0,
|
|
; FALLBACK-WITH-REPORT-OUT-NEXT: bl __fixunstfti
|
|
define i128 @ABIi128(i128 %arg1) {
|
|
%farg1 = bitcast i128 %arg1 to fp128
|
|
%res = fptoui fp128 %farg1 to i128
|
|
ret i128 %res
|
|
}
|
|
|
|
; It happens that we don't handle ConstantArray instances yet during
|
|
; translation. Any other constant would be fine too.
|
|
|
|
; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for constant
|
|
; FALLBACK-WITH-REPORT-OUT-LABEL: constant:
|
|
; FALLBACK-WITH-REPORT-OUT: fmov d0, #1.0
|
|
define [1 x double] @constant() {
|
|
ret [1 x double] [double 1.0]
|
|
}
|
|
|
|
; The key problem here is that we may fail to create an MBB referenced by a
|
|
; PHI. If so, we cannot complete the G_PHI and mustn't try or bad things
|
|
; happen.
|
|
; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for pending_phis
|
|
; FALLBACK-WITH-REPORT-OUT-LABEL: pending_phis:
|
|
define i32 @pending_phis(i1 %tst, i32 %val, i32* %addr) {
|
|
br i1 %tst, label %true, label %false
|
|
|
|
end:
|
|
%res = phi i32 [%val, %true], [42, %false]
|
|
ret i32 %res
|
|
|
|
true:
|
|
store atomic i32 42, i32* %addr seq_cst, align 4
|
|
br label %end
|
|
|
|
false:
|
|
br label %end
|
|
|
|
}
|
|
|
|
; General legalizer inability to handle types whose size wasn't a power of 2.
|
|
; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for odd_type
|
|
; FALLBACK-WITH-REPORT-OUT-LABEL: odd_type:
|
|
define void @odd_type(i42* %addr) {
|
|
%val42 = load i42, i42* %addr
|
|
ret void
|
|
}
|
|
|
|
; RegBankSelect crashed when given invalid mappings, and AArch64's
|
|
; implementation produce valid-but-nonsense mappings for G_SEQUENCE.
|
|
; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for sequence_mapping
|
|
; FALLBACK-WITH-REPORT-OUT-LABEL: sequence_mapping:
|
|
define void @sequence_mapping([2 x i64] %in) {
|
|
ret void
|
|
}
|
|
|
|
; Legalizer was asserting when it enountered an unexpected default action.
|
|
; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for legal_default
|
|
; FALLBACK-WITH-REPORT-LABEL: legal_default:
|
|
define void @legal_default(i64 %in) {
|
|
insertvalue [2 x i64] undef, i64 %in, 0
|
|
ret void
|
|
}
|
|
|
|
; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for debug_insts
|
|
; FALLBACK-WITH-REPORT-LABEL: debug_insts:
|
|
define void @debug_insts(i32 %in) #0 !dbg !7 {
|
|
entry:
|
|
%in.addr = alloca i32, align 4
|
|
store i32 %in, i32* %in.addr, align 4
|
|
call void @llvm.dbg.declare(metadata i32* %in.addr, metadata !11, metadata !12), !dbg !13
|
|
ret void, !dbg !14
|
|
}
|
|
|
|
; Function Attrs: nounwind readnone
|
|
declare void @llvm.dbg.declare(metadata, metadata, metadata)
|
|
|
|
!llvm.dbg.cu = !{!0}
|
|
!llvm.module.flags = !{!3, !4, !5}
|
|
!llvm.ident = !{!6}
|
|
|
|
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 4.0.0 (trunk 289075) (llvm/trunk 289080)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
|
|
!1 = !DIFile(filename: "tmp.c", directory: "/Users/tim/llvm/build")
|
|
!2 = !{}
|
|
!3 = !{i32 2, !"Dwarf Version", i32 4}
|
|
!4 = !{i32 2, !"Debug Info Version", i32 3}
|
|
!5 = !{i32 1, !"PIC Level", i32 2}
|
|
!6 = !{!"clang version 4.0.0 (trunk 289075) (llvm/trunk 289080)"}
|
|
!7 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !8, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
|
|
!8 = !DISubroutineType(types: !9)
|
|
!9 = !{null, !10}
|
|
!10 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
|
!11 = !DILocalVariable(name: "in", arg: 1, scope: !7, file: !1, line: 1, type: !10)
|
|
!12 = !DIExpression()
|
|
!13 = !DILocation(line: 1, column: 14, scope: !7)
|
|
!14 = !DILocation(line: 2, column: 1, scope: !7)
|