Skip to content

Commit e29bb07

Browse files
Albion FungAlbion Fung
Albion Fung
authored and
Albion Fung
committedMar 24, 2021
[PowerPC] Exploit xxsplti32dx (constant materialization) for scalars
This patch exploits the xxsplti32dx instruction available on Power10 in place of constant pool loads where xxspltidp would not be able to, usually because the immediate cannot fit into 32 bits. Differential Revision: https://reviews.llvm.org/D95458
1 parent e122877 commit e29bb07

10 files changed

+159
-61
lines changed
 

‎llvm/lib/Target/PowerPC/PPCISelLowering.cpp

+14-4
Original file line numberDiff line numberDiff line change
@@ -8820,6 +8820,18 @@ bool llvm::convertToNonDenormSingle(APInt &ArgAPInt) {
88208820
return Success;
88218821
}
88228822

8823+
// Nondestructive check for convertTonNonDenormSingle.
8824+
bool llvm::checkConvertToNonDenormSingle(APFloat &ArgAPFloat) {
8825+
// Only convert if it loses info, since XXSPLTIDP should
8826+
// handle the other case.
8827+
APFloat APFloatToConvert = ArgAPFloat;
8828+
bool LosesInfo = true;
8829+
APFloatToConvert.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven,
8830+
&LosesInfo);
8831+
8832+
return (!LosesInfo && !APFloatToConvert.isDenormal());
8833+
}
8834+
88238835
// If this is a case we can't handle, return null and let the default
88248836
// expansion code take care of it. If we CAN select this case, and if it
88258837
// selects to a single instruction, return Op. Otherwise, if we can codegen
@@ -16115,10 +16127,8 @@ bool PPCTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT,
1611516127
case MVT::f32:
1611616128
case MVT::f64:
1611716129
if (Subtarget.hasPrefixInstrs()) {
16118-
// With prefixed instructions, we can materialize anything that can be
16119-
// represented with a 32-bit immediate, not just positive zero.
16120-
APFloat APFloatOfImm = Imm;
16121-
return convertToNonDenormSingle(APFloatOfImm);
16130+
// we can materialize all immediatess via XXSPLTI32DX and XXSPLTIDP.
16131+
return true;
1612216132
}
1612316133
LLVM_FALLTHROUGH;
1612416134
case MVT::ppcf128:

‎llvm/lib/Target/PowerPC/PPCISelLowering.h

+1
Original file line numberDiff line numberDiff line change
@@ -1332,6 +1332,7 @@ namespace llvm {
13321332

13331333
bool convertToNonDenormSingle(APInt &ArgAPInt);
13341334
bool convertToNonDenormSingle(APFloat &ArgAPFloat);
1335+
bool checkConvertToNonDenormSingle(APFloat &ArgAPFloat);
13351336

13361337
} // end namespace llvm
13371338

‎llvm/lib/Target/PowerPC/PPCInstrInfo.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -1108,6 +1108,7 @@ bool PPCInstrInfo::isReallyTriviallyReMaterializable(const MachineInstr &MI,
11081108
case PPC::XXLXORspz:
11091109
case PPC::XXLXORdpz:
11101110
case PPC::XXLEQVOnes:
1111+
case PPC::XXSPLTI32DX:
11111112
case PPC::V_SET0B:
11121113
case PPC::V_SET0H:
11131114
case PPC::V_SET0:

‎llvm/lib/Target/PowerPC/PPCInstrInfo.td

+24
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,30 @@ def getFPAs32BitInt : SDNodeXForm<fpimm, [{
399399
SDLoc(N), MVT::i32);
400400
}]>;
401401

402+
// Check if the value can be converted to be single precision immediate, which
403+
// can be exploited by XXSPLTIDP. Ensure that it cannot be converted to single
404+
// precision before exploiting with XXSPLTI32DX.
405+
def nzFPImmAsi64 : PatLeaf<(fpimm), [{
406+
APFloat APFloatOfN = N->getValueAPF();
407+
return !N->isExactlyValue(+0.0) && !checkConvertToNonDenormSingle(APFloatOfN);
408+
}]>;
409+
410+
// Get the Hi bits of a 64 bit immediate.
411+
def getFPAs64BitIntHi : SDNodeXForm<fpimm, [{
412+
APFloat APFloatOfN = N->getValueAPF();
413+
uint32_t Hi = (uint32_t)((APFloatOfN.bitcastToAPInt().getZExtValue() &
414+
0xFFFFFFFF00000000LL) >> 32);
415+
return CurDAG->getTargetConstant(Hi, SDLoc(N), MVT::i32);
416+
}]>;
417+
418+
// Get the Lo bits of a 64 bit immediate.
419+
def getFPAs64BitIntLo : SDNodeXForm<fpimm, [{
420+
APFloat APFloatOfN = N->getValueAPF();
421+
uint32_t Lo = (uint32_t)(APFloatOfN.bitcastToAPInt().getZExtValue() &
422+
0xFFFFFFFF);
423+
return CurDAG->getTargetConstant(Lo, SDLoc(N), MVT::i32);
424+
}]>;
425+
402426
def imm34 : PatLeaf<(imm), [{
403427
return isInt<34>(N->getSExtValue());
404428
}]>;

‎llvm/lib/Target/PowerPC/PPCInstrPrefix.td

+26-8
Original file line numberDiff line numberDiff line change
@@ -1867,14 +1867,6 @@ let Predicates = [PrefixInstrs] in {
18671867
"xxspltidp $XT, $IMM32", IIC_VecGeneral,
18681868
[(set v2f64:$XT,
18691869
(PPCxxspltidp i32:$IMM32))]>;
1870-
def XXSPLTI32DX :
1871-
8RR_DForm_IMM32_XT6_IX<32, 0, (outs vsrc:$XT),
1872-
(ins vsrc:$XTi, u1imm:$IX, i32imm:$IMM32),
1873-
"xxsplti32dx $XT, $IX, $IMM32", IIC_VecGeneral,
1874-
[(set v2i64:$XT,
1875-
(PPCxxsplti32dx v2i64:$XTi, i32:$IX,
1876-
i32:$IMM32))]>,
1877-
RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
18781870
def XXPERMX :
18791871
8RR_XX4Form_IMM3_XTABC6<34, 0, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB,
18801872
vsrc:$XC, u3imm:$UIM),
@@ -1898,6 +1890,19 @@ let Predicates = [PrefixInstrs] in {
18981890
IIC_VecGeneral, []>;
18991891
}
19001892

1893+
// XXSPLI32DX needs extra flags to make sure the compiler does not attempt
1894+
// to spill part of the instruction when the values are similar.
1895+
let isReMaterializable = 1, isMoveImm = 1, Predicates = [PrefixInstrs] in {
1896+
def XXSPLTI32DX :
1897+
8RR_DForm_IMM32_XT6_IX<32, 0, (outs vsrc:$XT),
1898+
(ins vsrc:$XTi, u1imm:$IX, i32imm:$IMM32),
1899+
"xxsplti32dx $XT, $IX, $IMM32", IIC_VecGeneral,
1900+
[(set v2i64:$XT,
1901+
(PPCxxsplti32dx v2i64:$XTi, i32:$IX,
1902+
i32:$IMM32))]>,
1903+
RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
1904+
}
1905+
19011906
let Predicates = [IsISA3_1] in {
19021907
def SETBC : XForm_XT5_BI5<31, 384, (outs gprc:$RT), (ins crbitrc:$BI),
19031908
"setbc $RT, $BI", IIC_IntCompare, []>;
@@ -2623,6 +2628,19 @@ let AddedComplexity = 400, Predicates = [PrefixInstrs] in {
26232628
(COPY_TO_REGCLASS (XXSPLTIDP (getFPAs32BitInt fpimm:$A)),
26242629
VSFRC)>;
26252630

2631+
// To replace constant pool with XXSPLTI32DX for scalars.
2632+
def : Pat<(f32 nzFPImmAsi64:$A),
2633+
(COPY_TO_REGCLASS (XXSPLTI32DX (XXSPLTI32DX(IMPLICIT_DEF), 0,
2634+
(getFPAs64BitIntHi $A)),
2635+
1, (getFPAs64BitIntLo $A)),
2636+
VSRC)>;
2637+
2638+
def : Pat<(f64 nzFPImmAsi64:$A),
2639+
(COPY_TO_REGCLASS (XXSPLTI32DX (XXSPLTI32DX (IMPLICIT_DEF), 0,
2640+
(getFPAs64BitIntHi $A)),
2641+
1, (getFPAs64BitIntLo $A)),
2642+
VSRC)>;
2643+
26262644
// Anonymous patterns for XXEVAL
26272645
// AND
26282646
// and(A, B, C)

‎llvm/test/CodeGen/PowerPC/constant-pool.ll

+41-19
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
define float @FloatConstantPool() {
1010
; CHECK-LABEL: FloatConstantPool:
1111
; CHECK: # %bb.0: # %entry
12-
; CHECK-NEXT: plfs f1, .LCPI0_0@PCREL(0), 1
12+
; CHECK-NEXT: xxsplti32dx vs1, 0, 0
13+
; CHECK-NEXT: xxsplti32dx vs1, 1, 8388577
14+
; CHECK-NEXT: # kill: def $f1 killed $f1 killed $vsl1
1315
; CHECK-NEXT: blr
1416
;
1517
; CHECK-P9-LABEL: FloatConstantPool:
@@ -24,7 +26,9 @@ entry:
2426
define double @DoubleConstantPool() {
2527
; CHECK-LABEL: DoubleConstantPool:
2628
; CHECK: # %bb.0: # %entry
27-
; CHECK-NEXT: plfd f1, .LCPI1_0@PCREL(0), 1
29+
; CHECK-NEXT: xxsplti32dx vs1, 0, 1048574
30+
; CHECK-NEXT: xxsplti32dx vs1, 1, 780229072
31+
; CHECK-NEXT: # kill: def $f1 killed $f1 killed $vsl1
2832
; CHECK-NEXT: blr
2933
;
3034
; CHECK-P9-LABEL: DoubleConstantPool:
@@ -39,8 +43,12 @@ entry:
3943
define ppc_fp128 @LongDoubleConstantPool() {
4044
; CHECK-LABEL: LongDoubleConstantPool:
4145
; CHECK: # %bb.0: # %entry
42-
; CHECK-NEXT: plfd f1, .LCPI2_0@PCREL(0), 1
43-
; CHECK-NEXT: plfd f2, .LCPI2_1@PCREL(0), 1
46+
; CHECK-NEXT: xxsplti32dx vs1, 0, 56623104
47+
; CHECK-NEXT: xxsplti32dx vs2, 0, -2146625897
48+
; CHECK-NEXT: xxsplti32dx vs1, 1, -609716532
49+
; CHECK-NEXT: xxsplti32dx vs2, 1, 1339675259
50+
; CHECK-NEXT: # kill: def $f1 killed $f1 killed $vsl1
51+
; CHECK-NEXT: # kill: def $f2 killed $f2 killed $vsl2
4452
; CHECK-NEXT: blr
4553
;
4654
; CHECK-P9-LABEL: LongDoubleConstantPool:
@@ -185,9 +193,11 @@ entry:
185193
define double @two_constants(double %a) {
186194
; CHECK-LABEL: two_constants:
187195
; CHECK: # %bb.0: # %entry
188-
; CHECK-NEXT: plfd f0, .LCPI11_0@PCREL(0), 1
196+
; CHECK-NEXT: xxsplti32dx vs0, 0, 1074446467
197+
; CHECK-NEXT: xxsplti32dx vs0, 1, 309237645
189198
; CHECK-NEXT: xsadddp f0, f1, f0
190-
; CHECK-NEXT: plfd f1, .LCPI11_1@PCREL(0), 1
199+
; CHECK-NEXT: xxsplti32dx vs1, 0, 1073922179
200+
; CHECK-NEXT: xxsplti32dx vs1, 1, 309237645
191201
; CHECK-NEXT: xsadddp f1, f0, f1
192202
; CHECK-NEXT: blr
193203
;
@@ -212,11 +222,15 @@ define double @two_constants_two_bb(i32 %m, double %a) {
212222
; CHECK-NEXT: cmplwi r3, 0
213223
; CHECK-NEXT: beq cr0, .LBB12_2
214224
; CHECK-NEXT: # %bb.1:
215-
; CHECK-NEXT: plfd f1, .LCPI12_0@PCREL(0), 1
225+
; CHECK-NEXT: xxsplti32dx vs1, 0, 1074935889
226+
; CHECK-NEXT: xxsplti32dx vs1, 1, -343597384
227+
; CHECK-NEXT: # kill: def $f1 killed $f1 killed $vsl1
216228
; CHECK-NEXT: blr
217229
; CHECK-NEXT: .LBB12_2: # %if.end
218-
; CHECK-NEXT: plfd f0, .LCPI12_1@PCREL(0), 1
230+
; CHECK-NEXT: xxsplti32dx vs0, 0, 1076085391
231+
; CHECK-NEXT: xxsplti32dx vs0, 1, 1546188227
219232
; CHECK-NEXT: xsadddp f1, f1, f0
233+
; CHECK-NEXT: # kill: def $f1 killed $f1 killed $vsl1
220234
; CHECK-NEXT: blr
221235
;
222236
; CHECK-P9-LABEL: two_constants_two_bb:
@@ -248,11 +262,14 @@ return:
248262
define double @three_constants_f64(double %a, double %c) {
249263
; CHECK-LABEL: three_constants_f64:
250264
; CHECK: # %bb.0: # %entry
251-
; CHECK-NEXT: plfd f0, .LCPI13_0@PCREL(0), 1
265+
; CHECK-NEXT: xxsplti32dx vs0, 0, 1074446467
266+
; CHECK-NEXT: xxsplti32dx vs0, 1, 309237645
252267
; CHECK-NEXT: xsadddp f0, f1, f0
253-
; CHECK-NEXT: plfd f1, .LCPI13_1@PCREL(0), 1
268+
; CHECK-NEXT: xxsplti32dx vs1, 0, 1073922179
269+
; CHECK-NEXT: xxsplti32dx vs1, 1, 309237645
254270
; CHECK-NEXT: xsadddp f0, f0, f1
255-
; CHECK-NEXT: plfd f1, .LCPI13_2@PCREL(0), 1
271+
; CHECK-NEXT: xxsplti32dx vs1, 0, 1073948393
272+
; CHECK-NEXT: xxsplti32dx vs1, 1, 2027224564
256273
; CHECK-NEXT: xsadddp f1, f0, f1
257274
; CHECK-NEXT: blr
258275
;
@@ -340,21 +357,26 @@ entry:
340357

341358
define ppc_fp128 @three_constants_ppcf128(ppc_fp128 %a, ppc_fp128 %c) {
342359
; CHECK-LABEL: three_constants_ppcf128:
343-
; CHECK: .localentry three_constants_ppcf128, 1
344-
; CHECK-NEXT: # %bb.0: # %entry
360+
; CHECK: # %bb.0: # %entry
345361
; CHECK-NEXT: mflr r0
346362
; CHECK-NEXT: std r0, 16(r1)
347363
; CHECK-NEXT: stdu r1, -32(r1)
348364
; CHECK-NEXT: .cfi_def_cfa_offset 32
349365
; CHECK-NEXT: .cfi_offset lr, 16
350-
; CHECK-NEXT: plfd f3, .LCPI16_0@PCREL(0), 1
351-
; CHECK-NEXT: xxlxor f4, f4, f4
366+
; CHECK-DAG: xxlxor f4, f4, f4
367+
; CHECK-DAG: xxsplti32dx vs3, 0, 1074935889
368+
; CHECK-NEXT: xxsplti32dx vs3, 1, -343597384
369+
; CHECK-NEXT: # kill: def $f3 killed $f3 killed $vsl3
352370
; CHECK-NEXT: bl __gcc_qadd@notoc
353-
; CHECK-NEXT: plfd f3, .LCPI16_1@PCREL(0), 1
354-
; CHECK-NEXT: xxlxor f4, f4, f4
371+
; CHECK-DAG: xxlxor f4, f4, f4
372+
; CHECK-DAG: xxsplti32dx vs3, 0, 1074935889
373+
; CHECK-NEXT: xxsplti32dx vs3, 1, -1719329096
374+
; CHECK-NEXT: # kill: def $f3 killed $f3 killed $vsl3
355375
; CHECK-NEXT: bl __gcc_qadd@notoc
356-
; CHECK-NEXT: plfd f3, .LCPI16_2@PCREL(0), 1
357-
; CHECK-NEXT: xxlxor f4, f4, f4
376+
; CHECK-DAG: xxlxor f4, f4, f4
377+
; CHECK-DAG: xxsplti32dx vs3, 0, 1074935889
378+
; CHECK-NEXT: xxsplti32dx vs3, 1, 8724152
379+
; CHECK-NEXT: # kill: def $f3 killed $f3 killed $vsl3
358380
; CHECK-NEXT: bl __gcc_qadd@notoc
359381
; CHECK-NEXT: addi r1, r1, 32
360382
; CHECK-NEXT: ld r0, 16(r1)

‎llvm/test/CodeGen/PowerPC/p10-splatImm-CPload-pcrel.ll

+36-18
Original file line numberDiff line numberDiff line change
@@ -122,19 +122,23 @@ entry:
122122
define dso_local double @testDoubleNonRepresentableScalar() local_unnamed_addr {
123123
; CHECK-LE-LABEL: testDoubleNonRepresentableScalar:
124124
; CHECK-LE: # %bb.0: # %entry
125-
; CHECK-LE-NEXT: plfd f1, .LCPI3_0@PCREL(0), 1
125+
; CHECK-LE-NEXT: xxsplti32dx vs1, 0, 1081435463
126+
; CHECK-LE-NEXT: xxsplti32dx vs1, 1, -1374389535
127+
; CHECK-LE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
126128
; CHECK-LE-NEXT: blr
127129
;
128130
; CHECK-NOPCREL-BE-LABEL: testDoubleNonRepresentableScalar:
129131
; CHECK-NOPCREL-BE: # %bb.0: # %entry
130-
; CHECK-NOPCREL-BE-NEXT: addis r3, r2, .LCPI3_0@toc@ha
131-
; CHECK-NOPCREL-BE-NEXT: lfd f1, .LCPI3_0@toc@l(r3)
132+
; CHECK-NOPCREL-BE-NEXT: xxsplti32dx vs1, 0, 1081435463
133+
; CHECK-NOPCREL-BE-NEXT: xxsplti32dx vs1, 1, -1374389535
134+
; CHECK-NOPCREL-BE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
132135
; CHECK-NOPCREL-BE-NEXT: blr
133136
;
134137
; CHECK-NOPCREL-LE-LABEL: testDoubleNonRepresentableScalar:
135138
; CHECK-NOPCREL-LE: # %bb.0: # %entry
136-
; CHECK-NOPCREL-LE-NEXT: addis r3, r2, .LCPI3_0@toc@ha
137-
; CHECK-NOPCREL-LE-NEXT: lfd f1, .LCPI3_0@toc@l(r3)
139+
; CHECK-NOPCREL-LE-NEXT: xxsplti32dx vs1, 0, 1081435463
140+
; CHECK-NOPCREL-LE-NEXT: xxsplti32dx vs1, 1, -1374389535
141+
; CHECK-NOPCREL-LE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
138142
; CHECK-NOPCREL-LE-NEXT: blr
139143
;
140144
; CHECK-NOPREFIX-LABEL: testDoubleNonRepresentableScalar:
@@ -145,7 +149,9 @@ define dso_local double @testDoubleNonRepresentableScalar() local_unnamed_addr {
145149
;
146150
; CHECK-BE-LABEL: testDoubleNonRepresentableScalar:
147151
; CHECK-BE: # %bb.0: # %entry
148-
; CHECK-BE-NEXT: plfd f1, .LCPI3_0@PCREL(0), 1
152+
; CHECK-BE-NEXT: xxsplti32dx vs1, 0, 1081435463
153+
; CHECK-BE-NEXT: xxsplti32dx vs1, 1, -1374389535
154+
; CHECK-BE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
149155
; CHECK-BE-NEXT: blr
150156
entry:
151157
ret double 3.423300e+02
@@ -154,19 +160,23 @@ entry:
154160
define dso_local float @testFloatDenormScalar() local_unnamed_addr {
155161
; CHECK-LE-LABEL: testFloatDenormScalar:
156162
; CHECK-LE: # %bb.0: # %entry
157-
; CHECK-LE-NEXT: plfs f1, .LCPI4_0@PCREL(0), 1
163+
; CHECK-LE-NEXT: xxsplti32dx vs1, 0, 0
164+
; CHECK-LE-NEXT: xxsplti32dx vs1, 1, 7136238
165+
; CHECK-LE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
158166
; CHECK-LE-NEXT: blr
159167
;
160168
; CHECK-NOPCREL-BE-LABEL: testFloatDenormScalar:
161169
; CHECK-NOPCREL-BE: # %bb.0: # %entry
162-
; CHECK-NOPCREL-BE-NEXT: addis r3, r2, .LCPI4_0@toc@ha
163-
; CHECK-NOPCREL-BE-NEXT: lfs f1, .LCPI4_0@toc@l(r3)
170+
; CHECK-NOPCREL-BE-NEXT: xxsplti32dx vs1, 0, 0
171+
; CHECK-NOPCREL-BE-NEXT: xxsplti32dx vs1, 1, 7136238
172+
; CHECK-NOPCREL-BE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
164173
; CHECK-NOPCREL-BE-NEXT: blr
165174
;
166175
; CHECK-NOPCREL-LE-LABEL: testFloatDenormScalar:
167176
; CHECK-NOPCREL-LE: # %bb.0: # %entry
168-
; CHECK-NOPCREL-LE-NEXT: addis r3, r2, .LCPI4_0@toc@ha
169-
; CHECK-NOPCREL-LE-NEXT: lfs f1, .LCPI4_0@toc@l(r3)
177+
; CHECK-NOPCREL-LE-NEXT: xxsplti32dx vs1, 0, 0
178+
; CHECK-NOPCREL-LE-NEXT: xxsplti32dx vs1, 1, 7136238
179+
; CHECK-NOPCREL-LE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
170180
; CHECK-NOPCREL-LE-NEXT: blr
171181
;
172182
; CHECK-NOPREFIX-LABEL: testFloatDenormScalar:
@@ -177,7 +187,9 @@ define dso_local float @testFloatDenormScalar() local_unnamed_addr {
177187
;
178188
; CHECK-BE-LABEL: testFloatDenormScalar:
179189
; CHECK-BE: # %bb.0: # %entry
180-
; CHECK-BE-NEXT: plfs f1, .LCPI4_0@PCREL(0), 1
190+
; CHECK-BE-NEXT: xxsplti32dx vs1, 0, 0
191+
; CHECK-BE-NEXT: xxsplti32dx vs1, 1, 7136238
192+
; CHECK-BE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
181193
; CHECK-BE-NEXT: blr
182194
entry:
183195
ret float 0x380B38FB80000000
@@ -186,19 +198,23 @@ entry:
186198
define dso_local double @testFloatDenormToDoubleScalar() local_unnamed_addr {
187199
; CHECK-LE-LABEL: testFloatDenormToDoubleScalar:
188200
; CHECK-LE: # %bb.0: # %entry
189-
; CHECK-LE-NEXT: plfs f1, .LCPI5_0@PCREL(0), 1
201+
; CHECK-LE-NEXT: xxsplti32dx vs1, 0, 940259579
202+
; CHECK-LE-NEXT: xxsplti32dx vs1, 1, -2147483648
203+
; CHECK-LE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
190204
; CHECK-LE-NEXT: blr
191205
;
192206
; CHECK-NOPCREL-BE-LABEL: testFloatDenormToDoubleScalar:
193207
; CHECK-NOPCREL-BE: # %bb.0: # %entry
194-
; CHECK-NOPCREL-BE-NEXT: addis r3, r2, .LCPI5_0@toc@ha
195-
; CHECK-NOPCREL-BE-NEXT: lfs f1, .LCPI5_0@toc@l(r3)
208+
; CHECK-NOPCREL-BE-NEXT: xxsplti32dx vs1, 0, 940259579
209+
; CHECK-NOPCREL-BE-NEXT: xxsplti32dx vs1, 1, -2147483648
210+
; CHECK-NOPCREL-BE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
196211
; CHECK-NOPCREL-BE-NEXT: blr
197212
;
198213
; CHECK-NOPCREL-LE-LABEL: testFloatDenormToDoubleScalar:
199214
; CHECK-NOPCREL-LE: # %bb.0: # %entry
200-
; CHECK-NOPCREL-LE-NEXT: addis r3, r2, .LCPI5_0@toc@ha
201-
; CHECK-NOPCREL-LE-NEXT: lfs f1, .LCPI5_0@toc@l(r3)
215+
; CHECK-NOPCREL-LE-NEXT: xxsplti32dx vs1, 0, 940259579
216+
; CHECK-NOPCREL-LE-NEXT: xxsplti32dx vs1, 1, -2147483648
217+
; CHECK-NOPCREL-LE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
202218
; CHECK-NOPCREL-LE-NEXT: blr
203219
;
204220
; CHECK-NOPREFIX-LABEL: testFloatDenormToDoubleScalar:
@@ -209,7 +225,9 @@ define dso_local double @testFloatDenormToDoubleScalar() local_unnamed_addr {
209225
;
210226
; CHECK-BE-LABEL: testFloatDenormToDoubleScalar:
211227
; CHECK-BE: # %bb.0: # %entry
212-
; CHECK-BE-NEXT: plfs f1, .LCPI5_0@PCREL(0), 1
228+
; CHECK-BE-NEXT: xxsplti32dx vs1, 0, 940259579
229+
; CHECK-BE-NEXT: xxsplti32dx vs1, 1, -2147483648
230+
; CHECK-BE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
213231
; CHECK-BE-NEXT: blr
214232
entry:
215233
ret double 0x380B38FB80000000

‎llvm/test/CodeGen/PowerPC/pcrel-call-linkage-leaf.ll

+3-1
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,9 @@ define dso_local double @UsesX2AsConstPoolTOC() local_unnamed_addr {
173173
; CHECK-LARGE: add r2, r2, r12
174174
; CHECK-S-NOT: .localentry
175175
; CHECK-ALL: # %bb.0: # %entry
176-
; CHECK-S-NEXT: plfd f1, .LCPI7_0@PCREL(0), 1
176+
; CHECK-S-NEXT: xxsplti32dx vs1, 0, 1078011044
177+
; CHECK-S-NEXT: xxsplti32dx vs1, 1, -337824948
178+
; CHECK-S-NEXT: # kill: def $f1 killed $f1 killed $vsl1
177179
; CHECK-S-NEXT: blr
178180
entry:
179181
ret double 0x404124A4EBDD334C

0 commit comments

Comments
 (0)