CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
149 lines
6.2 KiB
LLVM
149 lines
6.2 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
|
|
; RUN: opt %s -S -riscv-promote-const -mtriple=riscv64 -mattr=+d | FileCheck %s
|
|
|
|
; No promotion should take place, as the pass skips floats.
|
|
define float @multiple_floats(float %a, float %b) {
|
|
; CHECK-LABEL: define float @multiple_floats(
|
|
; CHECK-SAME: float [[A:%.*]], float [[B:%.*]]) #[[ATTR0:[0-9]+]] {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[ADD1:%.*]] = fadd float [[A]], 1.000000e+00
|
|
; CHECK-NEXT: [[ADD2:%.*]] = fadd float [[B]], 2.000000e+00
|
|
; CHECK-NEXT: [[SUM_F:%.*]] = fadd float [[ADD1]], [[ADD2]]
|
|
; CHECK-NEXT: ret float [[SUM_F]]
|
|
;
|
|
entry:
|
|
%add1 = fadd float %a, 1.0
|
|
%add2 = fadd float %b, 2.0
|
|
%sum_f = fadd float %add1, %add2
|
|
ret float %sum_f
|
|
}
|
|
|
|
; No promotion should take place as cases with a single constant are skipped.
|
|
define double @single_double(double %a) {
|
|
; CHECK-LABEL: define double @single_double(
|
|
; CHECK-SAME: double [[A:%.*]]) #[[ATTR0]] {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[ADD:%.*]] = fadd double [[A]], 4.210000e+01
|
|
; CHECK-NEXT: ret double [[ADD]]
|
|
;
|
|
entry:
|
|
%add = fadd double %a, 42.1
|
|
ret double %add
|
|
}
|
|
|
|
; Promotion should happen as we have at least two unique constants that would
|
|
; otherwise go in the constant pool.
|
|
define double @multiple_doubles(double %a, double %b) {
|
|
; CHECK-LABEL: define double @multiple_doubles(
|
|
; CHECK-SAME: double [[A:%.*]], double [[B:%.*]]) #[[ATTR0]] {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[DOUBLE_VAL1:%.*]] = load double, ptr getelementptr inbounds ([2 x double], ptr @.promoted_doubles.multiple_doubles, i64 0, i64 1), align 8
|
|
; CHECK-NEXT: [[ADD3:%.*]] = load double, ptr @.promoted_doubles.multiple_doubles, align 8
|
|
; CHECK-NEXT: [[ADD2:%.*]] = fadd double [[A]], [[ADD3]]
|
|
; CHECK-NEXT: [[ADD4:%.*]] = fadd double [[B]], [[DOUBLE_VAL1]]
|
|
; CHECK-NEXT: [[SUM:%.*]] = fadd double [[ADD2]], [[ADD3]]
|
|
; CHECK-NEXT: [[SUM1:%.*]] = fadd double [[ADD4]], [[SUM]]
|
|
; CHECK-NEXT: ret double [[SUM1]]
|
|
;
|
|
entry:
|
|
%add1 = fadd double %a, 2.718
|
|
%add2 = fadd double %b, 42.1
|
|
%add3 = fadd double %add1, 2.718
|
|
%sum = fadd double %add2, %add3
|
|
ret double %sum
|
|
}
|
|
|
|
; Promotion should not happen as the constants will be materialised rather
|
|
; than using the constant pool.
|
|
define double @multiple_doubles_no_promote(double %a, double %b) {
|
|
; CHECK-LABEL: define double @multiple_doubles_no_promote(
|
|
; CHECK-SAME: double [[A:%.*]], double [[B:%.*]]) #[[ATTR0]] {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[ADD1:%.*]] = fadd double [[A]], 1.000000e+00
|
|
; CHECK-NEXT: [[ADD2:%.*]] = fadd double [[B]], 2.000000e+00
|
|
; CHECK-NEXT: [[ADD3:%.*]] = fadd double [[ADD1]], 1.000000e+00
|
|
; CHECK-NEXT: [[SUM:%.*]] = fadd double [[ADD2]], [[ADD3]]
|
|
; CHECK-NEXT: ret double [[SUM]]
|
|
;
|
|
entry:
|
|
%add1 = fadd double %a, 1.0
|
|
%add2 = fadd double %b, 2.0
|
|
%add3 = fadd double %add1, 1.0
|
|
%sum = fadd double %add2, %add3
|
|
ret double %sum
|
|
}
|
|
|
|
; The same constant shouldn't be loaded more than once per BB.
|
|
define double @multiple_doubles_multi_bb(double %a, i1 %cond) {
|
|
; CHECK-LABEL: define double @multiple_doubles_multi_bb(
|
|
; CHECK-SAME: double [[A:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: br i1 [[COND]], label %[[IF_TRUE:.*]], label %[[IF_FALSE:.*]]
|
|
; CHECK: [[IF_TRUE]]:
|
|
; CHECK-NEXT: [[DOUBLE_VAL2:%.*]] = load double, ptr getelementptr inbounds ([2 x double], ptr @.promoted_doubles.multiple_doubles_multi_bb, i64 0, i64 1), align 8
|
|
; CHECK-NEXT: [[DOUBLE_VAL:%.*]] = load double, ptr @.promoted_doubles.multiple_doubles_multi_bb, align 8
|
|
; CHECK-NEXT: [[ADD_T:%.*]] = fadd double [[A]], [[DOUBLE_VAL]]
|
|
; CHECK-NEXT: [[MUL_T:%.*]] = fmul double [[ADD_T]], [[DOUBLE_VAL2]]
|
|
; CHECK-NEXT: [[SUB_T:%.*]] = fsub double [[MUL_T]], [[DOUBLE_VAL]]
|
|
; CHECK-NEXT: br label %[[IF_END:.*]]
|
|
; CHECK: [[IF_FALSE]]:
|
|
; CHECK-NEXT: [[DOUBLE_VAL3:%.*]] = load double, ptr getelementptr inbounds ([2 x double], ptr @.promoted_doubles.multiple_doubles_multi_bb, i64 0, i64 1), align 8
|
|
; CHECK-NEXT: [[DOUBLE_VAL1:%.*]] = load double, ptr @.promoted_doubles.multiple_doubles_multi_bb, align 8
|
|
; CHECK-NEXT: [[ADD_F:%.*]] = fadd double [[A]], [[DOUBLE_VAL1]]
|
|
; CHECK-NEXT: [[MUL_F:%.*]] = fmul double [[ADD_F]], [[DOUBLE_VAL3]]
|
|
; CHECK-NEXT: [[SUB_F:%.*]] = fsub double [[MUL_F]], [[DOUBLE_VAL1]]
|
|
; CHECK-NEXT: br label %[[IF_END]]
|
|
; CHECK: [[IF_END]]:
|
|
; CHECK-NEXT: [[PHI_RES:%.*]] = phi double [ [[SUB_T]], %[[IF_TRUE]] ], [ [[SUB_F]], %[[IF_FALSE]] ]
|
|
; CHECK-NEXT: ret double [[PHI_RES]]
|
|
;
|
|
entry:
|
|
br i1 %cond, label %if.true, label %if.false
|
|
|
|
if.true:
|
|
%add.t = fadd double %a, 1.23
|
|
%mul.t = fmul double %add.t, 4.56
|
|
%sub.t = fsub double %mul.t, 1.23
|
|
br label %if.end
|
|
|
|
if.false:
|
|
%add.f = fadd double %a, 1.23
|
|
%mul.f = fmul double %add.f, 4.56
|
|
%sub.f = fsub double %mul.f, 1.23
|
|
br label %if.end
|
|
|
|
if.end:
|
|
%phi.res = phi double [ %sub.t, %if.true ], [ %sub.f, %if.false ]
|
|
ret double %phi.res
|
|
}
|
|
|
|
; Check the insertion point in the case we have a phi taking a constant C and
|
|
; the source block also uses that same constant.
|
|
define double @multiple_doubles_phi(double %a, i1 %cond) {
|
|
; CHECK-LABEL: define double @multiple_doubles_phi(
|
|
; CHECK-SAME: double [[A:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
|
|
; CHECK-NEXT: [[ENTRY:.*]]:
|
|
; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
|
|
; CHECK: [[IF_THEN]]:
|
|
; CHECK-NEXT: [[DOUBLE_VAL:%.*]] = load double, ptr @.promoted_doubles.multiple_doubles_phi, align 8
|
|
; CHECK-NEXT: [[MUL:%.*]] = fmul double [[A]], [[DOUBLE_VAL]]
|
|
; CHECK-NEXT: br label %[[IF_END]]
|
|
; CHECK: [[IF_END]]:
|
|
; CHECK-NEXT: [[PHI_VAL:%.*]] = phi double [ [[DOUBLE_VAL]], %[[IF_THEN]] ], [ [[A]], %[[ENTRY]] ]
|
|
; CHECK-NEXT: [[DOUBLE_VAL1:%.*]] = load double, ptr getelementptr inbounds ([2 x double], ptr @.promoted_doubles.multiple_doubles_phi, i64 0, i64 1), align 8
|
|
; CHECK-NEXT: [[RES:%.*]] = fadd double [[PHI_VAL]], [[DOUBLE_VAL1]]
|
|
; CHECK-NEXT: ret double [[RES]]
|
|
;
|
|
entry:
|
|
br i1 %cond, label %if.then, label %if.end
|
|
|
|
if.then:
|
|
%mul = fmul double %a, 1.23
|
|
br label %if.end
|
|
|
|
if.end:
|
|
%phi.val = phi double [ 1.23, %if.then ], [ %a, %entry ]
|
|
%res = fadd double %phi.val, 4.56
|
|
ret double %res
|
|
}
|