xref: /llvm-project/llvm/test/Transforms/EarlyCSE/tfpropagation.ll (revision ac696ac4530fb3df626195e94e83649bf7114754)
125a83005SKevin P. Neal; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*ac696ac4SBjorn Pettersson; RUN: opt < %s -S -passes=early-cse -earlycse-debug-hash | FileCheck %s
3c384b20bSArthur Eubanks; RUN: opt < %s -S -passes='early-cse<memssa>' | FileCheck %s
425a83005SKevin P. Neal
525a83005SKevin P. Nealdefine i64 @branching_int(i32 %a) {
625a83005SKevin P. Neal; CHECK-LABEL: @branching_int(
725a83005SKevin P. Neal; CHECK-NEXT:    [[CONV1:%.*]] = zext i32 [[A:%.*]] to i64
825a83005SKevin P. Neal; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt i64 1, [[CONV1]]
925a83005SKevin P. Neal; CHECK-NEXT:    br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_END3:%.*]]
1025a83005SKevin P. Neal; CHECK:       if.then3:
1125a83005SKevin P. Neal; CHECK-NEXT:    [[C:%.*]] = call double @truefunc.f64.i1(i1 true)
1225a83005SKevin P. Neal; CHECK-NEXT:    br label [[OUT:%.*]]
1325a83005SKevin P. Neal; CHECK:       if.end3:
1425a83005SKevin P. Neal; CHECK-NEXT:    [[D:%.*]] = call double @falsefunc.f64.i1(i1 false)
1525a83005SKevin P. Neal; CHECK-NEXT:    br label [[OUT]]
1625a83005SKevin P. Neal; CHECK:       out:
1725a83005SKevin P. Neal; CHECK-NEXT:    ret i64 [[CONV1]]
1825a83005SKevin P. Neal;
1925a83005SKevin P. Neal  %conv1 = zext i32 %a to i64
2025a83005SKevin P. Neal  %cmp2 = icmp ugt i64 1, %conv1
2125a83005SKevin P. Neal  br i1 %cmp2, label %if.then3, label %if.end3
2225a83005SKevin P. Neal
2325a83005SKevin P. Nealif.then3:
2425a83005SKevin P. Neal  %c = call double @truefunc.f64.i1(i1 %cmp2)
2525a83005SKevin P. Neal  br label %out
2625a83005SKevin P. Neal
2725a83005SKevin P. Nealif.end3:
2825a83005SKevin P. Neal  %d = call double @falsefunc.f64.i1(i1 %cmp2)
2925a83005SKevin P. Neal  br label %out
3025a83005SKevin P. Neal
3125a83005SKevin P. Nealout:
3225a83005SKevin P. Neal  ret i64 %conv1
3325a83005SKevin P. Neal}
3425a83005SKevin P. Neal
3525a83005SKevin P. Nealdefine double @branching_fp(i64 %a) {
3625a83005SKevin P. Neal; CHECK-LABEL: @branching_fp(
3725a83005SKevin P. Neal; CHECK-NEXT:    [[CONV1:%.*]] = uitofp i64 [[A:%.*]] to double
3825a83005SKevin P. Neal; CHECK-NEXT:    [[CMP2:%.*]] = fcmp ogt double 1.000000e+00, [[CONV1]]
3925a83005SKevin P. Neal; CHECK-NEXT:    br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_END3:%.*]]
4025a83005SKevin P. Neal; CHECK:       if.then3:
4125a83005SKevin P. Neal; CHECK-NEXT:    [[C:%.*]] = call double @truefunc.f64.i1(i1 true)
4225a83005SKevin P. Neal; CHECK-NEXT:    br label [[OUT:%.*]]
4325a83005SKevin P. Neal; CHECK:       if.end3:
4425a83005SKevin P. Neal; CHECK-NEXT:    [[D:%.*]] = call double @falsefunc.f64.i1(i1 false)
4525a83005SKevin P. Neal; CHECK-NEXT:    br label [[OUT]]
4625a83005SKevin P. Neal; CHECK:       out:
4725a83005SKevin P. Neal; CHECK-NEXT:    ret double [[CONV1]]
4825a83005SKevin P. Neal;
4925a83005SKevin P. Neal  %conv1 = uitofp i64 %a to double
5025a83005SKevin P. Neal  %cmp2 = fcmp ogt double 1.000000e+00, %conv1
5125a83005SKevin P. Neal  br i1 %cmp2, label %if.then3, label %if.end3
5225a83005SKevin P. Neal
5325a83005SKevin P. Nealif.then3:
5425a83005SKevin P. Neal  %c = call double @truefunc.f64.i1(i1 %cmp2)
5525a83005SKevin P. Neal  br label %out
5625a83005SKevin P. Neal
5725a83005SKevin P. Nealif.end3:
5825a83005SKevin P. Neal  %d = call double @falsefunc.f64.i1(i1 %cmp2)
5925a83005SKevin P. Neal  br label %out
6025a83005SKevin P. Neal
6125a83005SKevin P. Nealout:
6225a83005SKevin P. Neal  ret double %conv1
6325a83005SKevin P. Neal}
6425a83005SKevin P. Neal
6525a83005SKevin P. Nealdefine double @branching_exceptignore(i64 %a) #0 {
6625a83005SKevin P. Neal; CHECK-LABEL: @branching_exceptignore(
6725a83005SKevin P. Neal; CHECK-NEXT:    [[CONV1:%.*]] = call double @llvm.experimental.constrained.uitofp.f64.i64(i64 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0:[0-9]+]]
6825a83005SKevin P. Neal; CHECK-NEXT:    [[CMP2:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double 1.000000e+00, double [[CONV1]], metadata !"ogt", metadata !"fpexcept.ignore") #[[ATTR0]]
6925a83005SKevin P. Neal; CHECK-NEXT:    br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_END3:%.*]]
7025a83005SKevin P. Neal; CHECK:       if.then3:
7125a83005SKevin P. Neal; CHECK-NEXT:    [[C:%.*]] = call double @truefunc.f64.i1(i1 true) #[[ATTR0]]
7225a83005SKevin P. Neal; CHECK-NEXT:    br label [[OUT:%.*]]
7325a83005SKevin P. Neal; CHECK:       if.end3:
7425a83005SKevin P. Neal; CHECK-NEXT:    [[D:%.*]] = call double @falsefunc.f64.i1(i1 false) #[[ATTR0]]
7525a83005SKevin P. Neal; CHECK-NEXT:    br label [[OUT]]
7625a83005SKevin P. Neal; CHECK:       out:
7725a83005SKevin P. Neal; CHECK-NEXT:    ret double [[CONV1]]
7825a83005SKevin P. Neal;
7925a83005SKevin P. Neal  %conv1 = call double @llvm.experimental.constrained.uitofp.f64.i64(i64 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
8025a83005SKevin P. Neal  %cmp2 = call i1 @llvm.experimental.constrained.fcmps.f64(double 1.000000e+00, double %conv1, metadata !"ogt", metadata !"fpexcept.ignore") #0
8125a83005SKevin P. Neal  br i1 %cmp2, label %if.then3, label %if.end3
8225a83005SKevin P. Neal
8325a83005SKevin P. Nealif.then3:
8425a83005SKevin P. Neal  %c = call double @truefunc.f64.i1(i1 %cmp2) #0
8525a83005SKevin P. Neal  br label %out
8625a83005SKevin P. Neal
8725a83005SKevin P. Nealif.end3:
8825a83005SKevin P. Neal  %d = call double @falsefunc.f64.i1(i1 %cmp2) #0
8925a83005SKevin P. Neal  br label %out
9025a83005SKevin P. Neal
9125a83005SKevin P. Nealout:
9225a83005SKevin P. Neal  ret double %conv1
9325a83005SKevin P. Neal}
9425a83005SKevin P. Neal
9525a83005SKevin P. Nealdefine double @branching_exceptignore_dynround(i64 %a) #0 {
9625a83005SKevin P. Neal; CHECK-LABEL: @branching_exceptignore_dynround(
9725a83005SKevin P. Neal; CHECK-NEXT:    [[CONV1:%.*]] = call double @llvm.experimental.constrained.uitofp.f64.i64(i64 [[A:%.*]], metadata !"round.dynamic", metadata !"fpexcept.ignore") #[[ATTR0]]
9825a83005SKevin P. Neal; CHECK-NEXT:    [[CMP2:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double 1.000000e+00, double [[CONV1]], metadata !"ogt", metadata !"fpexcept.ignore") #[[ATTR0]]
9925a83005SKevin P. Neal; CHECK-NEXT:    br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_END3:%.*]]
10025a83005SKevin P. Neal; CHECK:       if.then3:
10125a83005SKevin P. Neal; CHECK-NEXT:    [[C:%.*]] = call double @truefunc.f64.i1(i1 true) #[[ATTR0]]
10225a83005SKevin P. Neal; CHECK-NEXT:    br label [[OUT:%.*]]
10325a83005SKevin P. Neal; CHECK:       if.end3:
10425a83005SKevin P. Neal; CHECK-NEXT:    [[D:%.*]] = call double @falsefunc.f64.i1(i1 false) #[[ATTR0]]
10525a83005SKevin P. Neal; CHECK-NEXT:    br label [[OUT]]
10625a83005SKevin P. Neal; CHECK:       out:
10725a83005SKevin P. Neal; CHECK-NEXT:    ret double [[CONV1]]
10825a83005SKevin P. Neal;
10925a83005SKevin P. Neal  %conv1 = call double @llvm.experimental.constrained.uitofp.f64.i64(i64 %a, metadata !"round.dynamic", metadata !"fpexcept.ignore") #0
11025a83005SKevin P. Neal  %cmp2 = call i1 @llvm.experimental.constrained.fcmps.f64(double 1.000000e+00, double %conv1, metadata !"ogt", metadata !"fpexcept.ignore") #0
11125a83005SKevin P. Neal  br i1 %cmp2, label %if.then3, label %if.end3
11225a83005SKevin P. Neal
11325a83005SKevin P. Nealif.then3:
11425a83005SKevin P. Neal  %c = call double @truefunc.f64.i1(i1 %cmp2) #0
11525a83005SKevin P. Neal  br label %out
11625a83005SKevin P. Neal
11725a83005SKevin P. Nealif.end3:
11825a83005SKevin P. Neal  %d = call double @falsefunc.f64.i1(i1 %cmp2) #0
11925a83005SKevin P. Neal  br label %out
12025a83005SKevin P. Neal
12125a83005SKevin P. Nealout:
12225a83005SKevin P. Neal  ret double %conv1
12325a83005SKevin P. Neal}
12425a83005SKevin P. Neal
12525a83005SKevin P. Nealdefine double @branching_maytrap(i64 %a) #0 {
12625a83005SKevin P. Neal; CHECK-LABEL: @branching_maytrap(
12725a83005SKevin P. Neal; CHECK-NEXT:    [[CONV1:%.*]] = call double @llvm.experimental.constrained.uitofp.f64.i64(i64 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.maytrap") #[[ATTR0]]
12825a83005SKevin P. Neal; CHECK-NEXT:    [[CMP2:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double 1.000000e+00, double [[CONV1]], metadata !"ogt", metadata !"fpexcept.maytrap") #[[ATTR0]]
12925a83005SKevin P. Neal; CHECK-NEXT:    br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_END3:%.*]]
13025a83005SKevin P. Neal; CHECK:       if.then3:
13105ac82deSKevin P. Neal; CHECK-NEXT:    [[C:%.*]] = call double @truefunc.f64.i1(i1 true) #[[ATTR0]]
13205ac82deSKevin P. Neal; CHECK-NEXT:    br label [[OUT:%.*]]
13305ac82deSKevin P. Neal; CHECK:       if.end3:
13405ac82deSKevin P. Neal; CHECK-NEXT:    [[D:%.*]] = call double @falsefunc.f64.i1(i1 false) #[[ATTR0]]
13505ac82deSKevin P. Neal; CHECK-NEXT:    br label [[OUT]]
13605ac82deSKevin P. Neal; CHECK:       out:
13705ac82deSKevin P. Neal; CHECK-NEXT:    ret double [[CONV1]]
13805ac82deSKevin P. Neal;
13905ac82deSKevin P. Neal  %conv1 = call double @llvm.experimental.constrained.uitofp.f64.i64(i64 %a, metadata !"round.tonearest", metadata !"fpexcept.maytrap") #0
14005ac82deSKevin P. Neal  %cmp2 = call i1 @llvm.experimental.constrained.fcmps.f64(double 1.000000e+00, double %conv1, metadata !"ogt", metadata !"fpexcept.maytrap") #0
14105ac82deSKevin P. Neal  br i1 %cmp2, label %if.then3, label %if.end3
14205ac82deSKevin P. Neal
14305ac82deSKevin P. Nealif.then3:
14405ac82deSKevin P. Neal  %c = call double @truefunc.f64.i1(i1 %cmp2) #0
14505ac82deSKevin P. Neal  br label %out
14605ac82deSKevin P. Neal
14705ac82deSKevin P. Nealif.end3:
14805ac82deSKevin P. Neal  %d = call double @falsefunc.f64.i1(i1 %cmp2) #0
14905ac82deSKevin P. Neal  br label %out
15005ac82deSKevin P. Neal
15105ac82deSKevin P. Nealout:
15205ac82deSKevin P. Neal  ret double %conv1
15305ac82deSKevin P. Neal}
15405ac82deSKevin P. Neal
15505ac82deSKevin P. Neal; TODO: Fix this optimization so it works with strict exception behavior.
15605ac82deSKevin P. Neal; TODO: This may or may not be worth the added complication and risk.
15705ac82deSKevin P. Nealdefine double @branching_ebstrict(i64 %a) #0 {
15805ac82deSKevin P. Neal; CHECK-LABEL: @branching_ebstrict(
15905ac82deSKevin P. Neal; CHECK-NEXT:    [[CONV1:%.*]] = call double @llvm.experimental.constrained.uitofp.f64.i64(i64 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]
16005ac82deSKevin P. Neal; CHECK-NEXT:    [[CMP2:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double 1.000000e+00, double [[CONV1]], metadata !"ogt", metadata !"fpexcept.strict") #[[ATTR0]]
16105ac82deSKevin P. Neal; CHECK-NEXT:    br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_END3:%.*]]
16205ac82deSKevin P. Neal; CHECK:       if.then3:
16325a83005SKevin P. Neal; CHECK-NEXT:    [[C:%.*]] = call double @truefunc.f64.i1(i1 [[CMP2]]) #[[ATTR0]]
16425a83005SKevin P. Neal; CHECK-NEXT:    br label [[OUT:%.*]]
16525a83005SKevin P. Neal; CHECK:       if.end3:
16625a83005SKevin P. Neal; CHECK-NEXT:    [[D:%.*]] = call double @falsefunc.f64.i1(i1 [[CMP2]]) #[[ATTR0]]
16725a83005SKevin P. Neal; CHECK-NEXT:    br label [[OUT]]
16825a83005SKevin P. Neal; CHECK:       out:
16925a83005SKevin P. Neal; CHECK-NEXT:    ret double [[CONV1]]
17025a83005SKevin P. Neal;
17105ac82deSKevin P. Neal  %conv1 = call double @llvm.experimental.constrained.uitofp.f64.i64(i64 %a, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
17205ac82deSKevin P. Neal  %cmp2 = call i1 @llvm.experimental.constrained.fcmps.f64(double 1.000000e+00, double %conv1, metadata !"ogt", metadata !"fpexcept.strict") #0
17325a83005SKevin P. Neal  br i1 %cmp2, label %if.then3, label %if.end3
17425a83005SKevin P. Neal
17525a83005SKevin P. Nealif.then3:
17625a83005SKevin P. Neal  %c = call double @truefunc.f64.i1(i1 %cmp2) #0
17725a83005SKevin P. Neal  br label %out
17825a83005SKevin P. Neal
17925a83005SKevin P. Nealif.end3:
18025a83005SKevin P. Neal  %d = call double @falsefunc.f64.i1(i1 %cmp2) #0
18125a83005SKevin P. Neal  br label %out
18225a83005SKevin P. Neal
18325a83005SKevin P. Nealout:
18425a83005SKevin P. Neal  ret double %conv1
18525a83005SKevin P. Neal}
18625a83005SKevin P. Neal
18725a83005SKevin P. Nealdeclare double @truefunc.f64.i1(i1)
18825a83005SKevin P. Nealdeclare double @falsefunc.f64.i1(i1)
18925a83005SKevin P. Nealdeclare double @llvm.experimental.constrained.uitofp.f64.i64(i64, metadata, metadata) #0
19025a83005SKevin P. Nealdeclare i1 @llvm.experimental.constrained.fcmps.f64(double, double, metadata, metadata) #0
19125a83005SKevin P. Neal
19225a83005SKevin P. Nealattributes #0 = { strictfp }
19325a83005SKevin P. Neal
19425a83005SKevin P. Nealdeclare <4 x float> @llvm.experimental.constrained.fadd.v4f32(<4 x float>, <4 x float>, metadata, metadata) strictfp
195