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