[PATCH] D46656: [Builtins] Improve the IR emitted for MSVC compatible rotr/rotl builtins to match what the middle and backends understand

Craig Topper via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed May 9 12:04:24 PDT 2018


craig.topper created this revision.
craig.topper added a reviewer: spatel.

Currently we emit something like

rotl(x, n) {
n &= bitwidth -1;
return n != 0 ? ((x << n) | (x >> (bitwidth - n)) : x;
}

We use a select to avoid the undefined behavior on the (bitwidth - n) shift.

The middle and backend don't really recognize this as a rotate and end up emitting a cmov or control flow because of the select.

A better pattern is (x << (n & mask)) | (x << (-n & mask))  where mask is bitwidth - 1.

Fixes the main complaint in PR37387. There's still some work to be done if the user writes that sequence directly on a short or char where type promotion rules can prevent it from being recognized. The builtin is emitting direct IR with unpromoted types so that isn't a problem for it.


https://reviews.llvm.org/D46656

Files:
  lib/CodeGen/CGBuiltin.cpp
  test/CodeGen/ms-intrinsics-rotations.c

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D46656.145979.patch
Type: text/x-patch
Size: 13129 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180509/3c7ac952/attachment.bin>


More information about the cfe-commits mailing list