149 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 62; RUN: opt %s -S -riscv-promote-const -mtriple=riscv64 -mattr=+d | FileCheck %s3 4; No promotion should take place, as the pass skips floats.5define float @multiple_floats(float %a, float %b) {6; CHECK-LABEL: define float @multiple_floats(7; CHECK-SAME: float [[A:%.*]], float [[B:%.*]]) #[[ATTR0:[0-9]+]] {8; CHECK-NEXT: [[ENTRY:.*:]]9; CHECK-NEXT: [[ADD1:%.*]] = fadd float [[A]], 1.000000e+0010; CHECK-NEXT: [[ADD2:%.*]] = fadd float [[B]], 2.000000e+0011; CHECK-NEXT: [[SUM_F:%.*]] = fadd float [[ADD1]], [[ADD2]]12; CHECK-NEXT: ret float [[SUM_F]]13;14entry:15 %add1 = fadd float %a, 1.016 %add2 = fadd float %b, 2.017 %sum_f = fadd float %add1, %add218 ret float %sum_f19}20 21; No promotion should take place as cases with a single constant are skipped.22define double @single_double(double %a) {23; CHECK-LABEL: define double @single_double(24; CHECK-SAME: double [[A:%.*]]) #[[ATTR0]] {25; CHECK-NEXT: [[ENTRY:.*:]]26; CHECK-NEXT: [[ADD:%.*]] = fadd double [[A]], 4.210000e+0127; CHECK-NEXT: ret double [[ADD]]28;29entry:30 %add = fadd double %a, 42.131 ret double %add32}33 34; Promotion should happen as we have at least two unique constants that would35; otherwise go in the constant pool.36define double @multiple_doubles(double %a, double %b) {37; CHECK-LABEL: define double @multiple_doubles(38; CHECK-SAME: double [[A:%.*]], double [[B:%.*]]) #[[ATTR0]] {39; CHECK-NEXT: [[ENTRY:.*:]]40; CHECK-NEXT: [[DOUBLE_VAL1:%.*]] = load double, ptr getelementptr inbounds ([2 x double], ptr @.promoted_doubles.multiple_doubles, i64 0, i64 1), align 841; CHECK-NEXT: [[ADD3:%.*]] = load double, ptr @.promoted_doubles.multiple_doubles, align 842; CHECK-NEXT: [[ADD2:%.*]] = fadd double [[A]], [[ADD3]]43; CHECK-NEXT: [[ADD4:%.*]] = fadd double [[B]], [[DOUBLE_VAL1]]44; CHECK-NEXT: [[SUM:%.*]] = fadd double [[ADD2]], [[ADD3]]45; CHECK-NEXT: [[SUM1:%.*]] = fadd double [[ADD4]], [[SUM]]46; CHECK-NEXT: ret double [[SUM1]]47;48entry:49 %add1 = fadd double %a, 2.71850 %add2 = fadd double %b, 42.151 %add3 = fadd double %add1, 2.71852 %sum = fadd double %add2, %add353 ret double %sum54}55 56; Promotion should not happen as the constants will be materialised rather57; than using the constant pool.58define double @multiple_doubles_no_promote(double %a, double %b) {59; CHECK-LABEL: define double @multiple_doubles_no_promote(60; CHECK-SAME: double [[A:%.*]], double [[B:%.*]]) #[[ATTR0]] {61; CHECK-NEXT: [[ENTRY:.*:]]62; CHECK-NEXT: [[ADD1:%.*]] = fadd double [[A]], 1.000000e+0063; CHECK-NEXT: [[ADD2:%.*]] = fadd double [[B]], 2.000000e+0064; CHECK-NEXT: [[ADD3:%.*]] = fadd double [[ADD1]], 1.000000e+0065; CHECK-NEXT: [[SUM:%.*]] = fadd double [[ADD2]], [[ADD3]]66; CHECK-NEXT: ret double [[SUM]]67;68entry:69 %add1 = fadd double %a, 1.070 %add2 = fadd double %b, 2.071 %add3 = fadd double %add1, 1.072 %sum = fadd double %add2, %add373 ret double %sum74}75 76; The same constant shouldn't be loaded more than once per BB.77define double @multiple_doubles_multi_bb(double %a, i1 %cond) {78; CHECK-LABEL: define double @multiple_doubles_multi_bb(79; CHECK-SAME: double [[A:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {80; CHECK-NEXT: [[ENTRY:.*:]]81; CHECK-NEXT: br i1 [[COND]], label %[[IF_TRUE:.*]], label %[[IF_FALSE:.*]]82; CHECK: [[IF_TRUE]]:83; CHECK-NEXT: [[DOUBLE_VAL2:%.*]] = load double, ptr getelementptr inbounds ([2 x double], ptr @.promoted_doubles.multiple_doubles_multi_bb, i64 0, i64 1), align 884; CHECK-NEXT: [[DOUBLE_VAL:%.*]] = load double, ptr @.promoted_doubles.multiple_doubles_multi_bb, align 885; CHECK-NEXT: [[ADD_T:%.*]] = fadd double [[A]], [[DOUBLE_VAL]]86; CHECK-NEXT: [[MUL_T:%.*]] = fmul double [[ADD_T]], [[DOUBLE_VAL2]]87; CHECK-NEXT: [[SUB_T:%.*]] = fsub double [[MUL_T]], [[DOUBLE_VAL]]88; CHECK-NEXT: br label %[[IF_END:.*]]89; CHECK: [[IF_FALSE]]:90; CHECK-NEXT: [[DOUBLE_VAL3:%.*]] = load double, ptr getelementptr inbounds ([2 x double], ptr @.promoted_doubles.multiple_doubles_multi_bb, i64 0, i64 1), align 891; CHECK-NEXT: [[DOUBLE_VAL1:%.*]] = load double, ptr @.promoted_doubles.multiple_doubles_multi_bb, align 892; CHECK-NEXT: [[ADD_F:%.*]] = fadd double [[A]], [[DOUBLE_VAL1]]93; CHECK-NEXT: [[MUL_F:%.*]] = fmul double [[ADD_F]], [[DOUBLE_VAL3]]94; CHECK-NEXT: [[SUB_F:%.*]] = fsub double [[MUL_F]], [[DOUBLE_VAL1]]95; CHECK-NEXT: br label %[[IF_END]]96; CHECK: [[IF_END]]:97; CHECK-NEXT: [[PHI_RES:%.*]] = phi double [ [[SUB_T]], %[[IF_TRUE]] ], [ [[SUB_F]], %[[IF_FALSE]] ]98; CHECK-NEXT: ret double [[PHI_RES]]99;100entry:101 br i1 %cond, label %if.true, label %if.false102 103if.true:104 %add.t = fadd double %a, 1.23105 %mul.t = fmul double %add.t, 4.56106 %sub.t = fsub double %mul.t, 1.23107 br label %if.end108 109if.false:110 %add.f = fadd double %a, 1.23111 %mul.f = fmul double %add.f, 4.56112 %sub.f = fsub double %mul.f, 1.23113 br label %if.end114 115if.end:116 %phi.res = phi double [ %sub.t, %if.true ], [ %sub.f, %if.false ]117 ret double %phi.res118}119 120; Check the insertion point in the case we have a phi taking a constant C and121; the source block also uses that same constant.122define double @multiple_doubles_phi(double %a, i1 %cond) {123; CHECK-LABEL: define double @multiple_doubles_phi(124; CHECK-SAME: double [[A:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {125; CHECK-NEXT: [[ENTRY:.*]]:126; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]127; CHECK: [[IF_THEN]]:128; CHECK-NEXT: [[DOUBLE_VAL:%.*]] = load double, ptr @.promoted_doubles.multiple_doubles_phi, align 8129; CHECK-NEXT: [[MUL:%.*]] = fmul double [[A]], [[DOUBLE_VAL]]130; CHECK-NEXT: br label %[[IF_END]]131; CHECK: [[IF_END]]:132; CHECK-NEXT: [[PHI_VAL:%.*]] = phi double [ [[DOUBLE_VAL]], %[[IF_THEN]] ], [ [[A]], %[[ENTRY]] ]133; CHECK-NEXT: [[DOUBLE_VAL1:%.*]] = load double, ptr getelementptr inbounds ([2 x double], ptr @.promoted_doubles.multiple_doubles_phi, i64 0, i64 1), align 8134; CHECK-NEXT: [[RES:%.*]] = fadd double [[PHI_VAL]], [[DOUBLE_VAL1]]135; CHECK-NEXT: ret double [[RES]]136;137entry:138 br i1 %cond, label %if.then, label %if.end139 140if.then:141 %mul = fmul double %a, 1.23142 br label %if.end143 144if.end:145 %phi.val = phi double [ 1.23, %if.then ], [ %a, %entry ]146 %res = fadd double %phi.val, 4.56147 ret double %res148}149