xref: /aosp_15_r20/external/llvm/test/CodeGen/SPARC/LeonPreventRoundChangePassUT.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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 }