Skip to content

Commit

Permalink
Instruction::isAssociative() returns true for fmul/fadd if they are t…
Browse files Browse the repository at this point in the history
…agged "unsafe" mode.

Approved by: Eli and Michael.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@168848 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Shuxin Yang committed Nov 29, 2012
1 parent 89bea17 commit 9b7f6f2
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 1 deletion.
2 changes: 1 addition & 1 deletion include/llvm/Instruction.h
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ class Instruction : public User, public ilist_node<Instruction> {
///
/// 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:
Expand Down
14 changes: 14 additions & 0 deletions lib/VMCore/Instruction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
32 changes: 32 additions & 0 deletions test/Transforms/InstCombine/fast-math.ll
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit 9b7f6f2

Please sign in to comment.