File: load-and-test-RA-hints.mir

package info (click to toggle)
llvm-toolchain-19 1%3A19.1.7-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,998,520 kB
  • sloc: cpp: 6,951,680; ansic: 1,486,157; asm: 913,598; python: 232,024; f90: 80,126; objc: 75,281; lisp: 37,276; pascal: 16,990; sh: 10,009; ml: 5,058; perl: 4,724; awk: 3,523; makefile: 3,167; javascript: 2,504; xml: 892; fortran: 664; cs: 573
file content (166 lines) | stat: -rw-r--r-- 5,663 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# RUN: llc -mtriple=s390x-linux-gnu -mcpu=z13 -start-before=greedy %s -o - \
# RUN:   -debug-only=regalloc 2>&1 | FileCheck %s
#
# REQUIRES: asserts
#
# Test that regalloc hints are passed for compare with zero cases that can be
# converted to load-and-test.

--- |
  ; ModuleID = './tc.ll'
  source_filename = "proof.c"
  target datalayout = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64"
  target triple = "s390x-ibm-linux"
  
  @rootlosers = external dso_local local_unnamed_addr global [300 x i32], align 4
  
  define dso_local void @proofnumberscan() local_unnamed_addr #0 {
  bb:
    br i1 undef, label %bb20.preheader, label %bb1.preheader
  
  bb1.preheader:                                    ; preds = %bb
    br label %bb1
  
  bb20.preheader:                                   ; preds = %bb
    br label %bb20
  
  bb1:                                              ; preds = %bb1.preheader, %bb15
    %lsr.iv3 = phi ptr [ undef, %bb1.preheader ], [ %2, %bb15 ]
    %lsr.iv1 = phi ptr [ @rootlosers, %bb1.preheader ], [ %1, %bb15 ]
    %lsr.iv = phi i32 [ 0, %bb1.preheader ], [ %lsr.iv.next, %bb15 ]
    %tmp2 = phi i32 [ %tmp18, %bb15 ], [ 0, %bb1.preheader ]
    %tmp3 = phi i32 [ %tmp17, %bb15 ], [ 100000000, %bb1.preheader ]
    %lsr.iv35 = bitcast ptr %lsr.iv3 to ptr
    %tmp5 = load i32, ptr %lsr.iv35, align 4, !tbaa !1
    %tmp6 = load i32, ptr undef, align 4, !tbaa !1
    %tmp7 = icmp eq i32 %tmp6, 0
    br i1 %tmp7, label %bb15, label %bb8
  
  bb8:                                              ; preds = %bb1
    %0 = bitcast ptr %lsr.iv1 to ptr
    %tmp10 = load i32, ptr %0, align 4, !tbaa !1
    %tmp11 = icmp eq i32 %tmp10, 0
    %tmp12 = select i1 %tmp11, i32 %tmp5, i32 %tmp3
    %tmp14 = select i1 %tmp11, i32 %lsr.iv, i32 %tmp2
    br label %bb15
  
  bb15:                                             ; preds = %bb8, %bb1
    %tmp16 = phi i32 [ 0, %bb1 ], [ %tmp6, %bb8 ]
    %tmp17 = phi i32 [ %tmp3, %bb1 ], [ %tmp12, %bb8 ]
    %tmp18 = phi i32 [ %tmp2, %bb1 ], [ %tmp14, %bb8 ]
    %lsr.iv.next = add i32 %lsr.iv, 4
    %scevgep = getelementptr [300 x i32], ptr %lsr.iv1, i64 0, i64 4
    %1 = bitcast ptr %scevgep to ptr
    %scevgep4 = getelementptr [512 x i32], ptr %lsr.iv3, i64 0, i64 4
    %2 = bitcast ptr %scevgep4 to ptr
    br label %bb1
  
  bb20:                                             ; preds = %bb20, %bb20.preheader
    br label %bb20
  }
  
  attributes #0 = { "target-cpu"="z13" "use-soft-float"="false" }
  
  !llvm.ident = !{!0}
  
  !0 = !{!"clang version 9.0.0 (http://llvm.org/git/clang.git 29e2813a2ab7d5569860bb07892dfef7b5374d96) (http://llvm.org/git/llvm.git 546f779cb9d4ac2ce9c9b9522019f500abca9522)"}
  !1 = !{!2, !2, i64 0}
  !2 = !{!"int", !3, i64 0}
  !3 = !{!"omnipotent char", !4, i64 0}
  !4 = !{!"Simple C/C++ TBAA"}

...

# CHECK: ********** MACHINEINSTRS **********
# CHECK: LMux
# CHECK: [[VREG0:%[0-9]+]]:grx32bit = LMux
# CHECK: CHIMux [[VREG0]]:grx32bit, 0, implicit-def $cc
# CHECK: [[VREG1:%[0-9]+]]:grx32bit = LMux
# CHECK: CHIMux [[VREG1]]:grx32bit, 0, implicit-def $cc
# CHECK: selectOrSplit GRX32Bit:[[VREG0]]
# CHECK-NEXT: hints: $r0l $r1l $r2l $r3l $r4l $r5l $r14l $r13l $r12l $r11l $r10l $r9l $r8l $r7l $r6l
# CHECK-NEXT: assigning [[VREG0]] to $[[PREG0:r[0-9]+]]l
# CHECK: selectOrSplit GRX32Bit:[[VREG1]]
# CHECK-NEXT: hints: $r0l $r1l $r2l $r3l $r4l $r5l $r14l $r13l $r12l $r11l $r10l $r9l $r8l $r7l $r6l
# CHECK-NEXT: assigning [[VREG1]] to $[[PREG1:r[0-9]+]]l
# CHECK: lt %[[PREG0]]
# CHECK: lt %[[PREG1]]

---
name:            proofnumberscan
alignment:       16
tracksRegLiveness: true
registers:       
  - { id: 0, class: addr64bit }
  - { id: 1, class: addr64bit }
  - { id: 2, class: grx32bit }
  - { id: 3, class: grx32bit }
  - { id: 4, class: grx32bit }
  - { id: 5, class: grx32bit }
  - { id: 6, class: grx32bit }
  - { id: 7, class: grx32bit }
  - { id: 8, class: grx32bit }
  - { id: 9, class: grx32bit }
  - { id: 10, class: grx32bit }
  - { id: 11, class: grx32bit }
  - { id: 12, class: gr64bit }
  - { id: 13, class: gr64bit }
  - { id: 14, class: grx32bit }
  - { id: 15, class: gr64bit }
  - { id: 16, class: gr64bit }
  - { id: 17, class: grx32bit }
  - { id: 18, class: grx32bit }
  - { id: 19, class: addr64bit }
  - { id: 20, class: grx32bit }
  - { id: 21, class: addr64bit }
  - { id: 22, class: addr64bit }
  - { id: 23, class: grx32bit }
  - { id: 24, class: grx32bit }
  - { id: 25, class: grx32bit }
  - { id: 26, class: grx32bit }
  - { id: 27, class: grx32bit }
body:             |
  bb.0.bb:
    successors: %bb.1, %bb.2
  
    %23:grx32bit = LHIMux 0
    CHIMux %23, 0, implicit-def $cc
    BRC 14, 8, %bb.2, implicit killed $cc
  
  bb.1:
    J %bb.6
  
  bb.2.bb1.preheader:
    %25:grx32bit = IIFMux 100000000
    %22:addr64bit = LARL @rootlosers
    %21:addr64bit = IMPLICIT_DEF
    %24:grx32bit = LHIMux 0
    J %bb.3
  
  bb.3.bb1:
    successors: %bb.7(0x30000000), %bb.4(0x50000000)
  
    %5:grx32bit = LMux %21, 0, $noreg :: (load (s32) from %ir.lsr.iv35, !tbaa !1)
    %6:grx32bit = LMux undef %19:addr64bit, 0, $noreg :: (load (s32) from `ptr undef`, !tbaa !1)
    CHIMux %6, 0, implicit-def $cc
    BRC 14, 6, %bb.4, implicit killed $cc
  
  bb.7:
    J %bb.5
  
  bb.4.bb8:
    %20:grx32bit = LMux %22, 0, $noreg :: (load (s32) from %ir.0, !tbaa !1)
    CHIMux %20, 0, implicit-def $cc
    %25:grx32bit = LOCRMux %25, %5, 14, 8, implicit $cc
    %24:grx32bit = LOCRMux %24, %23, 14, 8, implicit killed $cc
  
  bb.5.bb15:
    %23:grx32bit = AHIMux %23, 4, implicit-def dead $cc
    %22:addr64bit = LA %22, 16, $noreg
    %21:addr64bit = LA %21, 16, $noreg
    J %bb.3
  
  bb.6.bb20:
    J %bb.6

...