[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