[llvm] r270738 - [SelectionDAG] Add smarts for BSWAP in computeKnownBits.
Chad Rosier via llvm-commits
llvm-commits at lists.llvm.org
Wed May 25 10:52:38 PDT 2016
Author: mcrosier
Date: Wed May 25 12:52:38 2016
New Revision: 270738
URL: http://llvm.org/viewvc/llvm-project?rev=270738&view=rev
Log:
[SelectionDAG] Add smarts for BSWAP in computeKnownBits.
Added:
llvm/trunk/test/CodeGen/AArch64/bswap-known-bits.ll
Modified:
llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=270738&r1=270737&r2=270738&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Wed May 25 12:52:38 2016
@@ -2465,6 +2465,12 @@ void SelectionDAG::computeKnownBits(SDVa
KnownOne = KnownOne.trunc(BitWidth);
break;
}
+ case ISD::BSWAP: {
+ computeKnownBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1);
+ KnownZero = KnownZero2.byteSwap();
+ KnownOne = KnownOne2.byteSwap();
+ break;
+ }
case ISD::SMIN:
case ISD::SMAX:
case ISD::UMIN:
Added: llvm/trunk/test/CodeGen/AArch64/bswap-known-bits.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/bswap-known-bits.ll?rev=270738&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/bswap-known-bits.ll (added)
+++ llvm/trunk/test/CodeGen/AArch64/bswap-known-bits.ll Wed May 25 12:52:38 2016
@@ -0,0 +1,44 @@
+; RUN: llc < %s -mtriple=aarch64-apple-darwin | FileCheck %s
+
+declare i16 @llvm.bswap.i16(i16)
+declare i32 @llvm.bswap.i32(i32)
+
+; CHECK-LABEL: @test1
+; CHECK: orr w0, wzr, #0x1
+define i1 @test1(i16 %arg) {
+ %a = or i16 %arg, 511
+ %b = call i16 @llvm.bswap.i16(i16 %a)
+ %and = and i16 %b, 256
+ %res = icmp eq i16 %and, 256
+ ret i1 %res
+}
+
+; CHECK-LABEL: @test2
+; CHECK: orr w0, wzr, #0x1
+define i1 @test2(i16 %arg) {
+ %a = or i16 %arg, 1
+ %b = call i16 @llvm.bswap.i16(i16 %a)
+ %and = and i16 %b, 256
+ %res = icmp eq i16 %and, 256
+ ret i1 %res
+}
+
+; CHECK-LABEL: @test3
+; CHECK: orr w0, wzr, #0x1
+define i1 @test3(i16 %arg) {
+ %a = or i16 %arg, 256
+ %b = call i16 @llvm.bswap.i16(i16 %a)
+ %and = and i16 %b, 1
+ %res = icmp eq i16 %and, 1
+ ret i1 %res
+}
+
+; CHECK-LABEL: @test4
+; CHECK: orr w0, wzr, #0x1
+define i1 @test4(i32 %arg) {
+ %a = or i32 %arg, 2147483647 ; i32_MAX
+ %b = call i32 @llvm.bswap.i32(i32 %a)
+ %and = and i32 %b, 127
+ %res = icmp eq i32 %and, 127
+ ret i1 %res
+}
More information about the llvm-commits
mailing list