]> granicus.if.org Git - llvm/commitdiff
[x86] change free truncate hook to handle only simple types (PR42880)
authorSanjay Patel <spatel@rotateright.com>
Sat, 3 Aug 2019 21:46:27 +0000 (21:46 +0000)
committerSanjay Patel <spatel@rotateright.com>
Sat, 3 Aug 2019 21:46:27 +0000 (21:46 +0000)
This avoids the crash from:
https://bugs.llvm.org/show_bug.cgi?id=42880
...and I think it's a proper constraint for the TLI hook.

But that example raises questions about what happens to get us
into this situation (created i29 types) and what happens later
(why does legalization die on those types), so I'm not sure if
we will resolve the bug based on this change.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@367766 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/shift-combine.ll

index ee25603a72f47b750478cb0cab8abd355f50d3bf..fd0fc1c0beaa8cb7a75761c39f5c70a7398e58ba 100644 (file)
@@ -28842,6 +28842,8 @@ bool X86TargetLowering::isLegalStoreImmediate(int64_t Imm) const {
 bool X86TargetLowering::isTruncateFree(EVT VT1, EVT VT2) const {
   if (!VT1.isInteger() || !VT2.isInteger())
     return false;
+  if (!VT1.isSimple() || !VT2.isSimple())
+    return false;
   unsigned NumBits1 = VT1.getSizeInBits();
   unsigned NumBits2 = VT2.getSizeInBits();
   return NumBits1 > NumBits2;
index d61838f2f1c5f83e263faa5a6af46cf13528d32a..0dece32fb1f436e09c839410e460046f45b0b887 100644 (file)
@@ -387,3 +387,36 @@ define i32 @ashr_add_shl_i32_i8_extra_use3(i32 %r, i32* %p1, i32* %p2) nounwind
   %conv1 = ashr i32 %sext, 24
   ret i32 %conv1
 }
+
+%"class.QPainterPath" = type { double, double, i32 }
+
+define void @PR42880(i32 %t0) {
+; X32-LABEL: PR42880:
+; X32:       # %bb.0:
+; X32-NEXT:    xorl %eax, %eax
+; X32-NEXT:    testb %al, %al
+; X32-NEXT:    je .LBB16_1
+; X32-NEXT:  # %bb.2: # %if
+; X32-NEXT:  .LBB16_1: # %then
+;
+; X64-LABEL: PR42880:
+; X64:       # %bb.0:
+; X64-NEXT:    xorl %eax, %eax
+; X64-NEXT:    testb %al, %al
+; X64-NEXT:    je .LBB16_1
+; X64-NEXT:  # %bb.2: # %if
+; X64-NEXT:  .LBB16_1: # %then
+  %sub = add nsw i32 %t0, -1
+  %add.ptr.i94 = getelementptr inbounds %"class.QPainterPath", %"class.QPainterPath"* null, i32 %sub
+  %x = ptrtoint %"class.QPainterPath"* %add.ptr.i94 to i32
+  %sub2 = sub i32 %x, 0
+  %div = sdiv exact i32 %sub2, 24
+  br i1 undef, label %if, label %then
+
+then:
+  %t1 = xor i32 %div, -1
+  unreachable
+
+if:
+  unreachable
+}