From bd8056ef326e075cc500f3f0cfcd1193bc200594 Mon Sep 17 00:00:00 2001 From: Chen Zheng Date: Sat, 13 Apr 2019 07:34:55 +0000 Subject: [PATCH] [InstCombine] [NFC] add testcases for canonicalizing (-X srem Y) to -(X srem Y). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@358327 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Transforms/InstCombine/srem-canonicalize.ll | 63 ++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 test/Transforms/InstCombine/srem-canonicalize.ll diff --git a/test/Transforms/InstCombine/srem-canonicalize.ll b/test/Transforms/InstCombine/srem-canonicalize.ll new file mode 100644 index 00000000000..af27fd3affa --- /dev/null +++ b/test/Transforms/InstCombine/srem-canonicalize.ll @@ -0,0 +1,63 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -instcombine -S | FileCheck %s + +define i32 @test_srem_canonicalize_op0(i32 %x, i32 %y) { +; CHECK-LABEL: @test_srem_canonicalize_op0( +; CHECK-NEXT: [[NEG:%.*]] = sub nsw i32 0, [[X:%.*]] +; CHECK-NEXT: [[SREM:%.*]] = srem i32 [[NEG]], [[Y:%.*]] +; CHECK-NEXT: ret i32 [[SREM]] +; + %neg = sub nsw i32 0, %x + %srem = srem i32 %neg, %y + ret i32 %srem +} + +; (X srem -Y) is not equal to -(X srem Y), don't canonicalize. +define i32 @test_srem_canonicalize_op1(i32 %x, i32 %z) { +; CHECK-LABEL: @test_srem_canonicalize_op1( +; CHECK-NEXT: [[Y:%.*]] = mul i32 [[Z:%.*]], 3 +; CHECK-NEXT: [[NEG:%.*]] = sub nsw i32 0, [[X:%.*]] +; CHECK-NEXT: [[SREM:%.*]] = srem i32 [[Y]], [[NEG]] +; CHECK-NEXT: ret i32 [[SREM]] +; + %y = mul i32 %z, 3 + %neg = sub nsw i32 0, %x + %srem = srem i32 %y, %neg + ret i32 %srem +} + +define i32 @test_srem_canonicalize_nonsw(i32 %x, i32 %y) { +; CHECK-LABEL: @test_srem_canonicalize_nonsw( +; CHECK-NEXT: [[NEG:%.*]] = sub i32 0, [[X:%.*]] +; CHECK-NEXT: [[SREM:%.*]] = srem i32 [[NEG]], [[Y:%.*]] +; CHECK-NEXT: ret i32 [[SREM]] +; + %neg = sub i32 0, %x + %srem = srem i32 %neg, %y + ret i32 %srem +} + +define <2 x i32> @test_srem_canonicalize_vec(<2 x i32> %x, <2 x i32> %y) { +; CHECK-LABEL: @test_srem_canonicalize_vec( +; CHECK-NEXT: [[NEG:%.*]] = sub nsw <2 x i32> zeroinitializer, [[X:%.*]] +; CHECK-NEXT: [[SREM:%.*]] = srem <2 x i32> [[NEG]], [[Y:%.*]] +; CHECK-NEXT: ret <2 x i32> [[SREM]] +; + %neg = sub nsw <2 x i32> , %x + %srem = srem <2 x i32> %neg, %y + ret <2 x i32> %srem +} + +define i32 @test_srem_canonicalize_multiple_uses(i32 %x, i32 %y) { +; CHECK-LABEL: @test_srem_canonicalize_multiple_uses( +; CHECK-NEXT: [[NEG:%.*]] = sub nsw i32 0, [[X:%.*]] +; CHECK-NEXT: [[SREM:%.*]] = srem i32 [[NEG]], [[Y:%.*]] +; CHECK-NEXT: [[SREM2:%.*]] = srem i32 [[SREM]], [[NEG]] +; CHECK-NEXT: ret i32 [[SREM2]] +; + %neg = sub nsw i32 0, %x + %srem = srem i32 %neg, %y + %srem2 = srem i32 %srem, %neg + ret i32 %srem2 +} + -- 2.11.0