APIntify a test which is potentially unsafe otherwise, and fix the
authorEli Friedman <eli.friedman@gmail.com>
Sun, 30 Nov 2008 04:59:26 +0000 (04:59 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Sun, 30 Nov 2008 04:59:26 +0000 (04:59 +0000)
nearby FIXME.

I'm not sure what the right way to fix the Cell test was; if the
approach I used isn't okay, please let me know.

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

lib/CodeGen/SelectionDAG/TargetLowering.cpp
test/CodeGen/CellSPU/icmp16.ll
test/CodeGen/X86/2008-11-29-ULT-Sign.ll [new file with mode: 0644]

index 01977908be6229bcf3ea9e468dca63ef95be5d59..4d8b9be44fb05ac383789b26475c4851c4403699 100644 (file)
@@ -1583,12 +1583,19 @@ TargetLowering::SimplifySetCC(MVT VT, SDValue N0, SDValue N1,
       // by changing cc.
 
       // SETUGT X, SINTMAX  -> SETLT X, 0
-      if (Cond == ISD::SETUGT && OperandBitSize != 1 &&
-          C1 == (~0ULL >> (65-OperandBitSize)))
+      if (Cond == ISD::SETUGT && 
+          C1 == APInt::getSignedMaxValue(OperandBitSize))
         return DAG.getSetCC(VT, N0, DAG.getConstant(0, N1.getValueType()),
                             ISD::SETLT);
 
-      // FIXME: Implement the rest of these.
+      // SETULT X, SINTMIN  -> SETGT X, -1
+      if (Cond == ISD::SETULT &&
+          C1 == APInt::getSignedMinValue(OperandBitSize)) {
+        SDValue ConstMinusOne =
+            DAG.getConstant(APInt::getAllOnesValue(OperandBitSize),
+                            N1.getValueType());
+        return DAG.getSetCC(VT, N0, ConstMinusOne, ISD::SETGT);
+      }
 
       // Fold bit comparisons when we can.
       if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
index bace03105411f506eb6e96504311bb7e6b4733f3..16bf0f9f62ad30aeffb648e016940dae22c996d7 100644 (file)
@@ -204,7 +204,7 @@ entry:
 
 define i16 @icmp_ult_immed04_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind {
 entry:
-       %A = icmp ult i16 %arg1, 32768
+       %A = icmp ult i16 %arg1, 32769
        %B = select i1 %A, i16 %val1, i16 %val2
        ret i16 %B
 }
diff --git a/test/CodeGen/X86/2008-11-29-ULT-Sign.ll b/test/CodeGen/X86/2008-11-29-ULT-Sign.ll
new file mode 100644 (file)
index 0000000..6c26b68
--- /dev/null
@@ -0,0 +1,22 @@
+; RUN:  llvm-as < %s | llc -mtriple=i686-pc-linux-gnu | grep "jns" | count 1
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32"
+target triple = "i686-pc-linux-gnu"
+
+define i32 @a(i32 %x) nounwind {
+entry:
+       %cmp = icmp ult i32 %x, -2147483648             ; <i1> [#uses=1]
+       br i1 %cmp, label %if.end, label %if.then
+
+if.then:               ; preds = %entry
+       %call = call i32 (...)* @b()            ; <i32> [#uses=0]
+       br label %if.end
+
+if.end:                ; preds = %if.then, %entry
+       br label %return
+
+return:                ; preds = %if.end
+       ret i32 undef
+}
+
+declare i32 @b(...)
+