diff options
author | Noah Goldstein <goldstein.w.n@gmail.com> | 2024-04-10 12:07:37 -0500 |
---|---|---|
committer | Noah Goldstein <goldstein.w.n@gmail.com> | 2024-06-23 11:15:47 +0800 |
commit | 61c4d7b9231d22f8cff7a6a6b3b52d401cba9f6f (patch) | |
tree | 3039e62e1c98fcb7159a385f37346a15a95bfdd6 /llvm | |
parent | 05ba5c0648ae5e80d5afce270495bf3b1eef9af4 (diff) | |
download | llvm-61c4d7b9231d22f8cff7a6a6b3b52d401cba9f6f.zip llvm-61c4d7b9231d22f8cff7a6a6b3b52d401cba9f6f.tar.gz llvm-61c4d7b9231d22f8cff7a6a6b3b52d401cba9f6f.tar.bz2 |
[InstCombine] Add tests for expanding `foldSelectValueEquivalence`; NFC
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/test/Transforms/InstCombine/select-cmp-eq-op-fold.ll | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstCombine/select-cmp-eq-op-fold.ll b/llvm/test/Transforms/InstCombine/select-cmp-eq-op-fold.ll new file mode 100644 index 0000000..ec82b19 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/select-cmp-eq-op-fold.ll @@ -0,0 +1,186 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -passes=instcombine -S | FileCheck %s + +declare void @use.i1(i1) +declare void @use.i8(i8) +define i8 @replace_with_y_noundef(i8 %x, i8 noundef %y, i8 %z) { +; CHECK-LABEL: @replace_with_y_noundef( +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], [[Y]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[AND]], i8 [[Z:%.*]] +; CHECK-NEXT: ret i8 [[SEL]] +; + %cmp = icmp eq i8 %x, %y + %and = and i8 %x, %y + %sel = select i1 %cmp, i8 %and, i8 %z + ret i8 %sel +} + +define i8 @replace_with_x_noundef(i8 noundef %x, i8 %y, i8 %z) { +; CHECK-LABEL: @replace_with_x_noundef( +; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: call void @use.i1(i1 [[CMP]]) +; CHECK-NEXT: [[AND:%.*]] = or i8 [[X]], [[Y]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[Z:%.*]], i8 [[AND]] +; CHECK-NEXT: ret i8 [[SEL]] +; + %cmp = icmp ne i8 %x, %y + call void @use.i1(i1 %cmp) + %and = or i8 %x, %y + %sel = select i1 %cmp, i8 %z, i8 %and + ret i8 %sel +} + +define i8 @replace_with_x_maybe_undef_fail(i8 %x, i8 %y, i8 %z) { +; CHECK-LABEL: @replace_with_x_maybe_undef_fail( +; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: call void @use.i1(i1 [[CMP]]) +; CHECK-NEXT: [[AND:%.*]] = or i8 [[X]], [[Y]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[Z:%.*]], i8 [[AND]] +; CHECK-NEXT: ret i8 [[SEL]] +; + %cmp = icmp ne i8 %x, %y + call void @use.i1(i1 %cmp) + %and = or i8 %x, %y + %sel = select i1 %cmp, i8 %z, i8 %and + ret i8 %sel +} + +define i8 @replace_with_y_for_new_oneuse(i8 noundef %xx, i8 noundef %y, i8 %z) { +; CHECK-LABEL: @replace_with_y_for_new_oneuse( +; CHECK-NEXT: [[X:%.*]] = mul i8 [[XX:%.*]], 13 +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], [[Y:%.*]] +; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[X]], [[Y]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 [[Z:%.*]] +; CHECK-NEXT: ret i8 [[SEL]] +; + %x = mul i8 %xx, 13 + %cmp = icmp eq i8 %x, %y + %add = add nuw i8 %x, %y + %sel = select i1 %cmp, i8 %add, i8 %z + ret i8 %sel +} + +define i8 @replace_with_y_for_new_oneuse2(i8 %xx, i8 noundef %y, i8 %z, i8 %q) { +; CHECK-LABEL: @replace_with_y_for_new_oneuse2( +; CHECK-NEXT: [[X:%.*]] = mul i8 [[XX:%.*]], 13 +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], [[Y:%.*]] +; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[X]], [[Q:%.*]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 [[Z:%.*]] +; CHECK-NEXT: ret i8 [[SEL]] +; + %x = mul i8 %xx, 13 + %cmp = icmp eq i8 %x, %y + %add = add nuw i8 %x, %q + %sel = select i1 %cmp, i8 %add, i8 %z + ret i8 %sel +} + +define i8 @replace_with_x_for_new_oneuse(i8 noundef %xx, i8 noundef %yy, i8 %z, i8 %w) { +; CHECK-LABEL: @replace_with_x_for_new_oneuse( +; CHECK-NEXT: [[X:%.*]] = mul i8 [[XX:%.*]], 13 +; CHECK-NEXT: [[Y:%.*]] = add i8 [[YY:%.*]], [[W:%.*]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], [[Y]] +; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[X]], [[Y]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[MUL]], i8 [[Z:%.*]] +; CHECK-NEXT: ret i8 [[SEL]] +; + %x = mul i8 %xx, 13 + %y = add i8 %yy, %w + %cmp = icmp eq i8 %x, %y + %mul = mul i8 %x, %y + %sel = select i1 %cmp, i8 %mul, i8 %z + ret i8 %sel +} + +define i8 @replace_with_x_for_new_oneuse2(i8 noundef %xx, i8 %yy, i8 %z, i8 %w, i8 %q) { +; CHECK-LABEL: @replace_with_x_for_new_oneuse2( +; CHECK-NEXT: [[X:%.*]] = mul i8 [[XX:%.*]], 13 +; CHECK-NEXT: [[Y:%.*]] = add i8 [[YY:%.*]], [[W:%.*]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], [[Y]] +; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[Y]], [[Q:%.*]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[MUL]], i8 [[Z:%.*]] +; CHECK-NEXT: ret i8 [[SEL]] +; + %x = mul i8 %xx, 13 + %y = add i8 %yy, %w + %cmp = icmp eq i8 %x, %y + %mul = mul i8 %q, %y + %sel = select i1 %cmp, i8 %mul, i8 %z + ret i8 %sel +} + +define i8 @replace_with_x_for_simple_binop(i8 noundef %xx, i8 %yy, i8 %z, i8 %w) { +; CHECK-LABEL: @replace_with_x_for_simple_binop( +; CHECK-NEXT: [[X:%.*]] = mul i8 [[XX:%.*]], 13 +; CHECK-NEXT: [[Y:%.*]] = add i8 [[YY:%.*]], [[W:%.*]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], [[Y]] +; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[X]], [[Y]] +; CHECK-NEXT: call void @use.i8(i8 [[Y]]) +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[MUL]], i8 [[Z:%.*]] +; CHECK-NEXT: ret i8 [[SEL]] +; + %x = mul i8 %xx, 13 + %y = add i8 %yy, %w + %cmp = icmp eq i8 %x, %y + %mul = mul i8 %x, %y + call void @use.i8(i8 %y) + %sel = select i1 %cmp, i8 %mul, i8 %z + ret i8 %sel +} + +define i8 @replace_with_none_for_new_oneuse_fail_maybe_undef(i8 %xx, i8 %y, i8 %z) { +; CHECK-LABEL: @replace_with_none_for_new_oneuse_fail_maybe_undef( +; CHECK-NEXT: [[X:%.*]] = mul i8 [[XX:%.*]], 13 +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], [[Y:%.*]] +; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[X]], [[Y]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[MUL]], i8 [[Z:%.*]] +; CHECK-NEXT: ret i8 [[SEL]] +; + %x = mul i8 %xx, 13 + %cmp = icmp eq i8 %x, %y + %mul = mul i8 %x, %y + %sel = select i1 %cmp, i8 %mul, i8 %z + ret i8 %sel +} + +define i8 @replace_with_y_for_simple_binop(i8 %x, i8 noundef %y, i8 %z) { +; CHECK-LABEL: @replace_with_y_for_simple_binop( +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[MUL:%.*]] = mul nsw i8 [[X]], [[Y]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[MUL]], i8 [[Z:%.*]] +; CHECK-NEXT: ret i8 [[SEL]] +; + %cmp = icmp eq i8 %x, %y + %mul = mul nsw i8 %x, %y + %sel = select i1 %cmp, i8 %mul, i8 %z + ret i8 %sel +} + +define i8 @replace_with_y_for_simple_binop_fail_multiuse(i8 %x, i8 noundef %y, i8 %z) { +; CHECK-LABEL: @replace_with_y_for_simple_binop_fail_multiuse( +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[MUL:%.*]] = mul nsw i8 [[X]], [[Y]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[MUL]], i8 [[Z:%.*]] +; CHECK-NEXT: call void @use.i8(i8 [[MUL]]) +; CHECK-NEXT: ret i8 [[SEL]] +; + %cmp = icmp eq i8 %x, %y + %mul = mul nsw i8 %x, %y + %sel = select i1 %cmp, i8 %mul, i8 %z + call void @use.i8(i8 %mul) + ret i8 %sel +} + +define i8 @replace_with_y_for_simple_binop_fail(i8 %x, i8 noundef %y, i8 %z, i8 %q) { +; CHECK-LABEL: @replace_with_y_for_simple_binop_fail( +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[MUL:%.*]] = mul nsw i8 [[X]], [[Q:%.*]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[MUL]], i8 [[Z:%.*]] +; CHECK-NEXT: ret i8 [[SEL]] +; + %cmp = icmp eq i8 %x, %y + %mul = mul nsw i8 %x, %q + %sel = select i1 %cmp, i8 %mul, i8 %z + ret i8 %sel +} |