This repository has been archived by the owner on Jan 1, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 63
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
C-like languages promote types like unsigned short to unsigned int before performing an arithmetic operation. Currently the rotate matcher in the DAGCombiner does not consider this situation. This commit extends the DAGCombiner in the way that the pattern (or (shl ([az]ext x), (*ext y)), (srl ([az]ext x), (*ext (sub 32, y)))) is folded into ([az]ext (rotl x, y)) The matching is restricted to aext and zext because in this cases the upper bits are either undefined or known. Test case is included. This fixes PR16726. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191049 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
Showing
2 changed files
with
113 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
; Check that (or (shl x, y), (srl x, (sub 32, y))) is folded into (rotl x, y) | ||
; and (or (shl x, (sub 32, y)), (srl x, r)) into (rotr x, y) even if the | ||
; argument is zero extended. Fix for PR16726. | ||
|
||
; RUN: llc < %s -march=x86-64 -mcpu=corei7 | FileCheck %s | ||
|
||
define zeroext i8 @rolbyte(i32 %nBits_arg, i8 %x_arg) nounwind readnone { | ||
entry: | ||
%tmp1 = zext i8 %x_arg to i32 | ||
%tmp3 = shl i32 %tmp1, %nBits_arg | ||
%tmp8 = sub i32 8, %nBits_arg | ||
%tmp10 = lshr i32 %tmp1, %tmp8 | ||
%tmp11 = or i32 %tmp3, %tmp10 | ||
%tmp12 = trunc i32 %tmp11 to i8 | ||
ret i8 %tmp12 | ||
} | ||
; CHECK: rolb %cl, %{{[a-z0-9]+}} | ||
|
||
|
||
define zeroext i8 @rorbyte(i32 %nBits_arg, i8 %x_arg) nounwind readnone { | ||
entry: | ||
%tmp1 = zext i8 %x_arg to i32 | ||
%tmp3 = lshr i32 %tmp1, %nBits_arg | ||
%tmp8 = sub i32 8, %nBits_arg | ||
%tmp10 = shl i32 %tmp1, %tmp8 | ||
%tmp11 = or i32 %tmp3, %tmp10 | ||
%tmp12 = trunc i32 %tmp11 to i8 | ||
ret i8 %tmp12 | ||
} | ||
; CHECK: rorb %cl, %{{[a-z0-9]+}} | ||
|
||
define zeroext i16 @rolword(i32 %nBits_arg, i16 %x_arg) nounwind readnone { | ||
entry: | ||
%tmp1 = zext i16 %x_arg to i32 | ||
%tmp3 = shl i32 %tmp1, %nBits_arg | ||
%tmp8 = sub i32 16, %nBits_arg | ||
%tmp10 = lshr i32 %tmp1, %tmp8 | ||
%tmp11 = or i32 %tmp3, %tmp10 | ||
%tmp12 = trunc i32 %tmp11 to i16 | ||
ret i16 %tmp12 | ||
} | ||
; CHECK: rolw %cl, %{{[a-z0-9]+}} | ||
|
||
define zeroext i16 @rorword(i32 %nBits_arg, i16 %x_arg) nounwind readnone { | ||
entry: | ||
%tmp1 = zext i16 %x_arg to i32 | ||
%tmp3 = lshr i32 %tmp1, %nBits_arg | ||
%tmp8 = sub i32 16, %nBits_arg | ||
%tmp10 = shl i32 %tmp1, %tmp8 | ||
%tmp11 = or i32 %tmp3, %tmp10 | ||
%tmp12 = trunc i32 %tmp11 to i16 | ||
ret i16 %tmp12 | ||
} | ||
; CHECK: rorw %cl, %{{[a-z0-9]+}} | ||
|
||
define i64 @roldword(i64 %nBits_arg, i32 %x_arg) nounwind readnone { | ||
entry: | ||
%tmp1 = zext i32 %x_arg to i64 | ||
%tmp3 = shl i64 %tmp1, %nBits_arg | ||
%tmp8 = sub i64 32, %nBits_arg | ||
%tmp10 = lshr i64 %tmp1, %tmp8 | ||
%tmp11 = or i64 %tmp3, %tmp10 | ||
ret i64 %tmp11 | ||
} | ||
; CHECK: roll %cl, %{{[a-z0-9]+}} | ||
|
||
define zeroext i64 @rordword(i64 %nBits_arg, i32 %x_arg) nounwind readnone { | ||
entry: | ||
%tmp1 = zext i32 %x_arg to i64 | ||
%tmp3 = lshr i64 %tmp1, %nBits_arg | ||
%tmp8 = sub i64 32, %nBits_arg | ||
%tmp10 = shl i64 %tmp1, %tmp8 | ||
%tmp11 = or i64 %tmp3, %tmp10 | ||
ret i64 %tmp11 | ||
} | ||
; CHECK: rorl %cl, %{{[a-z0-9]+}} |