Skip to content

Commit c7be067

Browse files
Yi-Hong LyuYi-Hong Lyu
Yi-Hong Lyu
authored and
Yi-Hong Lyu
committedOct 2, 2019
[PowerPC] Fix SH field overflow issue
Store rlwinm Rx, Ry, 32, 0, 31 as rlwinm Rx, Ry, 0, 0, 31 and store rldicl Rx, Ry, 64, 0 as rldicl Rx, Ry, 0, 0. Otherwise SH field is overflow and fails assertion in assembly printing stage. Differential Revision: https://reviews.llvm.org/D66991 llvm-svn: 373519
1 parent e55c442 commit c7be067

File tree

2 files changed

+66
-4
lines changed

2 files changed

+66
-4
lines changed
 

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

+8-4
Original file line numberDiff line numberDiff line change
@@ -3571,16 +3571,20 @@ bool PPCInstrInfo::transformToImmFormFedByLI(MachineInstr &MI,
35713571
} else {
35723572
// The 32 bit and 64 bit instructions are quite different.
35733573
if (SpecialShift32) {
3574-
// Left shifts use (N, 0, 31-N), right shifts use (32-N, N, 31).
3575-
uint64_t SH = RightShift ? 32 - ShAmt : ShAmt;
3574+
// Left shifts use (N, 0, 31-N).
3575+
// Right shifts use (32-N, N, 31) if 0 < N < 32.
3576+
// use (0, 0, 31) if N == 0.
3577+
uint64_t SH = ShAmt == 0 ? 0 : RightShift ? 32 - ShAmt : ShAmt;
35763578
uint64_t MB = RightShift ? ShAmt : 0;
35773579
uint64_t ME = RightShift ? 31 : 31 - ShAmt;
35783580
replaceInstrOperandWithImm(MI, III.OpNoForForwarding, SH);
35793581
MachineInstrBuilder(*MI.getParent()->getParent(), MI).addImm(MB)
35803582
.addImm(ME);
35813583
} else {
3582-
// Left shifts use (N, 63-N), right shifts use (64-N, N).
3583-
uint64_t SH = RightShift ? 64 - ShAmt : ShAmt;
3584+
// Left shifts use (N, 63-N).
3585+
// Right shifts use (64-N, N) if 0 < N < 64.
3586+
// use (0, 0) if N == 0.
3587+
uint64_t SH = ShAmt == 0 ? 0 : RightShift ? 64 - ShAmt : ShAmt;
35843588
uint64_t ME = RightShift ? ShAmt : 63 - ShAmt;
35853589
replaceInstrOperandWithImm(MI, III.OpNoForForwarding, SH);
35863590
MachineInstrBuilder(*MI.getParent()->getParent(), MI).addImm(ME);
+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# RUN: llc -O3 -mtriple=powerpc64le-unknown-linux-gnu -start-after ppc-mi-peepholes -ppc-late-peephole -ppc-asm-full-reg-names -verify-machineinstrs %s -o - | FileCheck %s
2+
3+
---
4+
name: special_right_shift32_0
5+
alignment: 2
6+
tracksRegLiveness: true
7+
registers:
8+
- { id: 0, class: gprc }
9+
- { id: 1, class: gprc }
10+
- { id: 2, class: gprc }
11+
liveins:
12+
- { reg: '$r3', virtual-reg: '%0' }
13+
machineFunctionInfo: {}
14+
body: |
15+
bb.0.entry:
16+
liveins: $r3
17+
18+
; Ensure we do not attempt to transform this into srwi $r3, $r3, 0 in the
19+
; form specified by ISA 3.0b (rlwinm $r3, $r3, 32 - 0, 0, 31)
20+
21+
; CHECK-LABEL: special_right_shift32_0:
22+
; CHECK: slwi r[[#]], r[[#]], 0
23+
24+
%0:gprc = COPY killed $r3
25+
%1:gprc = LI 0
26+
%2:gprc = SRW killed %0, killed %1
27+
$r3 = COPY killed %2
28+
BLR implicit $lr, implicit $rm, implicit killed $r3
29+
30+
...
31+
---
32+
name: special_right_shift64_0
33+
alignment: 2
34+
tracksRegLiveness: true
35+
registers:
36+
- { id: 0, class: g8rc }
37+
- { id: 1, class: gprc }
38+
- { id: 2, class: g8rc }
39+
liveins:
40+
- { reg: '$x3', virtual-reg: '%0' }
41+
machineFunctionInfo: {}
42+
body: |
43+
bb.0.entry:
44+
liveins: $x3
45+
46+
; Ensure we do not attempt to transform this into srdi $r3, $r3, 0 in the
47+
; form specified by ISA 3.0b (rldicl $r3, $r3, 64 - 0, 0)
48+
49+
; CHECK-LABEL: special_right_shift64_0:
50+
; CHECK: rotldi r[[#]], r[[#]], 0
51+
52+
%0:g8rc = COPY killed $x3
53+
%1:gprc = LI 0
54+
%2:g8rc = SRD killed %0, killed %1
55+
$x3 = COPY killed %2
56+
BLR8 implicit $lr8, implicit $rm, implicit killed $x3
57+
58+
...

0 commit comments

Comments
 (0)
Please sign in to comment.