Sinking comparisons in CGP can undo the job of hoisting them done earlier by LICM, and soft-FP makes this an expensive mistake. A common pattern that produces floating point comparisons uniform over a loop is an explicit check for division by zero. If the divisor is hoisted out of the loop, the comparison can also be, but hoisting the function that unwinds is never legal, since it may cause side effects in the loop body prior to the unwinding to not be executed. Differential Revision: http://reviews.llvm.org/D18744 llvm-svn: 265264
30 lines
803 B
LLVM
30 lines
803 B
LLVM
; RUN: opt %s -codegenprepare -mattr=+soft-float -S | FileCheck %s -check-prefix=CHECK -check-prefix=SOFTFP
|
|
; RUN: opt %s -codegenprepare -mattr=-soft-float -S | FileCheck %s -check-prefix=CHECK -check-prefix=HARDFP
|
|
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-unknown-linux-gnu"
|
|
|
|
; CHECK-LABEL: @foo
|
|
; CHECK: entry:
|
|
; SOFTFP: fcmp
|
|
; HARDFP-NOT: fcmp
|
|
; CHECK: body:
|
|
; SOFTFP-NOT: fcmp
|
|
; HARDFP: fcmp
|
|
define void @foo(float %a, float %b) {
|
|
entry:
|
|
%c = fcmp oeq float %a, %b
|
|
br label %head
|
|
head:
|
|
%IND = phi i32 [ 0, %entry ], [ %IND.new, %body1 ]
|
|
%CMP = icmp slt i32 %IND, 1250
|
|
br i1 %CMP, label %body, label %tail
|
|
body:
|
|
br i1 %c, label %body1, label %tail
|
|
body1:
|
|
%IND.new = add i32 %IND, 1
|
|
br label %head
|
|
tail:
|
|
ret void
|
|
}
|