[llvm] r274922 - add tests for multi-use folding to select
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 8 13:22:28 PDT 2016
Author: spatel
Date: Fri Jul 8 15:22:27 2016
New Revision: 274922
URL: http://llvm.org/viewvc/llvm-project?rev=274922&view=rev
Log:
add tests for multi-use folding to select
Modified:
llvm/trunk/test/Transforms/InstCombine/logical-select.ll
Modified: llvm/trunk/test/Transforms/InstCombine/logical-select.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/logical-select.ll?rev=274922&r1=274921&r2=274922&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/logical-select.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/logical-select.ll Fri Jul 8 15:22:27 2016
@@ -274,6 +274,46 @@ define i1 @bools(i1 %a, i1 %b, i1 %c) {
ret i1 %or
}
+; Form a select if we know we can get replace 2 simple logic ops.
+
+define i1 @bools_multi_uses1(i1 %a, i1 %b, i1 %c) {
+; CHECK-LABEL: @bools_multi_uses1(
+; CHECK-NEXT: [[NOT:%.*]] = xor i1 %c, true
+; CHECK-NEXT: [[AND1:%.*]] = and i1 [[NOT]], %a
+; CHECK-NEXT: [[TMP1:%.*]] = select i1 %c, i1 %b, i1 %a
+; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[TMP1]], [[AND1]]
+; CHECK-NEXT: ret i1 [[XOR]]
+;
+ %not = xor i1 %c, -1
+ %and1 = and i1 %not, %a
+ %and2 = and i1 %c, %b
+ %or = or i1 %and1, %and2
+ %xor = xor i1 %or, %and1
+ ret i1 %xor
+}
+
+; FIXME: Don't replace a cheap logic op with a potentially expensive select
+; unless we can also eliminate one of the other original ops.
+
+define i1 @bools_multi_uses2(i1 %a, i1 %b, i1 %c) {
+; CHECK-LABEL: @bools_multi_uses2(
+; CHECK-NEXT: [[NOT:%.*]] = xor i1 %c, true
+; CHECK-NEXT: [[AND1:%.*]] = and i1 [[NOT]], %a
+; CHECK-NEXT: [[AND2:%.*]] = and i1 %c, %b
+; CHECK-NEXT: [[TMP1:%.*]] = select i1 %c, i1 %b, i1 %a
+; CHECK-NEXT: [[ADD:%.*]] = xor i1 [[AND1]], [[AND2]]
+; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[TMP1]], [[ADD]]
+; CHECK-NEXT: ret i1 [[XOR]]
+;
+ %not = xor i1 %c, -1
+ %and1 = and i1 %not, %a
+ %and2 = and i1 %c, %b
+ %or = or i1 %and1, %and2
+ %add = add i1 %and1, %and2
+ %xor = xor i1 %or, %add
+ ret i1 %xor
+}
+
define <4 x i1> @vec_of_bools(<4 x i1> %a, <4 x i1> %b, <4 x i1> %c) {
; CHECK-LABEL: @vec_of_bools(
; CHECK-NEXT: [[TMP1:%.*]] = select <4 x i1> %c, <4 x i1> %b, <4 x i1> %a
More information about the llvm-commits
mailing list