[llvm] r321091 - [GlobalISel][Legalizer] Fix crash when trying to lower G_FNEG of fp128 types.

Amara Emerson via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 19 09:21:35 PST 2017


Author: aemerson
Date: Tue Dec 19 09:21:35 2017
New Revision: 321091

URL: http://llvm.org/viewvc/llvm-project?rev=321091&view=rev
Log:
[GlobalISel][Legalizer] Fix crash when trying to lower G_FNEG of fp128 types.

This doesn't add legalizer support, just prevents crashing so that we
can gracefully fall back to SDAG.

Fixes PR35690.

Added:
    llvm/trunk/test/CodeGen/AArch64/GlobalISel/fp128-legalize-crash-pr35690.mir
Modified:
    llvm/trunk/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Modified: llvm/trunk/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/GlobalISel/LegalizerHelper.cpp?rev=321091&r1=321090&r2=321091&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/GlobalISel/LegalizerHelper.cpp (original)
+++ llvm/trunk/lib/CodeGen/GlobalISel/LegalizerHelper.cpp Tue Dec 19 09:21:35 2017
@@ -835,6 +835,9 @@ LegalizerHelper::lower(MachineInstr &MI,
     case 64:
       ZeroTy = Type::getDoubleTy(Ctx);
       break;
+    case 128:
+      ZeroTy = Type::getFP128Ty(Ctx);
+      break;
     default:
       llvm_unreachable("unexpected floating-point type");
     }

Added: llvm/trunk/test/CodeGen/AArch64/GlobalISel/fp128-legalize-crash-pr35690.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/fp128-legalize-crash-pr35690.mir?rev=321091&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/GlobalISel/fp128-legalize-crash-pr35690.mir (added)
+++ llvm/trunk/test/CodeGen/AArch64/GlobalISel/fp128-legalize-crash-pr35690.mir Tue Dec 19 09:21:35 2017
@@ -0,0 +1,44 @@
+# RUN: llc -O0 -run-pass=legalizer -global-isel -global-isel-abort=0 %s -o - | FileCheck %s
+--- |
+  target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
+  target triple = "aarch64"
+  
+  define fp128 @x(fp128 %a) {
+  entry:
+    %a.addr = alloca fp128, align 16
+    store fp128 %a, fp128* %a.addr, align 16
+    %0 = load fp128, fp128* %a.addr, align 16
+    %sub = fsub fp128 0xL00000000000000008000000000000000, %0
+    ret fp128 %sub
+  }
+  
+...
+---
+name:            x
+alignment:       2
+exposesReturnsTwice: false
+legalized:       false
+regBankSelected: false
+selected:        false
+tracksRegLiveness: true
+fixedStack:      
+stack:           
+  - { id: 0, name: a.addr, type: default, offset: 0, size: 16, alignment: 16, 
+      stack-id: 0, callee-saved-register: '', callee-saved-restored: true, 
+      di-variable: '', di-expression: '', di-location: '' }
+body:             |
+  bb.1.entry:
+    liveins: %q0
+
+    ; This test just checks we don't crash on G_FNEG of FP128 types. Expect to fall
+    ; back until support is added for fp128.
+    ; CHECK: ret
+    %0:_(s128) = COPY %q0
+    %1:_(p0) = G_FRAME_INDEX %stack.0.a.addr
+    G_STORE %0(s128), %1(p0) :: (store 16 into %ir.a.addr)
+    %2:_(s128) = G_LOAD %1(p0) :: (load 16 from %ir.a.addr)
+    %3:_(s128) = G_FNEG %2
+    %q0 = COPY %3(s128)
+    RET_ReallyLR implicit %q0
+
+...




More information about the llvm-commits mailing list