[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / fake-use-scheduler.mir
blob8b82c4ed2485dc95b31876363855f59184380be7
1 # Prevent the machine scheduler from moving instructions past FAKE_USE.
2 # RUN: llc -run-pass machine-scheduler -mtriple=x86_64-unknown-linux -debug-only=machine-scheduler 2>&1 -o - %s | FileCheck %s
3 # REQUIRES: asserts
5 # We make sure that, beginning with the first FAKE_USE instruction,
6 # no changes to the sequence of instructions are undertaken by the
7 # scheduler. We don't bother to check that the order of the FAKE_USEs
8 # remains the same. They should, but it is irrelevant.
10 # CHECK: ********** MI Scheduling **********
11 # CHECK-NEXT: foo:%bb.0 entry
12 # CHECK-NEXT:   From: %0:gr64 = COPY $rdi
13 # CHECK-NEXT:     To: FAKE_USE %5:gr64
14 # CHECK-NEXT:  RegionInstrs: 7
16 # CHECK: ********** MI Scheduling **********
17 # CHECK-NEXT: bar:%bb.0 entry
18 # CHECK-NEXT:   From: %0:gr64 = COPY $rdi
19 # CHECK-NEXT:     To: RET 0, killed $rax
20 # CHECK-NEXT:  RegionInstrs: 7
22 --- |
23   ; ModuleID = 'test.ll'
24   source_filename = "test.ll"
25   target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
26   
27   @glb = common dso_local local_unnamed_addr global [100 x i32] zeroinitializer, align 16
28   
29   define dso_local i64 @foo(ptr %p) local_unnamed_addr optdebug {
30   entry:
31     %0 = load i32, ptr @glb, align 16
32     store i32 %0, ptr %p, align 4
33     %conv = sext i32 %0 to i64
34     %1 = load i32, ptr getelementptr inbounds ([100 x i32], ptr @glb, i64 0, i64 1), align 4
35     %arrayidx1 = getelementptr inbounds i32, ptr %p, i64 1
36     store i32 %1, ptr %arrayidx1, align 4
37     %conv2 = sext i32 %1 to i64
38     %add3 = add nsw i64 %conv2, %conv
39     notail call void (...) @llvm.fake.use(i64 %add3)
40     notail call void (...) @llvm.fake.use(i32 %1)
41     notail call void (...) @llvm.fake.use(i32 %0)
42     notail call void (...) @llvm.fake.use(ptr %p)
43     ret i64 %add3
44   }
45   
46   define dso_local i64 @bar(ptr %p) local_unnamed_addr optdebug {
47   entry:
48     %0 = load i32, ptr @glb, align 16
49     store i32 %0, ptr %p, align 4
50     %conv = sext i32 %0 to i64
51     %1 = load i32, ptr getelementptr inbounds ([100 x i32], ptr @glb, i64 0, i64 1), align 4
52     %arrayidx1 = getelementptr inbounds i32, ptr %p, i64 1
53     store i32 %1, ptr %arrayidx1, align 4
54     %conv2 = sext i32 %1 to i64
55     %add3 = add nsw i64 %conv2, %conv
56     ret i64 %add3
57   }
58   
59   ; Function Attrs: nocallback nofree nosync nounwind willreturn
60   declare void @llvm.stackprotector(ptr, ptr)
61   
62 ...
63 ---
64 name:            foo
65 alignment:       16
66 tracksRegLiveness: true
67 debugInstrRef:   true
68 registers:
69   - { id: 0, class: gr64, preferred-register: '' }
70   - { id: 1, class: gr64_with_sub_8bit, preferred-register: '' }
71   - { id: 2, class: gr32, preferred-register: '' }
72   - { id: 3, class: gr64_with_sub_8bit, preferred-register: '' }
73   - { id: 4, class: gr32, preferred-register: '' }
74   - { id: 5, class: gr64, preferred-register: '' }
75 liveins:
76   - { reg: '$rdi', virtual-reg: '%0' }
77 body:             |
78   bb.0.entry:
79     liveins: $rdi
80   
81     %0:gr64 = COPY $rdi
82     %1:gr64_with_sub_8bit = MOVSX64rm32 $rip, 1, $noreg, @glb, $noreg
83     MOV32mr %0, 1, $noreg, 0, $noreg, %1.sub_32bit
84     %3:gr64_with_sub_8bit = MOVSX64rm32 $rip, 1, $noreg, @glb + 4, $noreg
85     MOV32mr %0, 1, $noreg, 4, $noreg, %3.sub_32bit
86     %5:gr64 = COPY %3
87     %5:gr64 = nsw ADD64rr %5, %1, implicit-def dead $eflags
88     FAKE_USE %5
89     FAKE_USE %3.sub_32bit
90     FAKE_USE %1.sub_32bit
91     FAKE_USE %0
92     $rax = COPY %5
93     RET 0, killed $rax
95 ...
96 ---
97 name:            bar
98 alignment:       16
99 tracksRegLiveness: true
100 debugInstrRef:   true
101 registers:
102   - { id: 0, class: gr64, preferred-register: '' }
103   - { id: 1, class: gr64_with_sub_8bit, preferred-register: '' }
104   - { id: 2, class: gr32, preferred-register: '' }
105   - { id: 3, class: gr64_with_sub_8bit, preferred-register: '' }
106   - { id: 4, class: gr32, preferred-register: '' }
107   - { id: 5, class: gr64_with_sub_8bit, preferred-register: '' }
108 liveins:
109   - { reg: '$rdi', virtual-reg: '%0' }
110 body:             |
111   bb.0.entry:
112     liveins: $rdi
113   
114     %0:gr64 = COPY $rdi
115     %1:gr64_with_sub_8bit = MOVSX64rm32 $rip, 1, $noreg, @glb, $noreg
116     MOV32mr %0, 1, $noreg, 0, $noreg, %1.sub_32bit
117     %5:gr64_with_sub_8bit = MOVSX64rm32 $rip, 1, $noreg, @glb + 4, $noreg
118     MOV32mr %0, 1, $noreg, 4, $noreg, %5.sub_32bit
119     %5:gr64_with_sub_8bit = nsw ADD64rr %5, %1, implicit-def dead $eflags
120     $rax = COPY %5
121     RET 0, killed $rax