mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
049b2e39fb
Same change as 0dda6333175c1749f12be660456ecedade3bcf21, but for mul expressions. We want to first fold any constant operans and then strengthen the nowrap flags, as we can compute more precise flags at that point.
44 lines
1.3 KiB
LLVM
44 lines
1.3 KiB
LLVM
; RUN: opt -analyze -enable-new-pm=0 -scalar-evolution -S < %s | FileCheck %s
|
|
; RUN: opt -disable-output "-passes=print<scalar-evolution>" -S < %s 2>&1 | FileCheck %s
|
|
|
|
define i64 @test1(i32 %a, i32 %b) {
|
|
; CHECK-LABEL: @test1
|
|
%div = udiv i32 %a, %b
|
|
%zext = zext i32 %div to i64
|
|
; CHECK: %zext
|
|
; CHECK-NEXT: --> ((zext i32 %a to i64) /u (zext i32 %b to i64))
|
|
ret i64 %zext
|
|
}
|
|
|
|
define i64 @test2(i32 %a, i32 %b) {
|
|
; CHECK-LABEL: @test2
|
|
%rem = urem i32 %a, %b
|
|
%zext = zext i32 %rem to i64
|
|
; CHECK: %zext
|
|
; CHECK-NEXT: --> ((zext i32 %a to i64) + (-1 * (zext i32 %b to i64) * ((zext i32 %a to i64) /u (zext i32 %b to i64))))
|
|
ret i64 %zext
|
|
}
|
|
|
|
define i64 @test3(i32 %a, i32 %b) {
|
|
; CHECK-LABEL: @test3
|
|
%div = udiv i32 %a, %b
|
|
%mul = mul i32 %div, %b
|
|
%sub = sub i32 %a, %mul
|
|
%zext = zext i32 %sub to i64
|
|
; CHECK: %zext
|
|
; CHECK-NEXT: --> ((zext i32 %a to i64) + (-1 * (zext i32 %b to i64) * ((zext i32 %a to i64) /u (zext i32 %b to i64))))
|
|
ret i64 %zext
|
|
}
|
|
|
|
define i64 @test4(i32 %t) {
|
|
; CHECK-LABEL: @test4
|
|
%a = udiv i32 %t, 2
|
|
%div = udiv i32 %t, 112
|
|
%mul = mul i32 %div, 56
|
|
%sub = sub i32 %a, %mul
|
|
%zext = zext i32 %sub to i64
|
|
; CHECK: %zext
|
|
; CHECK-NEXT: --> ((-56 * ((zext i32 %t to i64) /u 112))<nsw> + ((zext i32 %t to i64) /u 2))
|
|
ret i64 %zext
|
|
}
|