summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2013-06-29 23:44:53 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2013-06-29 23:44:53 +0000
commit7a69d2c06adefd557ce2eb58ad0ccbb69de78c22 (patch)
tree66c45fed0162904d99bfb615a1288785b991034e /llvm/test/Transforms
parent3cc579a95bd5907d813855d9782a5c4e32348cd1 (diff)
downloadbcm5719-llvm-7a69d2c06adefd557ce2eb58ad0ccbb69de78c22.tar.gz
bcm5719-llvm-7a69d2c06adefd557ce2eb58ad0ccbb69de78c22.zip
ValueTracking: Teach isKnownToBeAPowerOfTwo about (ADD X, (XOR X, Y)) where X is a power of two
This allows us to simplify urem instructions involving the add+xor to turn into simpler math. llvm-svn: 185272
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r--llvm/test/Transforms/InstCombine/rem.ll15
1 files changed, 15 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstCombine/rem.ll b/llvm/test/Transforms/InstCombine/rem.ll
index 808d51eba1d..2b49385b922 100644
--- a/llvm/test/Transforms/InstCombine/rem.ll
+++ b/llvm/test/Transforms/InstCombine/rem.ll
@@ -163,3 +163,18 @@ define i32 @test16(i32 %x, i32 %y) {
%rem = urem i32 %x, %add
ret i32 %rem
}
+
+define i32 @test17(i16 %x, i32 %y) {
+; CHECK: @test17
+; CHECK-NEXT: [[AND:%.*]] = and i16 %x, 4
+; CHECK-NEXT: [[EXT:%.*]] = zext i16 [[AND]] to i32
+; CHECK-NEXT: [[SHL:%.*]] = shl nuw nsw i32 [[EXT]], 3
+; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[SHL]], 63
+; CHECK-NEXT: [[REM:%.*]] = and i32 [[XOR]], %y
+; CHECK-NEXT: ret i32 [[REM]]
+ %1 = and i16 %x, 4
+ %2 = icmp ne i16 %1, 0
+ %3 = select i1 %2, i32 32, i32 64
+ %4 = urem i32 %y, %3
+ ret i32 %4
+}
OpenPOWER on IntegriCloud