[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