1*9880d681SAndroid Build Coastguard Worker; RUN: llc %s -O0 -march=sparc -mcpu=ut699 -o - | FileCheck %s -check-prefix=NO_ROUND_FUNC 2*9880d681SAndroid Build Coastguard Worker; RUN: llc %s -O0 -march=sparc -mcpu=leon3 -mattr=+prvntroundchange -o - | FileCheck %s -check-prefix=NO_ROUND_FUNC 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; RUN: llc %s -O0 -march=sparc -mcpu=ut699 -mattr=-prvntroundchange -o - | FileCheck %s -check-prefix=ROUND_FUNC 5*9880d681SAndroid Build Coastguard Worker; RUN: llc %s -O0 -march=sparc -mcpu=leon3 -o - | FileCheck %s -check-prefix=ROUND_FUNC 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; NO_ROUND_FUNC-LABEL: test_round_change 9*9880d681SAndroid Build Coastguard Worker; NO_ROUND_FUNC-NOT: fesetround 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker; ROUND_FUNC-LABEL: test_round_change 12*9880d681SAndroid Build Coastguard Worker; ROUND_FUNC: fesetround 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; ModuleID = '<stdin>' 15*9880d681SAndroid Build Coastguard Workertarget datalayout = "E-m:e-p:32:32-i64:64-f128:64-n32-S64" 16*9880d681SAndroid Build Coastguard Workertarget triple = "sparc-unknown--eabi" 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker@.str = private unnamed_addr constant [17 x i8] c"-((-a)*b) != a*b\00", align 1 19*9880d681SAndroid Build Coastguard Worker@.str.1 = private unnamed_addr constant [7 x i8] c"test.c\00", align 1 20*9880d681SAndroid Build Coastguard Worker@__PRETTY_FUNCTION__.mult = private unnamed_addr constant [12 x i8] c"void mult()\00", align 1 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind 23*9880d681SAndroid Build Coastguard Workerdefine void @test_round_change() #0 { 24*9880d681SAndroid Build Coastguard Workerentry: 25*9880d681SAndroid Build Coastguard Worker %a = alloca double, align 8 26*9880d681SAndroid Build Coastguard Worker %b = alloca double, align 8 27*9880d681SAndroid Build Coastguard Worker %x = alloca float, align 4 28*9880d681SAndroid Build Coastguard Worker store double 1.100000e+00, double* %a, align 8 29*9880d681SAndroid Build Coastguard Worker store double 1.010000e+01, double* %b, align 8 30*9880d681SAndroid Build Coastguard Worker store float 0x400921FA00000000, float* %x, align 4 31*9880d681SAndroid Build Coastguard Worker %call = call i32 @fesetround(i32 2048) #2 32*9880d681SAndroid Build Coastguard Worker %0 = load double, double* %a, align 8 33*9880d681SAndroid Build Coastguard Worker %sub = fsub double -0.000000e+00, %0 34*9880d681SAndroid Build Coastguard Worker %1 = load double, double* %b, align 8 35*9880d681SAndroid Build Coastguard Worker %mul = fmul double %sub, %1 36*9880d681SAndroid Build Coastguard Worker %sub1 = fsub double -0.000000e+00, %mul 37*9880d681SAndroid Build Coastguard Worker %2 = load double, double* %a, align 8 38*9880d681SAndroid Build Coastguard Worker %3 = load double, double* %b, align 8 39*9880d681SAndroid Build Coastguard Worker %mul2 = fmul double %2, %3 40*9880d681SAndroid Build Coastguard Worker %cmp = fcmp une double %sub1, %mul2 41*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %cond.true, label %cond.false 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workercond.true: ; preds = %entry 44*9880d681SAndroid Build Coastguard Worker br label %cond.end 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workercond.false: ; preds = %entry 47*9880d681SAndroid Build Coastguard Worker call void @__assert_fail(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0), i32 10, i8* getelementptr inbounds ([12 x i8], [12 x i8]* @__PRETTY_FUNCTION__.mult, i32 0, i32 0)) #3 48*9880d681SAndroid Build Coastguard Worker unreachable 49*9880d681SAndroid Build Coastguard Worker ; No predecessors! 50*9880d681SAndroid Build Coastguard Worker br label %cond.end 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workercond.end: ; preds = %4, %cond.true 53*9880d681SAndroid Build Coastguard Worker ret void 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind 57*9880d681SAndroid Build Coastguard Workerdeclare i32 @fesetround(i32) #0 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker; Function Attrs: noreturn nounwind 60*9880d681SAndroid Build Coastguard Workerdeclare void @__assert_fail(i8*, i8*, i32, i8*) #1 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } 63*9880d681SAndroid Build Coastguard Workerattributes #1 = { noreturn nounwind "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } 64*9880d681SAndroid Build Coastguard Workerattributes #2 = { nounwind } 65*9880d681SAndroid Build Coastguard Workerattributes #3 = { noreturn nounwind }