mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 12:19:53 +00:00
56f90d72c8
This patch fixes PR30366. Function foldUDivShl() worked under the assumption that one of the values in input to the function was always an instance of llvm::Instruction. However, function visitUDivOperand() (the only user of foldUDivShl) was clearly violating that precondition; internally, visitUDivOperand() uses pattern matches to check the operands of a udiv. Pattern matchers for binary operators know how to handle both Instruction and ConstantExpr values. This patch fixes the problem in foldUDivShl(). Now we use pattern matchers instead of explicit casts to Instruction. The reduced test case from PR30366 has been added to test file InstCombine/udiv-simplify.ll. Differential Revision: https://reviews.llvm.org/D24565 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@282398 91177308-0d34-0410-b5e6-96231b3b80d8
65 lines
1.7 KiB
LLVM
65 lines
1.7 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -instcombine -S | FileCheck %s
|
|
|
|
define i64 @test1(i32 %x) nounwind {
|
|
; CHECK-LABEL: @test1(
|
|
; CHECK-NEXT: ret i64 0
|
|
;
|
|
%y = lshr i32 %x, 1
|
|
%r = udiv i32 %y, -1
|
|
%z = sext i32 %r to i64
|
|
ret i64 %z
|
|
}
|
|
define i64 @test2(i32 %x) nounwind {
|
|
; CHECK-LABEL: @test2(
|
|
; CHECK-NEXT: ret i64 0
|
|
;
|
|
%y = lshr i32 %x, 31
|
|
%r = udiv i32 %y, 3
|
|
%z = sext i32 %r to i64
|
|
ret i64 %z
|
|
}
|
|
|
|
; The udiv instructions shouldn't be optimized away, and the
|
|
; sext instructions should be optimized to zext.
|
|
|
|
define i64 @test1_PR2274(i32 %x, i32 %g) nounwind {
|
|
; CHECK-LABEL: @test1_PR2274(
|
|
; CHECK-NEXT: [[Y:%.*]] = lshr i32 %x, 30
|
|
; CHECK-NEXT: [[R:%.*]] = udiv i32 [[Y]], %g
|
|
; CHECK-NEXT: [[Z1:%.*]] = zext i32 [[R]] to i64
|
|
; CHECK-NEXT: ret i64 [[Z1]]
|
|
;
|
|
%y = lshr i32 %x, 30
|
|
%r = udiv i32 %y, %g
|
|
%z = sext i32 %r to i64
|
|
ret i64 %z
|
|
}
|
|
define i64 @test2_PR2274(i32 %x, i32 %v) nounwind {
|
|
; CHECK-LABEL: @test2_PR2274(
|
|
; CHECK-NEXT: [[Y:%.*]] = lshr i32 %x, 31
|
|
; CHECK-NEXT: [[R:%.*]] = udiv i32 [[Y]], %v
|
|
; CHECK-NEXT: [[Z1:%.*]] = zext i32 [[R]] to i64
|
|
; CHECK-NEXT: ret i64 [[Z1]]
|
|
;
|
|
%y = lshr i32 %x, 31
|
|
%r = udiv i32 %y, %v
|
|
%z = sext i32 %r to i64
|
|
ret i64 %z
|
|
}
|
|
|
|
; The udiv should be simplified according to the rule:
|
|
; X udiv (C1 << N), where C1 is `1<<C2` --> X >> (N+C2)
|
|
@b = external global [1 x i16]
|
|
|
|
define i32 @PR30366(i1 %a) {
|
|
; CHECK-LABEL: @PR30366(
|
|
; CHECK-NEXT: [[Z:%.*]] = zext i1 %a to i32
|
|
; CHECK-NEXT: [[D:%.*]] = lshr i32 [[Z]], zext (i16 ptrtoint ([1 x i16]* @b to i16) to i32)
|
|
; CHECK-NEXT: ret i32 [[D]]
|
|
;
|
|
%z = zext i1 %a to i32
|
|
%d = udiv i32 %z, zext (i16 shl (i16 1, i16 ptrtoint ([1 x i16]* @b to i16)) to i32)
|
|
ret i32 %d
|
|
}
|