aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/CodeGen/PowerPC/p10-fi-elim.ll
blob: 3f6838afd545b11388eb42236fd0b0084fa8dfbb (plain)
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
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
; RUN:   -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | \
; RUN:   FileCheck %s
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
; RUN:   -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | \
; RUN:   FileCheck %s --check-prefix=CHECK-BE

%96 = type <{ i32 }>
%97 = type <{ i32 }>
%98 = type <{ i32 }>
%100 = type <{ i8, i8, i8, i8, i32, i64, i64, [1 x i64], [1 x i64], [1 x i64] }>
%101 = type <{ i8, i8, i8, i8, i32, i64, i64, [1 x i64], [1 x i64], [1 x i64], [24 x i8] }>
%102 = type <{ i8, i8, i8, i8, i32, i64, i64, [1 x i64], [1 x i64], [1 x i64] }>
%103 = type <{ ptr, i8, i8, i8, i8, [4 x i8], i32, [12 x i8], i32, [4 x i8] }>
%104 = type <{ i32 }>
%105 = type <{ i32 }>
%106 = type <{ i32 }>

; Function Attrs: nobuiltin norecurse
define dso_local signext i32 @test_FI_elim(ptr noalias nocapture dereferenceable(40) %arg, ptr noalias nocapture nonnull readonly %arg2, ptr noalias nocapture nonnull readonly %arg3, ptr noalias nocapture nonnull readonly %arg4, ptr noalias nocapture dereferenceable(48) %arg6, ptr noalias nocapture dereferenceable(72) %arg7) local_unnamed_addr #2 {
; CHECK-LABEL: test_FI_elim:
; CHECK:       # %bb.0: # %bb
; CHECK-NEXT:    mflr r0
; CHECK-NEXT:    std r0, 16(r1)
; CHECK-NEXT:    stdu r1, -80(r1)
; CHECK-NEXT:    .cfi_def_cfa_offset 80
; CHECK-NEXT:    .cfi_offset lr, 16
; CHECK-NEXT:    lxv v2, 0(r3)
; CHECK-NEXT:    mr r9, r6
; CHECK-NEXT:    mr r6, r5
; CHECK-NEXT:    li r12, -127
; CHECK-NEXT:    li r0, 4
; CHECK-NEXT:    stb r12, 0(r3)
; CHECK-NEXT:    li r2, 1
; CHECK-NEXT:    std r0, 0(r3)
; CHECK-NEXT:    stw r2, 0(r3)
; CHECK-NEXT:    li r11, 3
; CHECK-NEXT:    stb r11, 0(0)
; CHECK-NEXT:    mfvsrd r5, v2
; CHECK-NEXT:    vaddudm v3, v2, v2
; CHECK-NEXT:    pstxv v2, 64(r1), 0
; CHECK-NEXT:    neg r5, r5
; CHECK-NEXT:    mfvsrd r10, v3
; CHECK-NEXT:    std r5, 0(r3)
; CHECK-NEXT:    lbz r5, 2(r7)
; CHECK-NEXT:    stb r11, 0(r3)
; CHECK-NEXT:    stb r12, 0(r3)
; CHECK-NEXT:    std r2, 0(r3)
; CHECK-NEXT:    mr r7, r9
; CHECK-NEXT:    neg r10, r10
; CHECK-NEXT:    rlwinm r5, r5, 0, 27, 27
; CHECK-NEXT:    stb r5, 0(0)
; CHECK-NEXT:    lbz r5, 2(r8)
; CHECK-NEXT:    rlwinm r5, r5, 0, 27, 27
; CHECK-NEXT:    stb r5, 0(r3)
; CHECK-NEXT:    li r5, 2
; CHECK-NEXT:    std r0, 0(r3)
; CHECK-NEXT:    stw r5, 0(r3)
; CHECK-NEXT:    mr r5, r4
; CHECK-NEXT:    std r10, 0(r3)
; CHECK-NEXT:    bl foo@notoc
; CHECK-NEXT:    extsw r3, r3
; CHECK-NEXT:    addi r1, r1, 80
; CHECK-NEXT:    ld r0, 16(r1)
; CHECK-NEXT:    mtlr r0
; CHECK-NEXT:    blr
;
; CHECK-BE-LABEL: test_FI_elim:
; CHECK-BE:       # %bb.0: # %bb
; CHECK-BE-NEXT:    mflr r0
; CHECK-BE-NEXT:    std r0, 16(r1)
; CHECK-BE-NEXT:    stdu r1, -176(r1)
; CHECK-BE-NEXT:    .cfi_def_cfa_offset 176
; CHECK-BE-NEXT:    .cfi_offset lr, 16
; CHECK-BE-NEXT:    .cfi_offset r30, -16
; CHECK-BE-NEXT:    lxv v2, 0(r3)
; CHECK-BE-NEXT:    mr r9, r6
; CHECK-BE-NEXT:    mr r6, r5
; CHECK-BE-NEXT:    std r30, 160(r1) # 8-byte Folded Spill
; CHECK-BE-NEXT:    li r12, -127
; CHECK-BE-NEXT:    li r0, 4
; CHECK-BE-NEXT:    stb r12, 0(r3)
; CHECK-BE-NEXT:    li r30, 1
; CHECK-BE-NEXT:    std r0, 0(r3)
; CHECK-BE-NEXT:    stw r30, 0(r3)
; CHECK-BE-NEXT:    li r11, 3
; CHECK-BE-NEXT:    stb r11, 0(0)
; CHECK-BE-NEXT:    mfvsrld r5, v2
; CHECK-BE-NEXT:    vaddudm v3, v2, v2
; CHECK-BE-NEXT:    pstxv v2, 144(r1), 0
; CHECK-BE-NEXT:    mfvsrld r10, v3
; CHECK-BE-NEXT:    neg r5, r5
; CHECK-BE-NEXT:    std r5, 0(r3)
; CHECK-BE-NEXT:    lbz r5, 2(r7)
; CHECK-BE-NEXT:    stb r11, 0(r3)
; CHECK-BE-NEXT:    stb r12, 0(r3)
; CHECK-BE-NEXT:    std r30, 0(r3)
; CHECK-BE-NEXT:    mr r7, r9
; CHECK-BE-NEXT:    neg r10, r10
; CHECK-BE-NEXT:    rlwinm r5, r5, 0, 27, 27
; CHECK-BE-NEXT:    stb r5, 0(0)
; CHECK-BE-NEXT:    lbz r5, 2(r8)
; CHECK-BE-NEXT:    rlwinm r5, r5, 0, 27, 27
; CHECK-BE-NEXT:    stb r5, 0(r3)
; CHECK-BE-NEXT:    li r5, 2
; CHECK-BE-NEXT:    std r0, 0(r3)
; CHECK-BE-NEXT:    stw r5, 0(r3)
; CHECK-BE-NEXT:    mr r5, r4
; CHECK-BE-NEXT:    std r10, 0(r3)
; CHECK-BE-NEXT:    bl foo
; CHECK-BE-NEXT:    nop
; CHECK-BE-NEXT:    ld r30, 160(r1) # 8-byte Folded Reload
; CHECK-BE-NEXT:    extsw r3, r3
; CHECK-BE-NEXT:    addi r1, r1, 176
; CHECK-BE-NEXT:    ld r0, 16(r1)
; CHECK-BE-NEXT:    mtlr r0
; CHECK-BE-NEXT:    blr
bb:
  %i = alloca %102, align 8
  %i8 = load <2 x i64>, ptr undef, align 8
  %i9 = extractelement <2 x i64> %i8, i32 1
  %i10 = sub i64 0, %i9
  %i11 = load <2 x i64>, ptr undef, align 8
  %i12 = load <2 x i64>, ptr undef, align 8
  %i13 = add nsw <2 x i64> %i11, %i12
  %i14 = extractelement <2 x i64> %i13, i32 1
  %i15 = sub i64 0, %i14
  store i8 3, ptr null, align 8
  store i8 -127, ptr undef, align 1
  store i64 4, ptr undef, align 8
  store i32 1, ptr undef, align 4
  %i16 = getelementptr inbounds %102, ptr %i, i64 0, i32 8, i64 0
  store <2 x i64> %i8, ptr %i16, align 8
  store i64 %i10, ptr undef, align 8
  store i8 3, ptr undef, align 8
  %i18 = getelementptr inbounds %100, ptr %arg6, i64 0, i32 2
  %i19 = load i8, ptr %i18, align 1
  %i20 = and i8 %i19, 16
  store i8 %i20, ptr null, align 2
  store i8 -127, ptr undef, align 1
  store i64 1, ptr undef, align 8
  %i21 = getelementptr inbounds %101, ptr %arg7, i64 0, i32 2
  %i22 = load i8, ptr %i21, align 1
  %i23 = and i8 %i22, 16
  store i8 %i23, ptr undef, align 2
  store i64 4, ptr undef, align 8
  store i32 2, ptr undef, align 4
  store i64 %i15, ptr undef, align 8
  %i28 = call i32 @foo(ptr nonnull %arg, ptr nonnull undef, ptr %arg2, ptr %arg3, ptr %arg4)
  ret i32 %i28
}

declare dso_local i32 @foo(ptr, ptr, ptr, ptr, ptr) local_unnamed_addr #1