https://bugs.llvm.org/show_bug.cgi?id=32063
Bug ID: 32063
Summary: [ppc] wrong code generated for bswap(int32) and
followed by store16
Product: libraries
Version: trunk
Hardware: PC
OS: Linux
Status: NEW
Severity: enhancement
Priority: P
Component: Backend: PowerPC
Assignee: [email protected]
Reporter: [email protected]
CC: [email protected]
Compile the following code with options -m64 -O2 -mvsx -mcpu=power8
typedef unsigned int uint32_t;
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
struct blah {
uint16_t f1;
uint8_t f2;
};
void foo(uint32_t v, struct blah *p) {
unsigned int __bsx = v;
p->f1 = (((__bsx & 0xff000000u) >> 24) | ((__bsx & 0x00ff0000u) >> 8) |
((__bsx & 0x0000ff00u) << 8) | ((__bsx & 0x000000ffu) << 24)) & 0xffff;
}
LLVM generates
foo: # @foo
.Lfunc_begin0:
# BB#0: # %entry
rlwinm 3, 3, 0, 0, 15
stwbrx 3, 0, 4
blr
The source code stores a 16bit value, the generated code stores 32bit value.
The problem is in function PPCTargetLowering::PerformDAGCombine, when it
detects a case
bswap
store
It transform it to PPCISD::STBRX, but it doesn't consider the case that the
operand size of bswap may be larger than store size. When it occurs, we need 2
modifications,
1 For the last operand of PPCISD::STBRX, we should not use
DAG.getValueType(N->getOperand(1).getValueType()), instead we should use
cast<StoreSDNode>(N)->getMemoryVT().
2 Before PPCISD::STBRX, we need to shift the original operand of bswap to the
right side.
--
You are receiving this mail because:
You are on the CC list for the bug._______________________________________________
llvm-bugs mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs