Index: lib/Target/PowerPC/PPCISelDAGToDAG.cpp =================================================================== --- lib/Target/PowerPC/PPCISelDAGToDAG.cpp +++ lib/Target/PowerPC/PPCISelDAGToDAG.cpp @@ -3951,6 +3951,13 @@ return isIntS16Immediate(AddrOp.getOperand(1), Imm) && !(Imm % Val); } + // If the address is a frame object without offset, we need to check + // the object alignment as we do for a frame index + offset above. + if (FrameIndexSDNode *FI = dyn_cast(AddrOp)) { + const MachineFrameInfo &MFI = CurDAG->getMachineFunction().getFrameInfo(); + return MFI.getObjectAlignment(FI->getIndex()) % Val == 0; + } + // If the address comes from the outside, the offset will be zero. return AddrOp.getOpcode() == ISD::CopyFromReg; } Index: test/CodeGen/PowerPC/vsx-p9.ll =================================================================== --- test/CodeGen/PowerPC/vsx-p9.ll +++ test/CodeGen/PowerPC/vsx-p9.ll @@ -411,3 +411,34 @@ } declare void @sink(...) + +; stack object should be accessed using D-form load/store instead of X-form +define signext i32 @func1() { +; CHECK-LABEL: @func1 +; CHECK-NOT: stxvx +; CHECK: blr +entry: + %a = alloca [4 x i32], align 4 + %0 = bitcast [4 x i32]* %a to i8* + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %0, i8 0, i64 16, i1 false) + %arraydecay = getelementptr inbounds [4 x i32], [4 x i32]* %a, i64 0, i64 0 + %call = call signext i32 @callee(i32* nonnull %arraydecay) #3 + ret i32 %call +} + +; stack object should be accessed using D-form load/store instead of X-form +define signext i32 @func2() { +; CHECK-LABEL: @func2 +; CHECK-NOT: stxvx +; CHECK: blr +entry: + %a = alloca [16 x i32], align 4 + %0 = bitcast [16 x i32]* %a to i8* + call void @llvm.memset.p0i8.i64(i8* nonnull align 4 %0, i8 0, i64 64, i1 false) + %arraydecay = getelementptr inbounds [16 x i32], [16 x i32]* %a, i64 0, i64 0 + %call = call signext i32 @callee(i32* nonnull %arraydecay) #3 + ret i32 %call +} + +declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1) #1 +declare signext i32 @callee(i32*) local_unnamed_addr #2