mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 04:30:12 +00:00
[Reassociate] Better preserve NSW/NUW flags.
Part of PR12985. Phabricator Revision: http://reviews.llvm.org/D6172 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221555 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6faf6b1833
commit
bcdc4769f4
@ -1031,8 +1031,19 @@ static BinaryOperator *ConvertShiftToMul(Instruction *Shl) {
|
||||
BinaryOperator::CreateMul(Shl->getOperand(0), MulCst, "", Shl);
|
||||
Shl->setOperand(0, UndefValue::get(Shl->getType())); // Drop use of op.
|
||||
Mul->takeName(Shl);
|
||||
|
||||
// Everyone now refers to the mul instruction.
|
||||
Shl->replaceAllUsesWith(Mul);
|
||||
Mul->setDebugLoc(Shl->getDebugLoc());
|
||||
|
||||
// We can safely preserve the nuw flag in all cases. It's also safe to turn a
|
||||
// nuw nsw shl into a nuw nsw mul. However, nsw in isolation requires special
|
||||
// handling.
|
||||
bool NSW = cast<BinaryOperator>(Shl)->hasNoSignedWrap();
|
||||
bool NUW = cast<BinaryOperator>(Shl)->hasNoUnsignedWrap();
|
||||
if (NSW && NUW)
|
||||
Mul->setHasNoSignedWrap(true);
|
||||
Mul->setHasNoUnsignedWrap(NUW);
|
||||
return Mul;
|
||||
}
|
||||
|
||||
|
34
test/Transforms/Reassociate/wrap-flags.ll
Normal file
34
test/Transforms/Reassociate/wrap-flags.ll
Normal file
@ -0,0 +1,34 @@
|
||||
; RUN: opt < %s -reassociate -dce -S | FileCheck %s
|
||||
; PR12985
|
||||
|
||||
; Verify the nsw flags are preserved when converting shl to mul.
|
||||
|
||||
; CHECK-LABEL: @shl_to_mul_nsw(
|
||||
; CHECK: %mul = mul i32 %i, -2147483648
|
||||
; CHECK: %mul2 = add i32 %mul, 1
|
||||
define i32 @shl_to_mul_nsw(i32 %i) {
|
||||
entry:
|
||||
%mul = shl nsw i32 %i, 31
|
||||
%mul2 = add i32 %mul, 1
|
||||
ret i32 %mul2
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @shl_to_mul_nuw(
|
||||
; CHECK: %mul = mul nuw i32 %i, 4
|
||||
; CHECK: %mul2 = add i32 %mul, 1
|
||||
define i32 @shl_to_mul_nuw(i32 %i) {
|
||||
entry:
|
||||
%mul = shl nuw i32 %i, 2
|
||||
%mul2 = add i32 %mul, 1
|
||||
ret i32 %mul2
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @shl_to_mul_nuw_nsw(
|
||||
; CHECK: %mul = mul nuw nsw i32 %i, 4
|
||||
; CHECK: %mul2 = add i32 %mul, 1
|
||||
define i32 @shl_to_mul_nuw_nsw(i32 %i) {
|
||||
entry:
|
||||
%mul = shl nuw nsw i32 %i, 2
|
||||
%mul2 = add i32 %mul, 1
|
||||
ret i32 %mul2
|
||||
}
|
Loading…
Reference in New Issue
Block a user