Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[InstCombine] Remove assumptions about int having 32 bits
Reviewed By: bjope Differential Revision: https://reviews.llvm.org/D131731
- Loading branch information
Showing
8 changed files
with
348 additions
and
23 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
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,35 @@ | ||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | ||
; | ||
; Test that the ffs library call simplifier works correctly even for | ||
; targets with 16-bit int. | ||
; | ||
; RUN: opt < %s -mtriple=avr-linux -passes=instcombine -S | FileCheck %s | ||
; RUN: opt < %s -mtriple=msp430-linux -passes=instcombine -S | FileCheck %s | ||
|
||
declare i16 @ffs(i16) | ||
|
||
declare void @sink(i16) | ||
|
||
|
||
define void @fold_ffs(i16 %x) { | ||
; CHECK-LABEL: @fold_ffs( | ||
; CHECK-NEXT: call void @sink(i16 0) | ||
; CHECK-NEXT: call void @sink(i16 1) | ||
; CHECK-NEXT: [[CTTZ:%.*]] = call i16 @llvm.cttz.i16(i16 [[X:%.*]], i1 true), !range [[RNG0:![0-9]+]] | ||
; CHECK-NEXT: [[TMP1:%.*]] = add nuw nsw i16 [[CTTZ]], 1 | ||
; CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq i16 [[X]], 0 | ||
; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[DOTNOT]], i16 0, i16 [[TMP1]] | ||
; CHECK-NEXT: call void @sink(i16 [[TMP2]]) | ||
; CHECK-NEXT: ret void | ||
; | ||
%n0 = call i16 @ffs(i16 0) | ||
call void @sink(i16 %n0) | ||
|
||
%n1 = call i16 @ffs(i16 1) | ||
call void @sink(i16 %n1) | ||
|
||
%nx = call i16 @ffs(i16 %x) | ||
call void @sink(i16 %nx) | ||
|
||
ret void | ||
} |
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,34 @@ | ||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | ||
; | ||
; Test that the fls library call simplifier works correctly even for | ||
; targets with 16-bit int. Although fls is available on a number of | ||
; targets it's supported (hardcoded as available) only on FreeBSD. | ||
; | ||
; RUN: opt < %s -mtriple=avr-freebsd -passes=instcombine -S | FileCheck %s | ||
; RUN: opt < %s -mtriple=msp430-freebsd -passes=instcombine -S | FileCheck %s | ||
|
||
declare i16 @fls(i16) | ||
|
||
declare void @sink(i16) | ||
|
||
|
||
define void @fold_fls(i16 %x) { | ||
; CHECK-LABEL: @fold_fls( | ||
; CHECK-NEXT: call void @sink(i16 0) | ||
; CHECK-NEXT: call void @sink(i16 1) | ||
; CHECK-NEXT: [[CTLZ:%.*]] = call i16 @llvm.ctlz.i16(i16 [[X:%.*]], i1 false), !range [[RNG0:![0-9]+]] | ||
; CHECK-NEXT: [[TMP1:%.*]] = sub nuw nsw i16 16, [[CTLZ]] | ||
; CHECK-NEXT: call void @sink(i16 [[TMP1]]) | ||
; CHECK-NEXT: ret void | ||
; | ||
%n0 = call i16 @fls(i16 0) | ||
call void @sink(i16 %n0) | ||
|
||
%n1 = call i16 @fls(i16 1) | ||
call void @sink(i16 %n1) | ||
|
||
%nx = call i16 @fls(i16 %x) | ||
call void @sink(i16 %nx) | ||
|
||
ret void | ||
} |
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,57 @@ | ||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | ||
; Test that the isascii library call simplifier works correctly even for | ||
; targets with 16-bit int. | ||
; | ||
; RUN: opt < %s -mtriple=avr-freebsd -passes=instcombine -S | FileCheck %s | ||
; RUN: opt < %s -mtriple=msp430-linux -passes=instcombine -S | FileCheck %s | ||
|
||
declare i16 @isascii(i16) | ||
|
||
declare void @sink(i16) | ||
|
||
|
||
define void @fold_isascii(i16 %c) { | ||
; CHECK-LABEL: @fold_isascii( | ||
; CHECK-NEXT: call void @sink(i16 1) | ||
; CHECK-NEXT: call void @sink(i16 1) | ||
; CHECK-NEXT: call void @sink(i16 1) | ||
; CHECK-NEXT: call void @sink(i16 0) | ||
; CHECK-NEXT: call void @sink(i16 0) | ||
; CHECK-NEXT: call void @sink(i16 0) | ||
; CHECK-NEXT: call void @sink(i16 0) | ||
; CHECK-NEXT: call void @sink(i16 0) | ||
; CHECK-NEXT: [[ISASCII:%.*]] = icmp ult i16 [[C:%.*]], 128 | ||
; CHECK-NEXT: [[TMP1:%.*]] = zext i1 [[ISASCII]] to i16 | ||
; CHECK-NEXT: call void @sink(i16 [[TMP1]]) | ||
; CHECK-NEXT: ret void | ||
; | ||
%i0 = call i16 @isascii(i16 0) | ||
call void @sink(i16 %i0) | ||
|
||
%i1 = call i16 @isascii(i16 1) | ||
call void @sink(i16 %i1) | ||
|
||
%i127 = call i16 @isascii(i16 127) | ||
call void @sink(i16 %i127) | ||
|
||
%i128 = call i16 @isascii(i16 128) | ||
call void @sink(i16 %i128) | ||
|
||
%i255 = call i16 @isascii(i16 255) | ||
call void @sink(i16 %i255) | ||
|
||
%i256 = call i16 @isascii(i16 256) | ||
call void @sink(i16 %i256) | ||
|
||
; Fold isascii(INT_MAX) to 0. The call is valid with all int values. | ||
%imax = call i16 @isascii(i16 32767) | ||
call void @sink(i16 %imax) | ||
|
||
%uimax = call i16 @isascii(i16 65535) | ||
call void @sink(i16 %uimax) | ||
|
||
%ic = call i16 @isascii(i16 %c) | ||
call void @sink(i16 %ic) | ||
|
||
ret void | ||
} |
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,82 @@ | ||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | ||
; Test that the isdigit library call simplifier works correctly even for | ||
; targets with 16-bit int. | ||
; | ||
; RUN: opt < %s -mtriple=avr-linux -passes=instcombine -S | FileCheck %s | ||
; RUN: opt < %s -mtriple=msp430-freebsd -passes=instcombine -S | FileCheck %s | ||
|
||
declare i16 @isdigit(i16) | ||
|
||
declare void @sink(i16) | ||
|
||
define void @fold_isdigit(i16 %c) { | ||
; CHECK-LABEL: @fold_isdigit( | ||
; CHECK-NEXT: call void @sink(i16 0) | ||
; CHECK-NEXT: call void @sink(i16 0) | ||
; CHECK-NEXT: call void @sink(i16 0) | ||
; CHECK-NEXT: call void @sink(i16 1) | ||
; CHECK-NEXT: call void @sink(i16 1) | ||
; CHECK-NEXT: call void @sink(i16 1) | ||
; CHECK-NEXT: call void @sink(i16 0) | ||
; CHECK-NEXT: call void @sink(i16 0) | ||
; CHECK-NEXT: call void @sink(i16 0) | ||
; CHECK-NEXT: call void @sink(i16 0) | ||
; CHECK-NEXT: call void @sink(i16 0) | ||
; CHECK-NEXT: call void @sink(i16 0) | ||
; CHECK-NEXT: [[ISDIGITTMP:%.*]] = add i16 [[C:%.*]], -48 | ||
; CHECK-NEXT: [[ISDIGIT:%.*]] = icmp ult i16 [[ISDIGITTMP]], 10 | ||
; CHECK-NEXT: [[TMP1:%.*]] = zext i1 [[ISDIGIT]] to i16 | ||
; CHECK-NEXT: call void @sink(i16 [[TMP1]]) | ||
; CHECK-NEXT: ret void | ||
; | ||
%i0 = call i16 @isdigit(i16 0) | ||
call void @sink(i16 %i0) | ||
|
||
%i1 = call i16 @isdigit(i16 1) | ||
call void @sink(i16 %i1) | ||
|
||
; Fold isdigit('/') to 0. | ||
%i47 = call i16 @isdigit(i16 47) | ||
call void @sink(i16 %i47) | ||
|
||
; Fold isdigit('0') to 1. | ||
%i48 = call i16 @isdigit(i16 48) | ||
call void @sink(i16 %i48) | ||
|
||
; Fold isdigit('1') to 1. | ||
%i49 = call i16 @isdigit(i16 49) | ||
call void @sink(i16 %i49) | ||
|
||
; Fold isdigit('9') to 1. | ||
%i57 = call i16 @isdigit(i16 57) | ||
call void @sink(i16 %i57) | ||
|
||
; Fold isdigit(':') to 0. | ||
%i58 = call i16 @isdigit(i16 58) | ||
call void @sink(i16 %i58) | ||
|
||
%i127 = call i16 @isdigit(i16 127) | ||
call void @sink(i16 %i127) | ||
|
||
%i128 = call i16 @isdigit(i16 128) | ||
call void @sink(i16 %i128) | ||
|
||
%i255 = call i16 @isdigit(i16 255) | ||
call void @sink(i16 %i255) | ||
|
||
; Fold isdigit(256) to 0. The argument is required to be representable | ||
; in unsigned char but it's a common mistake to call the function with | ||
; other arguments and it's arguably safer to fold such calls than to | ||
; let the library call return an arbitrary value or crash. | ||
%i256 = call i16 @isdigit(i16 256) | ||
call void @sink(i16 %i256) | ||
|
||
; Same as above. | ||
%imax = call i16 @isdigit(i16 32767) | ||
call void @sink(i16 %imax) | ||
|
||
%ic = call i16 @isdigit(i16 %c) | ||
call void @sink(i16 %ic) | ||
|
||
ret void | ||
} |
Oops, something went wrong.