mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
Instruction::isAssociative() returns true for fmul/fadd if they are tagged "unsafe" mode.
Approved by: Eli and Michael. llvm-svn: 168848
This commit is contained in:
parent
9dbb7d3582
commit
106133b571
@ -253,7 +253,7 @@ public:
|
||||
///
|
||||
/// In LLVM, the Add, Mul, And, Or, and Xor operators are associative.
|
||||
///
|
||||
bool isAssociative() const { return isAssociative(getOpcode()); }
|
||||
bool isAssociative() const;
|
||||
static bool isAssociative(unsigned op);
|
||||
|
||||
/// isCommutative - Return true if the instruction is commutative:
|
||||
|
@ -468,6 +468,20 @@ bool Instruction::isAssociative(unsigned Opcode) {
|
||||
Opcode == Add || Opcode == Mul;
|
||||
}
|
||||
|
||||
bool Instruction::isAssociative() const {
|
||||
unsigned Opcode = getOpcode();
|
||||
if (isAssociative(Opcode))
|
||||
return true;
|
||||
|
||||
switch (Opcode) {
|
||||
case FMul:
|
||||
case FAdd:
|
||||
return cast<FPMathOperator>(this)->hasUnsafeAlgebra();
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// isCommutative - Return true if the instruction is commutative:
|
||||
///
|
||||
/// Commutative operators satisfy: (x op y) === (y op x)
|
||||
|
32
test/Transforms/InstCombine/fast-math.ll
Normal file
32
test/Transforms/InstCombine/fast-math.ll
Normal file
@ -0,0 +1,32 @@
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
|
||||
; testing-case "float fold(float a) { return 1.2f * a * 2.3f; }"
|
||||
; 1.2f and 2.3f is supposed to be fold.
|
||||
define float @fold(float %a) {
|
||||
fold:
|
||||
%mul = fmul fast float %a, 0x3FF3333340000000
|
||||
%mul1 = fmul fast float %mul, 0x4002666660000000
|
||||
ret float %mul1
|
||||
; CHECK: fold
|
||||
; CHECK: fmul float %a, 0x4006147AE0000000
|
||||
}
|
||||
|
||||
; Same testing-case as the one used in fold() except that the operators have
|
||||
; fixed FP mode.
|
||||
define float @notfold(float %a) {
|
||||
notfold:
|
||||
; CHECK: notfold
|
||||
; CHECK: %mul = fmul fast float %a, 0x3FF3333340000000
|
||||
%mul = fmul fast float %a, 0x3FF3333340000000
|
||||
%mul1 = fmul float %mul, 0x4002666660000000
|
||||
ret float %mul1
|
||||
}
|
||||
|
||||
define float @fold2(float %a) {
|
||||
notfold2:
|
||||
; CHECK: fold2
|
||||
; CHECK: fmul float %a, 0x4006147AE0000000
|
||||
%mul = fmul float %a, 0x3FF3333340000000
|
||||
%mul1 = fmul fast float %mul, 0x4002666660000000
|
||||
ret float %mul1
|
||||
}
|
Loading…
Reference in New Issue
Block a user