diff options
author | Michael Kuperstein <michael.kuperstein@gmail.com> | 2016-03-04 21:23:29 +0000 |
---|---|---|
committer | Michael Kuperstein <michael.kuperstein@gmail.com> | 2016-03-04 21:23:29 +0000 |
commit | b89f0fa2a2853e14a989d30bb8789b5815462d1a (patch) | |
tree | e140b30d513bb2c6f5fb77279fc243b33b612d56 | |
parent | 5d07531d0235f4ea8e497c2b11f4cbd9ab09680d (diff) | |
download | bcm5719-llvm-b89f0fa2a2853e14a989d30bb8789b5815462d1a.tar.gz bcm5719-llvm-b89f0fa2a2853e14a989d30bb8789b5815462d1a.zip |
[DAGCombine] Fix divrem combine not to assume div/rem type is simple.
The divrem combine assumed the type of the div/rem is simple, which isn't
necessarily true. This probably worked fine until r250825, since it only
saw legal types, but now breaks when it runs as a pre-type-legalization
combine.
This fixes PR26835.
Differential Revision: http://reviews.llvm.org/D17878
llvm-svn: 262746
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 5 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/pr26835.ll | 10 |
2 files changed, 14 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index dfae183723f..36af244c2b8 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -2138,7 +2138,10 @@ SDValue DAGCombiner::visitMUL(SDNode *N) { static bool isDivRemLibcallAvailable(SDNode *Node, bool isSigned, const TargetLowering &TLI) { RTLIB::Libcall LC; - switch (Node->getSimpleValueType(0).SimpleTy) { + EVT NodeType = Node->getValueType(0); + if (!NodeType.isSimple()) + return false; + switch (NodeType.getSimpleVT().SimpleTy) { default: return false; // No libcall for vector types. case MVT::i8: LC= isSigned ? RTLIB::SDIVREM_I8 : RTLIB::UDIVREM_I8; break; case MVT::i16: LC= isSigned ? RTLIB::SDIVREM_I16 : RTLIB::UDIVREM_I16; break; diff --git a/llvm/test/CodeGen/X86/pr26835.ll b/llvm/test/CodeGen/X86/pr26835.ll new file mode 100644 index 00000000000..4fc73b88575 --- /dev/null +++ b/llvm/test/CodeGen/X86/pr26835.ll @@ -0,0 +1,10 @@ +; RUN: llc < %s | FileCheck %s +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-pc-linux" + +; CHECK-LABEL: foo +; CHECK: div +define i24 @foo(i24 %a, i24 %b) { + %r = urem i24 %a, %b + ret i24 %r +} |