[llvm] r319144 - [WebAssembly] Handle errors better in fast-isel.

Dan Gohman via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 27 21:36:42 PST 2017


Author: djg
Date: Mon Nov 27 21:36:42 2017
New Revision: 319144

URL: http://llvm.org/viewvc/llvm-project?rev=319144&view=rev
Log:
[WebAssembly] Handle errors better in fast-isel.

Fast-isel routines need to bail out in the case that fast-isel
fails on the operands.

This fixes https://bugs.llvm.org/show_bug.cgi?id=35064

Modified:
    llvm/trunk/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
    llvm/trunk/test/CodeGen/WebAssembly/fast-isel-noreg.ll

Modified: llvm/trunk/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyFastISel.cpp?rev=319144&r1=319143&r2=319144&view=diff
==============================================================================
--- llvm/trunk/lib/Target/WebAssembly/WebAssemblyFastISel.cpp (original)
+++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyFastISel.cpp Mon Nov 27 21:36:42 2017
@@ -275,7 +275,10 @@ bool WebAssemblyFastISel::computeAddress
           }
           if (S == 1 && Addr.isRegBase() && Addr.getReg() == 0) {
             // An unscaled add of a register. Set it as the new base.
-            Addr.setReg(getRegForValue(Op));
+            unsigned Reg = getRegForValue(Op);
+            if (Reg == 0)
+              return false;
+            Addr.setReg(Reg);
             break;
           }
           if (canFoldAddIntoGEP(U, Op)) {
@@ -359,7 +362,10 @@ bool WebAssemblyFastISel::computeAddress
   if (Addr.isSet()) {
     return false;
   }
-  Addr.setReg(getRegForValue(Obj));
+  unsigned Reg = getRegForValue(Obj);
+  if (Reg == 0)
+    return false;
+  Addr.setReg(Reg);
   return Addr.getReg() != 0;
 }
 
@@ -418,7 +424,10 @@ unsigned WebAssemblyFastISel::getRegForI
   }
 
   Not = false;
-  return maskI1Value(getRegForValue(V), V);
+  unsigned Reg = getRegForValue(V);
+  if (Reg == 0)
+    return 0;
+  return maskI1Value(Reg, V);
 }
 
 unsigned WebAssemblyFastISel::zeroExtendToI32(unsigned Reg, const Value *V,
@@ -535,13 +544,19 @@ unsigned WebAssemblyFastISel::signExtend
 unsigned WebAssemblyFastISel::getRegForUnsignedValue(const Value *V) {
   MVT::SimpleValueType From = getSimpleType(V->getType());
   MVT::SimpleValueType To = getLegalType(From);
-  return zeroExtend(getRegForValue(V), V, From, To);
+  unsigned VReg = getRegForValue(V);
+  if (VReg == 0)
+    return 0;
+  return zeroExtend(VReg, V, From, To);
 }
 
 unsigned WebAssemblyFastISel::getRegForSignedValue(const Value *V) {
   MVT::SimpleValueType From = getSimpleType(V->getType());
   MVT::SimpleValueType To = getLegalType(From);
-  return signExtend(getRegForValue(V), V, From, To);
+  unsigned VReg = getRegForValue(V);
+  if (VReg == 0)
+    return 0;
+  return signExtend(VReg, V, From, To);
 }
 
 unsigned WebAssemblyFastISel::getRegForPromotedValue(const Value *V,
@@ -797,8 +812,12 @@ bool WebAssemblyFastISel::selectCall(con
 
   if (IsDirect)
     MIB.addGlobalAddress(Func);
-  else
-    MIB.addReg(getRegForValue(Call->getCalledValue()));
+  else {
+    unsigned Reg = getRegForValue(Call->getCalledValue());
+    if (Reg == 0)
+      return false;
+    MIB.addReg(Reg);
+  }
 
   for (unsigned ArgReg : Args)
     MIB.addReg(ArgReg);
@@ -888,7 +907,10 @@ bool WebAssemblyFastISel::selectZExt(con
   const Value *Op = ZExt->getOperand(0);
   MVT::SimpleValueType From = getSimpleType(Op->getType());
   MVT::SimpleValueType To = getLegalType(getSimpleType(ZExt->getType()));
-  unsigned Reg = zeroExtend(getRegForValue(Op), Op, From, To);
+  unsigned In = getRegForValue(Op);
+  if (In == 0)
+    return false;
+  unsigned Reg = zeroExtend(In, Op, From, To);
   if (Reg == 0)
     return false;
 
@@ -902,7 +924,10 @@ bool WebAssemblyFastISel::selectSExt(con
   const Value *Op = SExt->getOperand(0);
   MVT::SimpleValueType From = getSimpleType(Op->getType());
   MVT::SimpleValueType To = getLegalType(getSimpleType(SExt->getType()));
-  unsigned Reg = signExtend(getRegForValue(Op), Op, From, To);
+  unsigned In = getRegForValue(Op);
+  if (In == 0)
+    return false;
+  unsigned Reg = signExtend(In, Op, From, To);
   if (Reg == 0)
     return false;
 
@@ -1044,15 +1069,18 @@ bool WebAssemblyFastISel::selectBitCast(
   if (!VT.isSimple() || !RetVT.isSimple())
     return false;
 
+  unsigned In = getRegForValue(I->getOperand(0));
+  if (In == 0)
+    return false;
+
   if (VT == RetVT) {
     // No-op bitcast.
-    updateValueMap(I, getRegForValue(I->getOperand(0)));
+    updateValueMap(I, In);
     return true;
   }
 
   unsigned Reg = fastEmit_ISD_BITCAST_r(VT.getSimpleVT(), RetVT.getSimpleVT(),
-                                        getRegForValue(I->getOperand(0)),
-                                        I->getOperand(0)->hasOneUse());
+                                        In, I->getOperand(0)->hasOneUse());
   if (!Reg)
     return false;
   MachineBasicBlock::iterator Iter = FuncInfo.InsertPt;

Modified: llvm/trunk/test/CodeGen/WebAssembly/fast-isel-noreg.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WebAssembly/fast-isel-noreg.ll?rev=319144&r1=319143&r2=319144&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/WebAssembly/fast-isel-noreg.ll (original)
+++ llvm/trunk/test/CodeGen/WebAssembly/fast-isel-noreg.ll Mon Nov 27 21:36:42 2017
@@ -32,4 +32,58 @@ entry:
   ret i32 0
 }
 
+; CHECK: i32.const {{.*}}, addr at FUNCTION
+; CHECK: i32.const {{.*}}, 24
+; CHECK: i32.shl
+; CHECK: i32.const {{.*}}, 24
+; CHECK: i32.shr_s
+; CHECK: i32.const {{.*}}, 64
+; CHECK: br_if 0, $pop0
+define hidden i32 @d() #0 {
+entry:
+  %t = icmp slt i8 ptrtoint (void ()* @addr to i8), 64
+  br i1 %t, label %a, label %b
+a:
+  unreachable
+b:
+  ret i32 0
+}
+
+; CHECK: i32.const {{.*}}, addr at FUNCTION
+; CHECK: i32.const {{.*}}, 255
+; CHECK: i32.and
+; CHECK: i32.const {{.*}}, 64
+; CHECK: br_if 0, $pop0
+define hidden i32 @e() #0 {
+entry:
+  %t = icmp ult i8 ptrtoint (void ()* @addr to i8), 64
+  br i1 %t, label %a, label %b
+a:
+  unreachable
+b:
+  ret i32 0
+}
+
+; CHECK: i32.const {{.*}}, addr at FUNCTION
+; CHECK: i32.const {{.*}}, 24
+; CHECK: i32.shl
+; CHECK: i32.const {{.*}}, 24
+; CHECK: i32.shr_s
+define hidden i32 @f() #0 {
+entry:
+  %t = sext i8 ptrtoint (void ()* @addr to i8) to i32
+  ret i32 %t
+}
+
+; CHECK: i32.const {{.*}}, addr at FUNCTION
+; CHECK: i32.const {{.*}}, 255
+; CHECK: i32.and
+define hidden i32 @g() #0 {
+entry:
+  %t = zext i8 ptrtoint (void ()* @addr to i8) to i32
+  ret i32 %t
+}
+
+declare void @addr()
+
 attributes #0 = { noinline optnone }




More information about the llvm-commits mailing list