From 775294d1833592121e6ff3495a903d407f28aecb Mon Sep 17 00:00:00 2001 From: Hal Finkel Date: Tue, 23 Dec 2014 08:38:50 +0000 Subject: [PATCH] [PowerPC] Don't attempt a 64-bit pow2 division on PPC32 In r224033, in moving the signed power-of-2 division expansion into BuildSDIVPow2, I accidentally made it possible to attempt the lowering for a 64-bit division on PPC32. This later asserts. Fixes PR21928. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@224758 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/PowerPC/PPCISelLowering.cpp | 2 ++ test/CodeGen/PowerPC/sdiv-pow2.ll | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/lib/Target/PowerPC/PPCISelLowering.cpp b/lib/Target/PowerPC/PPCISelLowering.cpp index 62c1f714e9d..18384627ced 100644 --- a/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/lib/Target/PowerPC/PPCISelLowering.cpp @@ -8966,6 +8966,8 @@ PPCTargetLowering::BuildSDIVPow2(SDNode *N, const APInt &Divisor, std::vector *Created) const { // fold (sdiv X, pow2) EVT VT = N->getValueType(0); + if (VT == MVT::i64 && !Subtarget.isPPC64()) + return SDValue(); if ((VT != MVT::i32 && VT != MVT::i64) || !(Divisor.isPowerOf2() || (-Divisor).isPowerOf2())) return SDValue(); diff --git a/test/CodeGen/PowerPC/sdiv-pow2.ll b/test/CodeGen/PowerPC/sdiv-pow2.ll index c6330a6807a..5ec019dfb4a 100644 --- a/test/CodeGen/PowerPC/sdiv-pow2.ll +++ b/test/CodeGen/PowerPC/sdiv-pow2.ll @@ -1,4 +1,5 @@ ; RUN: llc -mcpu=ppc64 < %s | FileCheck %s +; RUN: llc -mtriple=powerpc-unknown-linux-gnu -mcpu=ppc < %s | FileCheck -check-prefix=CHECK-32 %s target datalayout = "E-m:e-i64:64-n32:64" target triple = "powerpc64-unknown-linux-gnu" @@ -25,6 +26,10 @@ entry: ; CHECK: sradi [[REG1:[0-9]+]], 3, 3 ; CHECK: addze 3, [[REG1]] ; CHECK: blr + +; CHECK-32-LABEL @foo8 +; CHECK-32-NOT: sradi +; CHECK-32: blr } ; Function Attrs: nounwind readnone @@ -52,6 +57,10 @@ entry: ; CHECK: addze [[REG2:[0-9]+]], [[REG1]] ; CHECK: neg 3, [[REG2]] ; CHECK: blr + +; CHECK-32-LABEL @foo8n +; CHECK-32-NOT: sradi +; CHECK-32: blr } attributes #0 = { nounwind readnone }