[PATCH] D27154: [CodeGen] Fix result type for SMULO/UMULO legalization
Vadzim Dambrouski via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Nov 27 16:24:01 PST 2016
pftbest created this revision.
pftbest added a reviewer: asl.
pftbest added a subscriber: llvm-commits.
On some platforms (like MSP430) the second element of the result
structure for SMULO/UMULO may have a shorter type than the one
returned by SetCC. We need to truncate it to the right type, or
else some incorrect code may be generated later on.
This fixes issue https://github.com/rust-lang/rust/issues/37829
https://reviews.llvm.org/D27154
Files:
lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
test/CodeGen/MSP430/umulo-16.ll
Index: test/CodeGen/MSP430/umulo-16.ll
===================================================================
--- /dev/null
+++ test/CodeGen/MSP430/umulo-16.ll
@@ -0,0 +1,32 @@
+; RUN: llc < %s -march=msp430 | FileCheck %s
+target datalayout = "e-m:e-p:16:16-i32:16:32-a:16-n8:16"
+target triple = "msp430"
+
+define void @foo(i16 %arg) unnamed_addr {
+entry-block:
+ br i1 undef, label %bb2, label %bb3
+
+bb2: ; preds = %entry-block
+ unreachable
+
+bb3: ; preds = %entry-block
+ %0 = call { i16, i1 } @llvm.umul.with.overflow.i16(i16 undef, i16 %arg)
+; CHECK: call
+ %1 = extractvalue { i16, i1 } %0, 1
+ %2 = call i1 @llvm.expect.i1(i1 %1, i1 false)
+ br i1 %2, label %panic, label %bb5
+
+bb5: ; preds = %bb3
+ unreachable
+
+panic: ; preds = %bb3
+ unreachable
+}
+
+; Function Attrs: nounwind readnone
+declare i1 @llvm.expect.i1(i1, i1) #0
+
+; Function Attrs: nounwind readnone
+declare { i16, i1 } @llvm.umul.with.overflow.i16(i16, i16) #0
+
+attributes #0 = { nounwind readnone }
Index: lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
===================================================================
--- lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -3515,6 +3515,11 @@
TopHalf = DAG.getSetCC(dl, getSetCCResultType(VT), TopHalf,
DAG.getConstant(0, dl, VT), ISD::SETNE);
}
+
+ // Truncate the result if SetCC returns a larger type than needed.
+ EVT RVT = Node->getValueType(1);
+ TopHalf = DAG.getNode(ISD::TRUNCATE, dl, RVT, TopHalf);
+
Results.push_back(BottomHalf);
Results.push_back(TopHalf);
break;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D27154.79363.patch
Type: text/x-patch
Size: 1805 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161128/72a7c160/attachment.bin>
More information about the llvm-commits
mailing list