[ARM] Corrected condition in isSaturatingConditional
authorMeera Nakrani <meera.nakrani@arm.com>
Tue, 15 Sep 2020 10:14:30 +0000 (10:14 +0000)
committerMeera Nakrani <meera.nakrani@arm.com>
Tue, 15 Sep 2020 10:14:30 +0000 (10:14 +0000)
Fixed a small error in an if condition to prevent usat/ssat being generated if (upper constant + 1) is not a
power of 2.

llvm/lib/Target/ARM/ARMISelLowering.cpp
llvm/test/CodeGen/ARM/usat.ll

index d9ccd86..cfb77f4 100644 (file)
@@ -5062,7 +5062,7 @@ static bool isSaturatingConditional(const SDValue &Op, SDValue &V,
     int64_t PosVal = std::max(Val1, Val2);
     int64_t NegVal = std::min(Val1, Val2);
 
-    if (!((Val1 > Val2 && isLTorLE(CC1)) || (Val1 < Val2 && isLTorLE(CC2))) &&
+    if (!((Val1 > Val2 && isLTorLE(CC1)) || (Val1 < Val2 && isLTorLE(CC2))) ||
         !isPowerOf2_64(PosVal + 1)) 
       return false;
 
index 9906438..ba4e0dd 100644 (file)
@@ -176,6 +176,18 @@ entry:
   ret i32 %saturateUp
 }
 
+; The interval is [0, k] but k+1 is not a power of 2
+define i32 @no_unsigned_sat_incorrect_constant2(i32 %x) #0 {
+; CHECK-LABEL: no_unsigned_sat_incorrect_constant2:
+; CHECK-NOT: usat
+entry:
+  %0 = icmp sgt i32 %x, 0
+  %saturateLow = select i1 %0, i32 %x, i32 0
+  %1 = icmp slt i32 %saturateLow, 8388609
+  %saturateUp = select i1 %1, i32 %saturateLow, i32 8388609
+  ret i32 %saturateUp
+}
+
 ; The interval is not [0, k]
 define i32 @no_unsigned_sat_incorrect_interval(i32 %x) #0 {
 ; CHECK-LABEL: no_unsigned_sat_incorrect_interval: