]> granicus.if.org Git - llvm/commitdiff
[NFC][InstCombine] Non-canonical clamp pattern: non-canonical predicate tests
authorRoman Lebedev <lebedev.ri@gmail.com>
Tue, 13 Aug 2019 08:14:13 +0000 (08:14 +0000)
committerRoman Lebedev <lebedev.ri@gmail.com>
Tue, 13 Aug 2019 08:14:13 +0000 (08:14 +0000)
We can't handle 'uge' case because we can't ever get it,
there needs to be extra use on that compare or else it will be
canonicalized, but because of extra use we can't handle it.

'sge' case we can have.

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

test/Transforms/InstCombine/canonicalize-clamp-like-pattern-between-negative-and-positive-thresholds.ll

index c23bf366079f18aad41e502fc2b4efcb4173ae23..141bf660ee420c5639605bf6c5bdf3fb336c1cb8 100644 (file)
@@ -444,3 +444,46 @@ define <2 x i32> @t21_ult_slt_vec_nonsplat(<2 x i32> %x, <2 x i32> %replacement_
   %r = select <2 x i1> %t3, <2 x i32> %x, <2 x i32> %t1
   ret <2 x i32> %r
 }
+
+; Non-canonical predicates
+
+declare void @use2xi1(<2 x i1>)
+
+declare void @use(<2 x i1>)
+define <2 x i32> @t22_uge_slt(<2 x i32> %x, <2 x i32> %replacement_low, <2 x i32> %replacement_high) {
+; CHECK-LABEL: @t22_uge_slt(
+; CHECK-NEXT:    [[T0:%.*]] = icmp slt <2 x i32> [[X:%.*]], <i32 128, i32 128>
+; CHECK-NEXT:    [[T1:%.*]] = select <2 x i1> [[T0]], <2 x i32> [[REPLACEMENT_LOW:%.*]], <2 x i32> [[REPLACEMENT_HIGH:%.*]]
+; CHECK-NEXT:    [[T2:%.*]] = add <2 x i32> [[X]], <i32 16, i32 16>
+; CHECK-NEXT:    [[T3:%.*]] = icmp uge <2 x i32> [[T2]], <i32 144, i32 0>
+; CHECK-NEXT:    call void @use2xi1(<2 x i1> [[T3]])
+; CHECK-NEXT:    [[R:%.*]] = select <2 x i1> [[T3]], <2 x i32> [[T1]], <2 x i32> [[X]]
+; CHECK-NEXT:    ret <2 x i32> [[R]]
+;
+  %t0 = icmp slt <2 x i32> %x, <i32 128, i32 128>
+  %t1 = select <2 x i1> %t0, <2 x i32> %replacement_low, <2 x i32> %replacement_high
+  %t2 = add <2 x i32> %x, <i32 16, i32 16>
+  %t3 = icmp uge <2 x i32> %t2, <i32 144, i32 0>
+  call void @use2xi1(<2 x i1> %t3)
+  %r = select <2 x i1> %t3, <2 x i32> %t1, <2 x i32> %x
+  ret <2 x i32> %r
+}
+
+define <2 x i32> @t23_ult_sge(<2 x i32> %x, <2 x i32> %replacement_low, <2 x i32> %replacement_high) {
+; CHECK-LABEL: @t23_ult_sge(
+; CHECK-NEXT:    [[T0:%.*]] = icmp sge <2 x i32> [[X:%.*]], <i32 128, i32 -2147483648>
+; CHECK-NEXT:    call void @use2xi1(<2 x i1> [[T0]])
+; CHECK-NEXT:    [[T1:%.*]] = select <2 x i1> [[T0]], <2 x i32> [[REPLACEMENT_HIGH:%.*]], <2 x i32> [[REPLACEMENT_LOW:%.*]]
+; CHECK-NEXT:    [[T2:%.*]] = add <2 x i32> [[X]], <i32 16, i32 -2147483648>
+; CHECK-NEXT:    [[T3:%.*]] = icmp ult <2 x i32> [[T2]], <i32 144, i32 -1>
+; CHECK-NEXT:    [[R:%.*]] = select <2 x i1> [[T3]], <2 x i32> [[X]], <2 x i32> [[T1]]
+; CHECK-NEXT:    ret <2 x i32> [[R]]
+;
+  %t0 = icmp sge <2 x i32> %x, <i32 128, i32 -2147483648>
+  call void @use2xi1(<2 x i1> %t0)
+  %t1 = select <2 x i1> %t0, <2 x i32> %replacement_high, <2 x i32> %replacement_low
+  %t2 = add <2 x i32> %x, <i32 16, i32 -2147483648>
+  %t3 = icmp ult <2 x i32> %t2, <i32 144, i32 -1>
+  %r = select <2 x i1> %t3, <2 x i32> %x, <2 x i32> %t1
+  ret <2 x i32> %r
+}