1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +02:00
llvm-mirror/test/Transforms/SCCP/ranges-sext.ll
Florian Hahn 932ea47fda [SCCP] Turn sext into zext for non-negative ranges.
This patch updates SCCP/IPSCCP to use the computed range info to turn
sexts into zexts, if the value is known to be non-negative. We already
to a similar transform in CorrelatedValuePropagation, but it seems like
we can catch a lot of additional cases by doing it in SCCP/IPSCCP as
well.

The transform is limited to ranges that are known to not include undef.

Currently constant ranges from conditions are treated as potentially
containing undef, due to PR46144. Once we flip this, the transform will
be more effective in practice.

Reviewers: efriedma, davide

Reviewed By: efriedma

Differential Revision: https://reviews.llvm.org/D81756
2020-06-19 10:17:55 +01:00

76 lines
2.0 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -sccp -S %s -o -| FileCheck %s
define i64 @test1_sext_op_can_be_undef(i1 %c.1, i1 %c.2) {
; CHECK-LABEL: @test1_sext_op_can_be_undef(
; CHECK-NEXT: br i1 [[C_1:%.*]], label [[TRUE_1:%.*]], label [[FALSE:%.*]]
; CHECK: true.1:
; CHECK-NEXT: br i1 [[C_2:%.*]], label [[TRUE_2:%.*]], label [[EXIT:%.*]]
; CHECK: true.2:
; CHECK-NEXT: br label [[EXIT]]
; CHECK: false:
; CHECK-NEXT: br label [[EXIT]]
; CHECK: exit:
; CHECK-NEXT: [[P:%.*]] = phi i32 [ 0, [[TRUE_1]] ], [ 1, [[TRUE_2]] ], [ undef, [[FALSE]] ]
; CHECK-NEXT: [[EXT:%.*]] = sext i32 [[P]] to i64
; CHECK-NEXT: ret i64 [[EXT]]
;
br i1 %c.1, label %true.1, label %false
true.1:
br i1 %c.2, label %true.2, label %exit
true.2:
br label %exit
false:
br label %exit
exit:
%p = phi i32 [ 0, %true.1 ], [ 1, %true.2], [ undef, %false ]
%ext = sext i32 %p to i64
ret i64 %ext
}
define i64 @test2(i32 %x) {
; CHECK-LABEL: @test2(
; CHECK-NEXT: [[P:%.*]] = and i32 [[X:%.*]], 15
; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[P]] to i64
; CHECK-NEXT: ret i64 [[TMP1]]
;
%p = and i32 %x, 15
%ext = sext i32 %p to i64
ret i64 %ext
}
define i64 @test3(i1 %c.1, i1 %c.2) {
; CHECK-LABEL: @test3(
; CHECK-NEXT: br i1 [[C_1:%.*]], label [[TRUE_1:%.*]], label [[FALSE:%.*]]
; CHECK: true.1:
; CHECK-NEXT: br i1 [[C_2:%.*]], label [[TRUE_2:%.*]], label [[EXIT:%.*]]
; CHECK: true.2:
; CHECK-NEXT: br label [[EXIT]]
; CHECK: false:
; CHECK-NEXT: br label [[EXIT]]
; CHECK: exit:
; CHECK-NEXT: [[P:%.*]] = phi i32 [ 0, [[TRUE_1]] ], [ 1, [[TRUE_2]] ], [ 3, [[FALSE]] ]
; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[P]] to i64
; CHECK-NEXT: ret i64 [[TMP1]]
;
br i1 %c.1, label %true.1, label %false
true.1:
br i1 %c.2, label %true.2, label %exit
true.2:
br label %exit
false:
br label %exit
exit:
%p = phi i32 [ 0, %true.1 ], [ 1, %true.2], [ 3, %false ]
%ext = sext i32 %p to i64
ret i64 %ext
}