[llvm] [AMDGPU][GlobalISel] Add RegBankLegalize support for G_FCANONICALIZE (PR #174662)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 7 13:02:53 PST 2026
https://github.com/vangthao95 updated https://github.com/llvm/llvm-project/pull/174662
>From 09fba7ecd694a27f5175c69b8bb6e8d501b28135 Mon Sep 17 00:00:00 2001
From: Vang Thao <vang.thao at amd.com>
Date: Tue, 6 Jan 2026 14:18:17 -0800
Subject: [PATCH 1/3] [AMDGPU][GlobalISel] Add RegBankLegalize support for
G_FCANONICALIZE
Added -global-isel flag to fcanoicalize.ll test.
---
.../AMDGPU/AMDGPURegBankLegalizeRules.cpp | 12 +
.../regbankselect-fcanonicalize.mir | 175 +-
llvm/test/CodeGen/AMDGPU/fcanonicalize.ll | 6375 +++++++++++------
3 files changed, 4468 insertions(+), 2094 deletions(-)
diff --git a/llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp b/llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp
index ab17d9e863d2b..d2605262fc9e3 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp
@@ -1021,6 +1021,18 @@ RegBankLegalizeRules::RegBankLegalizeRules(const GCNSubtarget &_ST,
.Any({{UniV2S32}, {{UniInVgprV2S32}, {VgprV2S32}}})
.Any({{DivV2S32}, {{VgprV2S32}, {VgprV2S32}}});
+ addRulesForGOpcs({G_FCANONICALIZE}, Standard)
+ .Uni(S16, {{UniInVgprS16}, {Vgpr16}})
+ .Div(S16, {{Vgpr16}, {Vgpr16}})
+ .Uni(S32, {{UniInVgprS32}, {Vgpr32}})
+ .Div(S32, {{Vgpr32}, {Vgpr32}})
+ .Uni(S64, {{UniInVgprS64}, {Vgpr64}})
+ .Div(S64, {{Vgpr64}, {Vgpr64}})
+ .Uni(V2S16, {{UniInVgprV2S16}, {VgprV2S16}})
+ .Div(V2S16, {{VgprV2S16}, {VgprV2S16}})
+ .Any({{UniV2S32}, {{UniInVgprV2S32}, {VgprV2S32}}})
+ .Any({{DivV2S32}, {{VgprV2S32}, {VgprV2S32}}});
+
addRulesForGOpcs({G_FPTOUI})
.Any({{UniS32, S32}, {{Sgpr32}, {Sgpr32}}}, hasSALUFloat)
.Any({{UniS32, S32}, {{UniInVgprS32}, {Vgpr32}}}, !hasSALUFloat);
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-fcanonicalize.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-fcanonicalize.mir
index fac4fa5580b49..4f71082fb22a1 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-fcanonicalize.mir
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-fcanonicalize.mir
@@ -1,16 +1,60 @@
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
-# RUN: llc -mtriple=amdgcn -run-pass=regbankselect -regbankselect-fast -verify-machineinstrs -o - %s | FileCheck %s
-# RUN: llc -mtriple=amdgcn -run-pass=regbankselect -regbankselect-greedy -verify-machineinstrs -o - %s | FileCheck %s
+# RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -run-pass="amdgpu-regbankselect,amdgpu-regbanklegalize" -verify-machineinstrs -o - %s | FileCheck %s
---
-name: fcanonicalize_s
+name: fcanonicalize_s16_s
legalized: true
body: |
bb.0:
- liveins: $sgpr0_sgpr1
- ; CHECK-LABEL: name: fcanonicalize_s
- ; CHECK: liveins: $sgpr0_sgpr1
+ liveins: $sgpr0
+ ; CHECK-LABEL: name: fcanonicalize_s16_s
+ ; CHECK: liveins: $sgpr0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
+ ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:sgpr(s16) = G_TRUNC [[COPY]](s32)
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr(s16) = COPY [[TRUNC]](s16)
+ ; CHECK-NEXT: [[FCANONICALIZE:%[0-9]+]]:vgpr(s16) = G_FCANONICALIZE [[COPY1]]
+ ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:vgpr(s32) = G_ANYEXT [[FCANONICALIZE]](s16)
+ ; CHECK-NEXT: $vgpr0 = COPY [[ANYEXT]](s32)
+ %0:_(s32) = COPY $sgpr0
+ %1:_(s16) = G_TRUNC %0
+ %2:_(s16) = G_FCANONICALIZE %1
+ %3:_(s32) = G_ANYEXT %2
+ $vgpr0 = COPY %3
+...
+
+---
+name: fcanonicalize_s16_v
+legalized: true
+
+body: |
+ bb.0:
+ liveins: $vgpr0
+ ; CHECK-LABEL: name: fcanonicalize_s16_v
+ ; CHECK: liveins: $vgpr0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
+ ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:vgpr(s16) = G_TRUNC [[COPY]](s32)
+ ; CHECK-NEXT: [[FCANONICALIZE:%[0-9]+]]:vgpr(s16) = G_FCANONICALIZE [[TRUNC]]
+ ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:vgpr(s32) = G_ANYEXT [[FCANONICALIZE]](s16)
+ ; CHECK-NEXT: $vgpr0 = COPY [[ANYEXT]](s32)
+ %0:_(s32) = COPY $vgpr0
+ %1:_(s16) = G_TRUNC %0
+ %2:_(s16) = G_FCANONICALIZE %1
+ %3:_(s32) = G_ANYEXT %2
+ $vgpr0 = COPY %3
+...
+
+---
+name: fcanonicalize_s32_s
+legalized: true
+
+body: |
+ bb.0:
+ liveins: $sgpr0
+ ; CHECK-LABEL: name: fcanonicalize_s32_s
+ ; CHECK: liveins: $sgpr0
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY [[COPY]](s32)
@@ -22,14 +66,14 @@ body: |
...
---
-name: fcanonicalize_v
+name: fcanonicalize_s32_v
legalized: true
body: |
bb.0:
- liveins: $vgpr0_vgpr1
- ; CHECK-LABEL: name: fcanonicalize_v
- ; CHECK: liveins: $vgpr0_vgpr1
+ liveins: $vgpr0
+ ; CHECK-LABEL: name: fcanonicalize_s32_v
+ ; CHECK: liveins: $vgpr0
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
; CHECK-NEXT: [[FCANONICALIZE:%[0-9]+]]:vgpr(s32) = G_FCANONICALIZE [[COPY]]
@@ -38,3 +82,114 @@ body: |
%1:_(s32) = G_FCANONICALIZE %0
$vgpr0 = COPY %1
...
+
+---
+name: fcanonicalize_s64_s
+legalized: true
+
+body: |
+ bb.0:
+ liveins: $sgpr0_sgpr1
+ ; CHECK-LABEL: name: fcanonicalize_s64_s
+ ; CHECK: liveins: $sgpr0_sgpr1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:sgpr(s64) = COPY $sgpr0_sgpr1
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr(s64) = COPY [[COPY]](s64)
+ ; CHECK-NEXT: [[FCANONICALIZE:%[0-9]+]]:vgpr(s64) = G_FCANONICALIZE [[COPY1]]
+ ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[FCANONICALIZE]](s64)
+ %0:_(s64) = COPY $sgpr0_sgpr1
+ %1:_(s64) = G_FCANONICALIZE %0
+ $vgpr0_vgpr1 = COPY %1
+...
+
+---
+name: fcanonicalize_s64_v
+legalized: true
+
+body: |
+ bb.0:
+ liveins: $vgpr0_vgpr1
+ ; CHECK-LABEL: name: fcanonicalize_s64_v
+ ; CHECK: liveins: $vgpr0_vgpr1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:vgpr(s64) = COPY $vgpr0_vgpr1
+ ; CHECK-NEXT: [[FCANONICALIZE:%[0-9]+]]:vgpr(s64) = G_FCANONICALIZE [[COPY]]
+ ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[FCANONICALIZE]](s64)
+ %0:_(s64) = COPY $vgpr0_vgpr1
+ %1:_(s64) = G_FCANONICALIZE %0
+ $vgpr0_vgpr1 = COPY %1
+...
+
+---
+name: fcanonicalize_v2s16_s
+legalized: true
+
+body: |
+ bb.0:
+ liveins: $sgpr0
+ ; CHECK-LABEL: name: fcanonicalize_v2s16_s
+ ; CHECK: liveins: $sgpr0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:sgpr(<2 x s16>) = COPY $sgpr0
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr(<2 x s16>) = COPY [[COPY]](<2 x s16>)
+ ; CHECK-NEXT: [[FCANONICALIZE:%[0-9]+]]:vgpr(<2 x s16>) = G_FCANONICALIZE [[COPY1]]
+ ; CHECK-NEXT: $vgpr0 = COPY [[FCANONICALIZE]](<2 x s16>)
+ %0:_(<2 x s16>) = COPY $sgpr0
+ %1:_(<2 x s16>) = G_FCANONICALIZE %0
+ $vgpr0 = COPY %1
+...
+
+---
+name: fcanonicalize_v2s16_v
+legalized: true
+
+body: |
+ bb.0:
+ liveins: $vgpr0
+ ; CHECK-LABEL: name: fcanonicalize_v2s16_v
+ ; CHECK: liveins: $vgpr0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:vgpr(<2 x s16>) = COPY $vgpr0
+ ; CHECK-NEXT: [[FCANONICALIZE:%[0-9]+]]:vgpr(<2 x s16>) = G_FCANONICALIZE [[COPY]]
+ ; CHECK-NEXT: $vgpr0 = COPY [[FCANONICALIZE]](<2 x s16>)
+ %0:_(<2 x s16>) = COPY $vgpr0
+ %1:_(<2 x s16>) = G_FCANONICALIZE %0
+ $vgpr0 = COPY %1
+...
+
+---
+name: fcanonicalize_v2s32_s
+legalized: true
+
+body: |
+ bb.0:
+ liveins: $sgpr0_sgpr1
+ ; CHECK-LABEL: name: fcanonicalize_v2s32_s
+ ; CHECK: liveins: $sgpr0_sgpr1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:sgpr(<2 x s32>) = COPY $sgpr0_sgpr1
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr(<2 x s32>) = COPY [[COPY]](<2 x s32>)
+ ; CHECK-NEXT: [[FCANONICALIZE:%[0-9]+]]:vgpr(<2 x s32>) = G_FCANONICALIZE [[COPY1]]
+ ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[FCANONICALIZE]](<2 x s32>)
+ %0:_(<2 x s32>) = COPY $sgpr0_sgpr1
+ %1:_(<2 x s32>) = G_FCANONICALIZE %0
+ $vgpr0_vgpr1 = COPY %1
+...
+
+---
+name: fcanonicalize_v2s32_v
+legalized: true
+
+body: |
+ bb.0:
+ liveins: $vgpr0_vgpr1
+ ; CHECK-LABEL: name: fcanonicalize_v2s32_v
+ ; CHECK: liveins: $vgpr0_vgpr1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:vgpr(<2 x s32>) = COPY $vgpr0_vgpr1
+ ; CHECK-NEXT: [[FCANONICALIZE:%[0-9]+]]:vgpr(<2 x s32>) = G_FCANONICALIZE [[COPY]]
+ ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[FCANONICALIZE]](<2 x s32>)
+ %0:_(<2 x s32>) = COPY $vgpr0_vgpr1
+ %1:_(<2 x s32>) = G_FCANONICALIZE %0
+ $vgpr0_vgpr1 = COPY %1
+...
diff --git a/llvm/test/CodeGen/AMDGPU/fcanonicalize.ll b/llvm/test/CodeGen/AMDGPU/fcanonicalize.ll
index d32b528d13276..4477c87f05354 100644
--- a/llvm/test/CodeGen/AMDGPU/fcanonicalize.ll
+++ b/llvm/test/CodeGen/AMDGPU/fcanonicalize.ll
@@ -1,11 +1,18 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
-; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii < %s | FileCheck -check-prefixes=GFX678,GFX6 %s
-; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=fiji < %s | FileCheck -check-prefixes=GFX678,GFX8 %s
-; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck -check-prefixes=GFX9 %s
-; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-TRUE16 %s
-; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-FAKE16 %s
-; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-TRUE16 %s
-; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-FAKE16 %s
+; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii < %s | FileCheck -check-prefixes=GFX678,GFX678-SDAG,GFX6-SDAG %s
+; RUN: llc -global-isel=1 -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii < %s | FileCheck -check-prefixes=GFX678,GFX678-GISEL,GFX6-GISEL %s
+; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=fiji < %s | FileCheck -check-prefixes=GFX678,GFX678-SDAG,GFX8-SDAG %s
+; RUN: llc -global-isel=1 -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=fiji < %s | FileCheck -check-prefixes=GFX678,GFX678-GISEL,GFX8-GISEL %s
+; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck -check-prefixes=GFX9,GFX9-SDAG %s
+; RUN: llc -global-isel=1 -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck -check-prefixes=GFX9,GFX9-GISEL %s
+; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-SDAG,GFX11-TRUE16,GFX11-SDAG-TRUE16 %s
+; RUN: llc -global-isel=1 -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-GISEL,GFX11-TRUE16,GFX11-GISEL-TRUE16 %s
+; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-SDAG,GFX11-FAKE16,GFX11-SDAG-FAKE16 %s
+; RUN: llc -global-isel=1 -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-GISEL,GFX11-FAKE16,GFX11-GISEL-FAKE16 %s
+; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-SDAG,GFX12-TRUE16,GFX12-SDAG-TRUE16 %s
+; RUN: llc -global-isel=1 -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-GISEL,GFX12-TRUE16,GFX12-GISEL-TRUE16 %s
+; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-SDAG,GFX12-FAKE16,GFX12-SDAG-FAKE16 %s
+; RUN: llc -global-isel=1 -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-GISEL,GFX12-FAKE16,GFX12-GISEL-FAKE16 %s
declare float @llvm.fabs.f32(float) #0
declare float @llvm.canonicalize.f32(float) #0
@@ -23,53 +30,101 @@ declare <2 x half> @llvm.canonicalize.v2f16(<2 x half>) #0
declare i32 @llvm.amdgcn.workitem.id.x() #0
define amdgpu_kernel void @v_test_canonicalize_var_f32(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: v_test_canonicalize_var_f32:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v0, s0
-; GFX678-NEXT: v_mov_b32_e32 v1, s1
-; GFX678-NEXT: flat_load_dword v2, v[0:1]
-; GFX678-NEXT: s_waitcnt vmcnt(0)
-; GFX678-NEXT: v_mul_f32_e32 v2, 1.0, v2
-; GFX678-NEXT: flat_store_dword v[0:1], v2
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: v_test_canonicalize_var_f32:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_load_dword v1, v0, s[0:1]
-; GFX9-NEXT: s_waitcnt vmcnt(0)
-; GFX9-NEXT: v_max_f32_e32 v1, v1, v1
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: v_test_canonicalize_var_f32:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_mov_b32_e32 v0, 0
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_load_b32 v1, v0, s[0:1]
-; GFX11-NEXT: s_waitcnt vmcnt(0)
-; GFX11-NEXT: v_max_f32_e32 v1, v1, v1
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: v_test_canonicalize_var_f32:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_mov_b32_e32 v0, 0
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_load_b32 v1, v0, s[0:1]
-; GFX12-NEXT: s_wait_loadcnt 0x0
-; GFX12-NEXT: v_max_num_f32_e32 v1, v1, v1
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: v_test_canonicalize_var_f32:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-SDAG-NEXT: flat_load_dword v2, v[0:1]
+; GFX678-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX678-SDAG-NEXT: v_mul_f32_e32 v2, 1.0, v2
+; GFX678-SDAG-NEXT: flat_store_dword v[0:1], v2
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: v_test_canonicalize_var_f32:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: s_load_dword s2, s[0:1], 0x0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mul_f32_e64 v2, 1.0, s2
+; GFX678-GISEL-NEXT: flat_store_dword v[0:1], v2
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: v_test_canonicalize_var_f32:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_load_dword v1, v0, s[0:1]
+; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX9-SDAG-NEXT: v_max_f32_e32 v1, v1, v1
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: v_test_canonicalize_var_f32:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: s_load_dword s2, s[0:1], 0x0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: v_max_f32_e64 v0, s2, s2
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: v_test_canonicalize_var_f32:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_load_b32 v1, v0, s[0:1]
+; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX11-SDAG-NEXT: v_max_f32_e32 v1, v1, v1
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: v_test_canonicalize_var_f32:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: s_load_b32 s2, s[0:1], 0x0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: v_max_f32_e64 v0, s2, s2
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: v_test_canonicalize_var_f32:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_load_b32 v1, v0, s[0:1]
+; GFX12-SDAG-NEXT: s_wait_loadcnt 0x0
+; GFX12-SDAG-NEXT: v_max_num_f32_e32 v1, v1, v1
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: v_test_canonicalize_var_f32:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: s_load_b32 s2, s[0:1], 0x0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: v_max_num_f32_e64 v0, s2, s2
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%val = load float, ptr addrspace(1) %out
%canonicalized = call float @llvm.canonicalize.f32(float %val)
store float %canonicalized, ptr addrspace(1) %out
@@ -77,116 +132,222 @@ define amdgpu_kernel void @v_test_canonicalize_var_f32(ptr addrspace(1) %out) #1
}
define amdgpu_kernel void @s_test_canonicalize_var_f32(ptr addrspace(1) %out, float %val) #1 {
-; GFX6-LABEL: s_test_canonicalize_var_f32:
-; GFX6: ; %bb.0:
-; GFX6-NEXT: s_load_dword s2, s[8:9], 0x2
-; GFX6-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX6-NEXT: s_add_i32 s12, s12, s17
-; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX6-NEXT: s_waitcnt lgkmcnt(0)
-; GFX6-NEXT: v_mul_f32_e64 v2, 1.0, s2
-; GFX6-NEXT: v_mov_b32_e32 v0, s0
-; GFX6-NEXT: v_mov_b32_e32 v1, s1
-; GFX6-NEXT: flat_store_dword v[0:1], v2
-; GFX6-NEXT: s_endpgm
-;
-; GFX8-LABEL: s_test_canonicalize_var_f32:
-; GFX8: ; %bb.0:
-; GFX8-NEXT: s_load_dword s2, s[8:9], 0x8
-; GFX8-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX8-NEXT: s_add_i32 s12, s12, s17
-; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX8-NEXT: s_waitcnt lgkmcnt(0)
-; GFX8-NEXT: v_mul_f32_e64 v2, 1.0, s2
-; GFX8-NEXT: v_mov_b32_e32 v0, s0
-; GFX8-NEXT: v_mov_b32_e32 v1, s1
-; GFX8-NEXT: flat_store_dword v[0:1], v2
-; GFX8-NEXT: s_endpgm
-;
-; GFX9-LABEL: s_test_canonicalize_var_f32:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dword s2, s[8:9], 0x8
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: v_max_f32_e64 v1, s2, s2
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: s_test_canonicalize_var_f32:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_clause 0x1
-; GFX11-NEXT: s_load_b32 s2, s[4:5], 0x8
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_mov_b32_e32 v0, 0
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: v_max_f32_e64 v1, s2, s2
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: s_test_canonicalize_var_f32:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b96 s[0:2], s[4:5], 0x0
-; GFX12-NEXT: v_mov_b32_e32 v0, 0
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: v_max_num_f32_e64 v1, s2, s2
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX6-SDAG-LABEL: s_test_canonicalize_var_f32:
+; GFX6-SDAG: ; %bb.0:
+; GFX6-SDAG-NEXT: s_load_dword s2, s[8:9], 0x2
+; GFX6-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX6-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX6-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-SDAG-NEXT: v_mul_f32_e64 v2, 1.0, s2
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-SDAG-NEXT: flat_store_dword v[0:1], v2
+; GFX6-SDAG-NEXT: s_endpgm
+;
+; GFX6-GISEL-LABEL: s_test_canonicalize_var_f32:
+; GFX6-GISEL: ; %bb.0:
+; GFX6-GISEL-NEXT: s_load_dword s2, s[8:9], 0x2
+; GFX6-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX6-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX6-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-GISEL-NEXT: v_mul_f32_e64 v2, 1.0, s2
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-GISEL-NEXT: flat_store_dword v[0:1], v2
+; GFX6-GISEL-NEXT: s_endpgm
+;
+; GFX8-SDAG-LABEL: s_test_canonicalize_var_f32:
+; GFX8-SDAG: ; %bb.0:
+; GFX8-SDAG-NEXT: s_load_dword s2, s[8:9], 0x8
+; GFX8-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX8-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX8-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-SDAG-NEXT: v_mul_f32_e64 v2, 1.0, s2
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX8-SDAG-NEXT: flat_store_dword v[0:1], v2
+; GFX8-SDAG-NEXT: s_endpgm
+;
+; GFX8-GISEL-LABEL: s_test_canonicalize_var_f32:
+; GFX8-GISEL: ; %bb.0:
+; GFX8-GISEL-NEXT: s_load_dword s2, s[8:9], 0x8
+; GFX8-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX8-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX8-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-GISEL-NEXT: v_mul_f32_e64 v2, 1.0, s2
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX8-GISEL-NEXT: flat_store_dword v[0:1], v2
+; GFX8-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: s_test_canonicalize_var_f32:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dword s2, s[8:9], 0x8
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: v_max_f32_e64 v1, s2, s2
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: s_test_canonicalize_var_f32:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dword s2, s[8:9], 0x8
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: v_max_f32_e64 v0, s2, s2
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: s_test_canonicalize_var_f32:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_clause 0x1
+; GFX11-SDAG-NEXT: s_load_b32 s2, s[4:5], 0x8
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: v_max_f32_e64 v1, s2, s2
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: s_test_canonicalize_var_f32:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_clause 0x1
+; GFX11-GISEL-NEXT: s_load_b32 s2, s[4:5], 0x8
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: v_max_f32_e64 v0, s2, s2
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: s_test_canonicalize_var_f32:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b96 s[0:2], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: v_max_num_f32_e64 v1, s2, s2
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: s_test_canonicalize_var_f32:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b96 s[0:2], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: v_max_num_f32_e64 v0, s2, s2
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call float @llvm.canonicalize.f32(float %val)
store float %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @v_test_canonicalize_fabs_var_f32(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: v_test_canonicalize_fabs_var_f32:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v0, s0
-; GFX678-NEXT: v_mov_b32_e32 v1, s1
-; GFX678-NEXT: flat_load_dword v2, v[0:1]
-; GFX678-NEXT: s_waitcnt vmcnt(0)
-; GFX678-NEXT: v_mul_f32_e64 v2, 1.0, |v2|
-; GFX678-NEXT: flat_store_dword v[0:1], v2
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: v_test_canonicalize_fabs_var_f32:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_load_dword v1, v0, s[0:1]
-; GFX9-NEXT: s_waitcnt vmcnt(0)
-; GFX9-NEXT: v_max_f32_e64 v1, |v1|, |v1|
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: v_test_canonicalize_fabs_var_f32:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_mov_b32_e32 v0, 0
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_load_b32 v1, v0, s[0:1]
-; GFX11-NEXT: s_waitcnt vmcnt(0)
-; GFX11-NEXT: v_max_f32_e64 v1, |v1|, |v1|
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: v_test_canonicalize_fabs_var_f32:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_mov_b32_e32 v0, 0
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_load_b32 v1, v0, s[0:1]
-; GFX12-NEXT: s_wait_loadcnt 0x0
-; GFX12-NEXT: v_max_num_f32_e64 v1, |v1|, |v1|
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: v_test_canonicalize_fabs_var_f32:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-SDAG-NEXT: flat_load_dword v2, v[0:1]
+; GFX678-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX678-SDAG-NEXT: v_mul_f32_e64 v2, 1.0, |v2|
+; GFX678-SDAG-NEXT: flat_store_dword v[0:1], v2
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: v_test_canonicalize_fabs_var_f32:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: s_load_dword s2, s[0:1], 0x0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mul_f32_e64 v2, 1.0, |s2|
+; GFX678-GISEL-NEXT: flat_store_dword v[0:1], v2
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: v_test_canonicalize_fabs_var_f32:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_load_dword v1, v0, s[0:1]
+; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX9-SDAG-NEXT: v_max_f32_e64 v1, |v1|, |v1|
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: v_test_canonicalize_fabs_var_f32:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: s_load_dword s2, s[0:1], 0x0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: v_max_f32_e64 v0, |s2|, |s2|
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: v_test_canonicalize_fabs_var_f32:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_load_b32 v1, v0, s[0:1]
+; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX11-SDAG-NEXT: v_max_f32_e64 v1, |v1|, |v1|
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: v_test_canonicalize_fabs_var_f32:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: s_load_b32 s2, s[0:1], 0x0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: v_max_f32_e64 v0, |s2|, |s2|
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: v_test_canonicalize_fabs_var_f32:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_load_b32 v1, v0, s[0:1]
+; GFX12-SDAG-NEXT: s_wait_loadcnt 0x0
+; GFX12-SDAG-NEXT: v_max_num_f32_e64 v1, |v1|, |v1|
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: v_test_canonicalize_fabs_var_f32:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: s_load_b32 s2, s[0:1], 0x0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: v_max_num_f32_e64 v0, |s2|, |s2|
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%val = load float, ptr addrspace(1) %out
%val.fabs = call float @llvm.fabs.f32(float %val)
%canonicalized = call float @llvm.canonicalize.f32(float %val.fabs)
@@ -195,53 +356,101 @@ define amdgpu_kernel void @v_test_canonicalize_fabs_var_f32(ptr addrspace(1) %ou
}
define amdgpu_kernel void @v_test_canonicalize_fneg_fabs_var_f32(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: v_test_canonicalize_fneg_fabs_var_f32:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v0, s0
-; GFX678-NEXT: v_mov_b32_e32 v1, s1
-; GFX678-NEXT: flat_load_dword v2, v[0:1]
-; GFX678-NEXT: s_waitcnt vmcnt(0)
-; GFX678-NEXT: v_mul_f32_e64 v2, -1.0, |v2|
-; GFX678-NEXT: flat_store_dword v[0:1], v2
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: v_test_canonicalize_fneg_fabs_var_f32:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_load_dword v1, v0, s[0:1]
-; GFX9-NEXT: s_waitcnt vmcnt(0)
-; GFX9-NEXT: v_max_f32_e64 v1, -|v1|, -|v1|
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: v_test_canonicalize_fneg_fabs_var_f32:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_mov_b32_e32 v0, 0
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_load_b32 v1, v0, s[0:1]
-; GFX11-NEXT: s_waitcnt vmcnt(0)
-; GFX11-NEXT: v_max_f32_e64 v1, -|v1|, -|v1|
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: v_test_canonicalize_fneg_fabs_var_f32:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_mov_b32_e32 v0, 0
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_load_b32 v1, v0, s[0:1]
-; GFX12-NEXT: s_wait_loadcnt 0x0
-; GFX12-NEXT: v_max_num_f32_e64 v1, -|v1|, -|v1|
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: v_test_canonicalize_fneg_fabs_var_f32:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-SDAG-NEXT: flat_load_dword v2, v[0:1]
+; GFX678-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX678-SDAG-NEXT: v_mul_f32_e64 v2, -1.0, |v2|
+; GFX678-SDAG-NEXT: flat_store_dword v[0:1], v2
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: v_test_canonicalize_fneg_fabs_var_f32:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: s_load_dword s2, s[0:1], 0x0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mul_f32_e64 v2, 1.0, -|s2|
+; GFX678-GISEL-NEXT: flat_store_dword v[0:1], v2
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: v_test_canonicalize_fneg_fabs_var_f32:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_load_dword v1, v0, s[0:1]
+; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX9-SDAG-NEXT: v_max_f32_e64 v1, -|v1|, -|v1|
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: v_test_canonicalize_fneg_fabs_var_f32:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: s_load_dword s2, s[0:1], 0x0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: v_max_f32_e64 v0, -|s2|, -|s2|
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: v_test_canonicalize_fneg_fabs_var_f32:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_load_b32 v1, v0, s[0:1]
+; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX11-SDAG-NEXT: v_max_f32_e64 v1, -|v1|, -|v1|
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: v_test_canonicalize_fneg_fabs_var_f32:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: s_load_b32 s2, s[0:1], 0x0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: v_max_f32_e64 v0, -|s2|, -|s2|
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: v_test_canonicalize_fneg_fabs_var_f32:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_load_b32 v1, v0, s[0:1]
+; GFX12-SDAG-NEXT: s_wait_loadcnt 0x0
+; GFX12-SDAG-NEXT: v_max_num_f32_e64 v1, -|v1|, -|v1|
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: v_test_canonicalize_fneg_fabs_var_f32:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: s_load_b32 s2, s[0:1], 0x0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: v_max_num_f32_e64 v0, -|s2|, -|s2|
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%val = load float, ptr addrspace(1) %out
%val.fabs = call float @llvm.fabs.f32(float %val)
%val.fabs.fneg = fneg float %val.fabs
@@ -251,53 +460,101 @@ define amdgpu_kernel void @v_test_canonicalize_fneg_fabs_var_f32(ptr addrspace(1
}
define amdgpu_kernel void @v_test_canonicalize_fneg_var_f32(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: v_test_canonicalize_fneg_var_f32:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v0, s0
-; GFX678-NEXT: v_mov_b32_e32 v1, s1
-; GFX678-NEXT: flat_load_dword v2, v[0:1]
-; GFX678-NEXT: s_waitcnt vmcnt(0)
-; GFX678-NEXT: v_mul_f32_e32 v2, -1.0, v2
-; GFX678-NEXT: flat_store_dword v[0:1], v2
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: v_test_canonicalize_fneg_var_f32:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_load_dword v1, v0, s[0:1]
-; GFX9-NEXT: s_waitcnt vmcnt(0)
-; GFX9-NEXT: v_max_f32_e64 v1, -v1, -v1
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: v_test_canonicalize_fneg_var_f32:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_mov_b32_e32 v0, 0
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_load_b32 v1, v0, s[0:1]
-; GFX11-NEXT: s_waitcnt vmcnt(0)
-; GFX11-NEXT: v_max_f32_e64 v1, -v1, -v1
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: v_test_canonicalize_fneg_var_f32:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_mov_b32_e32 v0, 0
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_load_b32 v1, v0, s[0:1]
-; GFX12-NEXT: s_wait_loadcnt 0x0
-; GFX12-NEXT: v_max_num_f32_e64 v1, -v1, -v1
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: v_test_canonicalize_fneg_var_f32:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-SDAG-NEXT: flat_load_dword v2, v[0:1]
+; GFX678-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX678-SDAG-NEXT: v_mul_f32_e32 v2, -1.0, v2
+; GFX678-SDAG-NEXT: flat_store_dword v[0:1], v2
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: v_test_canonicalize_fneg_var_f32:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: s_load_dword s2, s[0:1], 0x0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mul_f32_e64 v2, 1.0, -s2
+; GFX678-GISEL-NEXT: flat_store_dword v[0:1], v2
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: v_test_canonicalize_fneg_var_f32:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_load_dword v1, v0, s[0:1]
+; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX9-SDAG-NEXT: v_max_f32_e64 v1, -v1, -v1
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: v_test_canonicalize_fneg_var_f32:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: s_load_dword s2, s[0:1], 0x0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: v_max_f32_e64 v0, -s2, -s2
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: v_test_canonicalize_fneg_var_f32:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_load_b32 v1, v0, s[0:1]
+; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX11-SDAG-NEXT: v_max_f32_e64 v1, -v1, -v1
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: v_test_canonicalize_fneg_var_f32:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: s_load_b32 s2, s[0:1], 0x0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: v_max_f32_e64 v0, -s2, -s2
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: v_test_canonicalize_fneg_var_f32:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_load_b32 v1, v0, s[0:1]
+; GFX12-SDAG-NEXT: s_wait_loadcnt 0x0
+; GFX12-SDAG-NEXT: v_max_num_f32_e64 v1, -v1, -v1
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: v_test_canonicalize_fneg_var_f32:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: s_load_b32 s2, s[0:1], 0x0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: v_max_num_f32_e64 v0, -s2, -s2
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%val = load float, ptr addrspace(1) %out
%val.fneg = fneg float %val
%canonicalized = call float @llvm.canonicalize.f32(float %val.fneg)
@@ -403,32 +660,59 @@ define amdgpu_kernel void @test_fold_canonicalize_n0_f32(ptr addrspace(1) %out)
; GFX678-NEXT: flat_store_dword v[0:1], v2
; GFX678-NEXT: s_endpgm
;
-; GFX9-LABEL: test_fold_canonicalize_n0_f32:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_bfrev_b32_e32 v1, 1
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_n0_f32:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_mov_b32_e32 v0, 0
-; GFX11-NEXT: v_bfrev_b32_e32 v1, 1
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_n0_f32:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_mov_b32_e32 v0, 0
-; GFX12-NEXT: v_bfrev_b32_e32 v1, 1
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX9-SDAG-LABEL: test_fold_canonicalize_n0_f32:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_n0_f32:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_bfrev_b32_e32 v0, 1
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_n0_f32:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-SDAG-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_n0_f32:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_bfrev_b32_e32 v0, 1
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_n0_f32:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-SDAG-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_n0_f32:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_bfrev_b32_e32 v0, 1
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call float @llvm.canonicalize.f32(float -0.0)
store float %canonicalized, ptr addrspace(1) %out
ret void
@@ -448,30 +732,55 @@ define amdgpu_kernel void @test_fold_canonicalize_p1_f32(ptr addrspace(1) %out)
; GFX678-NEXT: flat_store_dword v[0:1], v2
; GFX678-NEXT: s_endpgm
;
-; GFX9-LABEL: test_fold_canonicalize_p1_f32:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 1.0
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_p1_f32:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 1.0
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_p1_f32:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 1.0
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX9-SDAG-LABEL: test_fold_canonicalize_p1_f32:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 1.0
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_p1_f32:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 1.0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_p1_f32:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 1.0
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_p1_f32:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v0, 1.0 :: v_dual_mov_b32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_p1_f32:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 1.0
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_p1_f32:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v0, 1.0 :: v_dual_mov_b32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call float @llvm.canonicalize.f32(float 1.0)
store float %canonicalized, ptr addrspace(1) %out
ret void
@@ -491,30 +800,55 @@ define amdgpu_kernel void @test_fold_canonicalize_n1_f32(ptr addrspace(1) %out)
; GFX678-NEXT: flat_store_dword v[0:1], v2
; GFX678-NEXT: s_endpgm
;
-; GFX9-LABEL: test_fold_canonicalize_n1_f32:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, -1.0
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_n1_f32:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, -1.0
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_n1_f32:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, -1.0
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX9-SDAG-LABEL: test_fold_canonicalize_n1_f32:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, -1.0
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_n1_f32:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, -1.0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_n1_f32:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, -1.0
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_n1_f32:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v0, -1.0 :: v_dual_mov_b32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_n1_f32:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, -1.0
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_n1_f32:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v0, -1.0 :: v_dual_mov_b32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call float @llvm.canonicalize.f32(float -1.0)
store float %canonicalized, ptr addrspace(1) %out
ret void
@@ -534,30 +868,55 @@ define amdgpu_kernel void @test_fold_canonicalize_literal_f32(ptr addrspace(1) %
; GFX678-NEXT: flat_store_dword v[0:1], v2
; GFX678-NEXT: s_endpgm
;
-; GFX9-LABEL: test_fold_canonicalize_literal_f32:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x41800000
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_literal_f32:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x41800000
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_literal_f32:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x41800000
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX9-SDAG-LABEL: test_fold_canonicalize_literal_f32:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x41800000
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_literal_f32:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0x41800000
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_literal_f32:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x41800000
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_literal_f32:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v0, 0x41800000 :: v_dual_mov_b32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_literal_f32:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x41800000
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_literal_f32:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v0, 0x41800000 :: v_dual_mov_b32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call float @llvm.canonicalize.f32(float 16.0)
store float %canonicalized, ptr addrspace(1) %out
ret void
@@ -606,184 +965,335 @@ define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal0_f32(ptr
}
define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal0_f32_dynamic(ptr addrspace(1) %out) #5 {
-; GFX678-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic:
+; GFX678-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 s2, 0x7fffff
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-SDAG-NEXT: v_mul_f32_e64 v2, 1.0, s2
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-SDAG-NEXT: flat_store_dword v[0:1], v2
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, 0x7fffff
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mul_f32_e32 v2, 1.0, v0
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-GISEL-NEXT: flat_store_dword v[0:1], v2
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: s_mov_b32 s2, 0x7fffff
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_max_f32_e64 v1, s2, s2
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0x7fffff
+; GFX9-GISEL-NEXT: v_max_f32_e32 v0, 0x7fffff, v0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-SDAG-NEXT: v_max_f32_e64 v1, 0x7fffff, 0x7fffff
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_max_f32_e64 v0, 0x7fffff, 0x7fffff
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-SDAG-NEXT: v_max_num_f32_e64 v1, 0x7fffff, 0x7fffff
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_max_num_f32_e64 v0, 0x7fffff, 0x7fffff
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
+ %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float))
+ store float %canonicalized, ptr addrspace(1) %out
+ ret void
+}
+
+define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_out(ptr addrspace(1) %out) #6 {
+; GFX678-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_out:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 s2, 0x7fffff
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-SDAG-NEXT: v_mul_f32_e64 v2, 1.0, s2
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-SDAG-NEXT: flat_store_dword v[0:1], v2
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_out:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, 0x7fffff
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mul_f32_e32 v2, 1.0, v0
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-GISEL-NEXT: flat_store_dword v[0:1], v2
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_out:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: s_mov_b32 s2, 0x7fffff
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_max_f32_e64 v1, s2, s2
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_out:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0x7fffff
+; GFX9-GISEL-NEXT: v_max_f32_e32 v0, 0x7fffff, v0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_out:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-SDAG-NEXT: v_max_f32_e64 v1, 0x7fffff, 0x7fffff
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_out:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_max_f32_e64 v0, 0x7fffff, 0x7fffff
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_out:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-SDAG-NEXT: v_max_num_f32_e64 v1, 0x7fffff, 0x7fffff
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_out:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_max_num_f32_e64 v0, 0x7fffff, 0x7fffff
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
+ %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float))
+ store float %canonicalized, ptr addrspace(1) %out
+ ret void
+}
+
+define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_in(ptr addrspace(1) %out) #7 {
+; GFX678-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_in:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 s2, 0x7fffff
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-SDAG-NEXT: v_mul_f32_e64 v2, 1.0, s2
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-SDAG-NEXT: flat_store_dword v[0:1], v2
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_in:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, 0x7fffff
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mul_f32_e32 v2, 1.0, v0
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-GISEL-NEXT: flat_store_dword v[0:1], v2
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_in:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: s_mov_b32 s2, 0x7fffff
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_max_f32_e64 v1, s2, s2
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_in:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0x7fffff
+; GFX9-GISEL-NEXT: v_max_f32_e32 v0, 0x7fffff, v0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_in:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-SDAG-NEXT: v_max_f32_e64 v1, 0x7fffff, 0x7fffff
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_in:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_max_f32_e64 v0, 0x7fffff, 0x7fffff
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_in:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-SDAG-NEXT: v_max_num_f32_e64 v1, 0x7fffff, 0x7fffff
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_in:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_max_num_f32_e64 v0, 0x7fffff, 0x7fffff
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
+ %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float))
+ store float %canonicalized, ptr addrspace(1) %out
+ ret void
+}
+
+define amdgpu_kernel void @test_denormals_fold_canonicalize_denormal0_f32(ptr addrspace(1) %out) #3 {
+; GFX678-LABEL: test_denormals_fold_canonicalize_denormal0_f32:
; GFX678: ; %bb.0:
; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 s2, 0x7fffff
; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-NEXT: v_mov_b32_e32 v2, 0x7fffff
; GFX678-NEXT: s_waitcnt lgkmcnt(0)
; GFX678-NEXT: v_mov_b32_e32 v0, s0
-; GFX678-NEXT: v_mul_f32_e64 v2, 1.0, s2
; GFX678-NEXT: v_mov_b32_e32 v1, s1
; GFX678-NEXT: flat_store_dword v[0:1], v2
; GFX678-NEXT: s_endpgm
;
-; GFX9-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: s_mov_b32 s2, 0x7fffff
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_max_f32_e64 v1, s2, s2
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_mov_b32_e32 v0, 0
-; GFX11-NEXT: v_max_f32_e64 v1, 0x7fffff, 0x7fffff
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_mov_b32_e32 v0, 0
-; GFX12-NEXT: v_max_num_f32_e64 v1, 0x7fffff, 0x7fffff
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
- %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float))
- store float %canonicalized, ptr addrspace(1) %out
- ret void
-}
-
-define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_out(ptr addrspace(1) %out) #6 {
-; GFX678-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_out:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 s2, 0x7fffff
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v0, s0
-; GFX678-NEXT: v_mul_f32_e64 v2, 1.0, s2
-; GFX678-NEXT: v_mov_b32_e32 v1, s1
-; GFX678-NEXT: flat_store_dword v[0:1], v2
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_out:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: s_mov_b32 s2, 0x7fffff
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_max_f32_e64 v1, s2, s2
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_out:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_mov_b32_e32 v0, 0
-; GFX11-NEXT: v_max_f32_e64 v1, 0x7fffff, 0x7fffff
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_out:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_mov_b32_e32 v0, 0
-; GFX12-NEXT: v_max_num_f32_e64 v1, 0x7fffff, 0x7fffff
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
- %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float))
- store float %canonicalized, ptr addrspace(1) %out
- ret void
-}
-
-define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_in(ptr addrspace(1) %out) #7 {
-; GFX678-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_in:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 s2, 0x7fffff
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v0, s0
-; GFX678-NEXT: v_mul_f32_e64 v2, 1.0, s2
-; GFX678-NEXT: v_mov_b32_e32 v1, s1
-; GFX678-NEXT: flat_store_dword v[0:1], v2
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_in:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: s_mov_b32 s2, 0x7fffff
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_max_f32_e64 v1, s2, s2
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_in:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_mov_b32_e32 v0, 0
-; GFX11-NEXT: v_max_f32_e64 v1, 0x7fffff, 0x7fffff
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_in:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_mov_b32_e32 v0, 0
-; GFX12-NEXT: v_max_num_f32_e64 v1, 0x7fffff, 0x7fffff
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
- %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float))
- store float %canonicalized, ptr addrspace(1) %out
- ret void
-}
-
-define amdgpu_kernel void @test_denormals_fold_canonicalize_denormal0_f32(ptr addrspace(1) %out) #3 {
-; GFX678-LABEL: test_denormals_fold_canonicalize_denormal0_f32:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v2, 0x7fffff
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v0, s0
-; GFX678-NEXT: v_mov_b32_e32 v1, s1
-; GFX678-NEXT: flat_store_dword v[0:1], v2
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_denormals_fold_canonicalize_denormal0_f32:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fffff
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_denormals_fold_canonicalize_denormal0_f32:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fffff
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_denormals_fold_canonicalize_denormal0_f32:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fffff
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX9-SDAG-LABEL: test_denormals_fold_canonicalize_denormal0_f32:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x7fffff
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_denormals_fold_canonicalize_denormal0_f32:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0x7fffff
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_denormals_fold_canonicalize_denormal0_f32:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fffff
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_denormals_fold_canonicalize_denormal0_f32:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v0, 0x7fffff :: v_dual_mov_b32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_denormals_fold_canonicalize_denormal0_f32:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fffff
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_denormals_fold_canonicalize_denormal0_f32:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v0, 0x7fffff :: v_dual_mov_b32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float))
store float %canonicalized, ptr addrspace(1) %out
ret void
@@ -803,32 +1313,59 @@ define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal1_f32(ptr
; GFX678-NEXT: flat_store_dword v[0:1], v2
; GFX678-NEXT: s_endpgm
;
-; GFX9-LABEL: test_no_denormals_fold_canonicalize_denormal1_f32:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_bfrev_b32_e32 v1, 1
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_no_denormals_fold_canonicalize_denormal1_f32:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_mov_b32_e32 v0, 0
-; GFX11-NEXT: v_bfrev_b32_e32 v1, 1
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_no_denormals_fold_canonicalize_denormal1_f32:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_mov_b32_e32 v0, 0
-; GFX12-NEXT: v_bfrev_b32_e32 v1, 1
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX9-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal1_f32:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal1_f32:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_bfrev_b32_e32 v0, 1
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal1_f32:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-SDAG-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal1_f32:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_bfrev_b32_e32 v0, 1
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal1_f32:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-SDAG-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal1_f32:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_bfrev_b32_e32 v0, 1
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 2155872255 to float))
store float %canonicalized, ptr addrspace(1) %out
ret void
@@ -848,30 +1385,55 @@ define amdgpu_kernel void @test_denormals_fold_canonicalize_denormal1_f32(ptr ad
; GFX678-NEXT: flat_store_dword v[0:1], v2
; GFX678-NEXT: s_endpgm
;
-; GFX9-LABEL: test_denormals_fold_canonicalize_denormal1_f32:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x807fffff
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_denormals_fold_canonicalize_denormal1_f32:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x807fffff
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_denormals_fold_canonicalize_denormal1_f32:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x807fffff
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX9-SDAG-LABEL: test_denormals_fold_canonicalize_denormal1_f32:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x807fffff
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_denormals_fold_canonicalize_denormal1_f32:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0x807fffff
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_denormals_fold_canonicalize_denormal1_f32:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x807fffff
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_denormals_fold_canonicalize_denormal1_f32:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v0, 0x807fffff :: v_dual_mov_b32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_denormals_fold_canonicalize_denormal1_f32:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x807fffff
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_denormals_fold_canonicalize_denormal1_f32:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v0, 0x807fffff :: v_dual_mov_b32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 2155872255 to float))
store float %canonicalized, ptr addrspace(1) %out
ret void
@@ -891,341 +1453,658 @@ define amdgpu_kernel void @test_fold_canonicalize_qnan_f32(ptr addrspace(1) %out
; GFX678-NEXT: flat_store_dword v[0:1], v2
; GFX678-NEXT: s_endpgm
;
-; GFX9-LABEL: test_fold_canonicalize_qnan_f32:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fc00000
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_qnan_f32:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_qnan_f32:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX9-SDAG-LABEL: test_fold_canonicalize_qnan_f32:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x7fc00000
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_qnan_f32:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0x7fc00000
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_qnan_f32:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_qnan_f32:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v0, 0x7fc00000 :: v_dual_mov_b32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_qnan_f32:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_qnan_f32:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v0, 0x7fc00000 :: v_dual_mov_b32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call float @llvm.canonicalize.f32(float 0x7FF8000000000000)
store float %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @test_fold_canonicalize_qnan_value_neg1_f32(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: test_fold_canonicalize_qnan_value_neg1_f32:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v2, 0x7fc00000
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v0, s0
-; GFX678-NEXT: v_mov_b32_e32 v1, s1
-; GFX678-NEXT: flat_store_dword v[0:1], v2
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_fold_canonicalize_qnan_value_neg1_f32:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fc00000
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_qnan_value_neg1_f32:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_qnan_value_neg1_f32:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: test_fold_canonicalize_qnan_value_neg1_f32:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, 0x7fc00000
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-SDAG-NEXT: flat_store_dword v[0:1], v2
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_fold_canonicalize_qnan_value_neg1_f32:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, -1
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-GISEL-NEXT: flat_store_dword v[0:1], v2
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_fold_canonicalize_qnan_value_neg1_f32:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x7fc00000
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_qnan_value_neg1_f32:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_qnan_value_neg1_f32:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_qnan_value_neg1_f32:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v0, -1 :: v_dual_mov_b32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_qnan_value_neg1_f32:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_qnan_value_neg1_f32:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v0, -1 :: v_dual_mov_b32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 -1 to float))
store float %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @test_fold_canonicalize_qnan_value_neg2_f32(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: test_fold_canonicalize_qnan_value_neg2_f32:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v2, 0x7fc00000
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v0, s0
-; GFX678-NEXT: v_mov_b32_e32 v1, s1
-; GFX678-NEXT: flat_store_dword v[0:1], v2
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_fold_canonicalize_qnan_value_neg2_f32:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fc00000
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_qnan_value_neg2_f32:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_qnan_value_neg2_f32:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: test_fold_canonicalize_qnan_value_neg2_f32:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, 0x7fc00000
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-SDAG-NEXT: flat_store_dword v[0:1], v2
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_fold_canonicalize_qnan_value_neg2_f32:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, -2
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-GISEL-NEXT: flat_store_dword v[0:1], v2
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_fold_canonicalize_qnan_value_neg2_f32:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x7fc00000
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_qnan_value_neg2_f32:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, -2
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_qnan_value_neg2_f32:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_qnan_value_neg2_f32:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v0, -2 :: v_dual_mov_b32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_qnan_value_neg2_f32:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_qnan_value_neg2_f32:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v0, -2 :: v_dual_mov_b32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 -2 to float))
store float %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @test_fold_canonicalize_snan0_value_f32(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: test_fold_canonicalize_snan0_value_f32:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v2, 0x7fc00000
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v0, s0
-; GFX678-NEXT: v_mov_b32_e32 v1, s1
-; GFX678-NEXT: flat_store_dword v[0:1], v2
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_fold_canonicalize_snan0_value_f32:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fc00000
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_snan0_value_f32:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_snan0_value_f32:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: test_fold_canonicalize_snan0_value_f32:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, 0x7fc00000
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-SDAG-NEXT: flat_store_dword v[0:1], v2
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_fold_canonicalize_snan0_value_f32:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, 0x7f800001
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mul_f32_e32 v2, 1.0, v0
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-GISEL-NEXT: flat_store_dword v[0:1], v2
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_fold_canonicalize_snan0_value_f32:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x7fc00000
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_snan0_value_f32:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0x7f800001
+; GFX9-GISEL-NEXT: v_max_f32_e32 v0, 0x7f800001, v0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_snan0_value_f32:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_snan0_value_f32:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_max_f32_e64 v0, 0x7f800001, 0x7f800001
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_snan0_value_f32:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_snan0_value_f32:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_max_num_f32_e64 v0, 0x7f800001, 0x7f800001
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 2139095041 to float))
store float %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @test_fold_canonicalize_snan1_value_f32(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: test_fold_canonicalize_snan1_value_f32:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v2, 0x7fc00000
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v0, s0
-; GFX678-NEXT: v_mov_b32_e32 v1, s1
-; GFX678-NEXT: flat_store_dword v[0:1], v2
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_fold_canonicalize_snan1_value_f32:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fc00000
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_snan1_value_f32:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_snan1_value_f32:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: test_fold_canonicalize_snan1_value_f32:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, 0x7fc00000
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-SDAG-NEXT: flat_store_dword v[0:1], v2
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_fold_canonicalize_snan1_value_f32:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, 0x7fbfffff
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mul_f32_e32 v2, 1.0, v0
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-GISEL-NEXT: flat_store_dword v[0:1], v2
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_fold_canonicalize_snan1_value_f32:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x7fc00000
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_snan1_value_f32:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0x7fbfffff
+; GFX9-GISEL-NEXT: v_max_f32_e32 v0, 0x7fbfffff, v0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_snan1_value_f32:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_snan1_value_f32:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_max_f32_e64 v0, 0x7fbfffff, 0x7fbfffff
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_snan1_value_f32:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_snan1_value_f32:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_max_num_f32_e64 v0, 0x7fbfffff, 0x7fbfffff
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 2143289343 to float))
store float %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @test_fold_canonicalize_snan2_value_f32(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: test_fold_canonicalize_snan2_value_f32:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v2, 0x7fc00000
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v0, s0
-; GFX678-NEXT: v_mov_b32_e32 v1, s1
-; GFX678-NEXT: flat_store_dword v[0:1], v2
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_fold_canonicalize_snan2_value_f32:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fc00000
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_snan2_value_f32:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_snan2_value_f32:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: test_fold_canonicalize_snan2_value_f32:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, 0x7fc00000
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-SDAG-NEXT: flat_store_dword v[0:1], v2
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_fold_canonicalize_snan2_value_f32:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, 0xff800001
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mul_f32_e32 v2, 1.0, v0
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-GISEL-NEXT: flat_store_dword v[0:1], v2
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_fold_canonicalize_snan2_value_f32:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x7fc00000
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_snan2_value_f32:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0xff800001
+; GFX9-GISEL-NEXT: v_max_f32_e32 v0, 0xff800001, v0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_snan2_value_f32:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_snan2_value_f32:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_max_f32_e64 v0, 0xff800001, 0xff800001
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_snan2_value_f32:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_snan2_value_f32:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_max_num_f32_e64 v0, 0xff800001, 0xff800001
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 4286578689 to float))
store float %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @test_fold_canonicalize_snan3_value_f32(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: test_fold_canonicalize_snan3_value_f32:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v2, 0x7fc00000
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v0, s0
-; GFX678-NEXT: v_mov_b32_e32 v1, s1
-; GFX678-NEXT: flat_store_dword v[0:1], v2
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_fold_canonicalize_snan3_value_f32:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fc00000
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dword v0, v1, s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_snan3_value_f32:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_snan3_value_f32:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: test_fold_canonicalize_snan3_value_f32:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, 0x7fc00000
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-SDAG-NEXT: flat_store_dword v[0:1], v2
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_fold_canonicalize_snan3_value_f32:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, 0xffbfffff
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mul_f32_e32 v2, 1.0, v0
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-GISEL-NEXT: flat_store_dword v[0:1], v2
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_fold_canonicalize_snan3_value_f32:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x7fc00000
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dword v0, v1, s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_snan3_value_f32:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0xffbfffff
+; GFX9-GISEL-NEXT: v_max_f32_e32 v0, 0xffbfffff, v0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dword v1, v0, s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_snan3_value_f32:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_snan3_value_f32:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_max_f32_e64 v0, 0xffbfffff, 0xffbfffff
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_snan3_value_f32:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b32 v0, v1, s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_snan3_value_f32:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_max_num_f32_e64 v0, 0xffbfffff, 0xffbfffff
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 4290772991 to float))
store float %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @v_test_canonicalize_var_f64(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: v_test_canonicalize_var_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v0, s0
-; GFX678-NEXT: v_mov_b32_e32 v1, s1
-; GFX678-NEXT: flat_load_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_waitcnt vmcnt(0)
-; GFX678-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]
-; GFX678-NEXT: flat_store_dwordx2 v[0:1], v[2:3]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: v_test_canonicalize_var_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v2, 0
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[0:1]
-; GFX9-NEXT: s_waitcnt vmcnt(0)
-; GFX9-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
-; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: v_test_canonicalize_var_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_mov_b32_e32 v2, 0
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_load_b64 v[0:1], v2, s[0:1]
-; GFX11-NEXT: s_waitcnt vmcnt(0)
-; GFX11-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
-; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: v_test_canonicalize_var_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_mov_b32_e32 v2, 0
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_load_b64 v[0:1], v2, s[0:1]
-; GFX12-NEXT: s_wait_loadcnt 0x0
-; GFX12-NEXT: v_max_num_f64_e32 v[0:1], v[0:1], v[0:1]
-; GFX12-NEXT: global_store_b64 v2, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: v_test_canonicalize_var_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-SDAG-NEXT: flat_load_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX678-SDAG-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[0:1], v[2:3]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: v_test_canonicalize_var_f64:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_max_f64 v[0:1], s[2:3], s[2:3]
+; GFX678-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: v_test_canonicalize_var_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_load_dwordx2 v[0:1], v2, s[0:1]
+; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX9-SDAG-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX9-SDAG-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: v_test_canonicalize_var_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: v_max_f64 v[0:1], s[2:3], s[2:3]
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: v_test_canonicalize_var_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v2, 0
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_load_b64 v[0:1], v2, s[0:1]
+; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX11-SDAG-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX11-SDAG-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: v_test_canonicalize_var_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: s_load_b64 s[2:3], s[0:1], 0x0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: v_max_f64 v[0:1], s[2:3], s[2:3]
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: v_test_canonicalize_var_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v2, 0
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_load_b64 v[0:1], v2, s[0:1]
+; GFX12-SDAG-NEXT: s_wait_loadcnt 0x0
+; GFX12-SDAG-NEXT: v_max_num_f64_e32 v[0:1], v[0:1], v[0:1]
+; GFX12-SDAG-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: v_test_canonicalize_var_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: s_load_b64 s[2:3], s[0:1], 0x0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: v_max_num_f64_e64 v[0:1], s[2:3], s[2:3]
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%val = load double, ptr addrspace(1) %out
%canonicalized = call double @llvm.canonicalize.f64(double %val)
store double %canonicalized, ptr addrspace(1) %out
@@ -1233,31 +2112,44 @@ define amdgpu_kernel void @v_test_canonicalize_var_f64(ptr addrspace(1) %out) #1
}
define amdgpu_kernel void @s_test_canonicalize_var_f64(ptr addrspace(1) %out, double %val) #1 {
-; GFX6-LABEL: s_test_canonicalize_var_f64:
-; GFX6: ; %bb.0:
-; GFX6-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
-; GFX6-NEXT: s_add_i32 s12, s12, s17
-; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX6-NEXT: s_waitcnt lgkmcnt(0)
-; GFX6-NEXT: v_max_f64 v[2:3], s[2:3], s[2:3]
-; GFX6-NEXT: v_mov_b32_e32 v0, s0
-; GFX6-NEXT: v_mov_b32_e32 v1, s1
-; GFX6-NEXT: flat_store_dwordx2 v[0:1], v[2:3]
-; GFX6-NEXT: s_endpgm
-;
-; GFX8-LABEL: s_test_canonicalize_var_f64:
-; GFX8: ; %bb.0:
-; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
-; GFX8-NEXT: s_add_i32 s12, s12, s17
-; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX8-NEXT: s_waitcnt lgkmcnt(0)
-; GFX8-NEXT: v_max_f64 v[0:1], s[2:3], s[2:3]
-; GFX8-NEXT: v_mov_b32_e32 v2, s0
-; GFX8-NEXT: v_mov_b32_e32 v3, s1
-; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX8-NEXT: s_endpgm
+; GFX6-SDAG-LABEL: s_test_canonicalize_var_f64:
+; GFX6-SDAG: ; %bb.0:
+; GFX6-SDAG-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX6-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX6-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-SDAG-NEXT: v_max_f64 v[2:3], s[2:3], s[2:3]
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-SDAG-NEXT: flat_store_dwordx2 v[0:1], v[2:3]
+; GFX6-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: s_test_canonicalize_var_f64:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_max_f64 v[0:1], s[2:3], s[2:3]
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX8-SDAG-LABEL: s_test_canonicalize_var_f64:
+; GFX8-SDAG: ; %bb.0:
+; GFX8-SDAG-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX8-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX8-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-SDAG-NEXT: v_max_f64 v[0:1], s[2:3], s[2:3]
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v2, s0
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v3, s1
+; GFX8-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX8-SDAG-NEXT: s_endpgm
;
; GFX9-LABEL: s_test_canonicalize_var_f64:
; GFX9: ; %bb.0:
@@ -1291,53 +2183,101 @@ define amdgpu_kernel void @s_test_canonicalize_var_f64(ptr addrspace(1) %out, do
}
define amdgpu_kernel void @v_test_canonicalize_fabs_var_f64(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: v_test_canonicalize_fabs_var_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v0, s0
-; GFX678-NEXT: v_mov_b32_e32 v1, s1
-; GFX678-NEXT: flat_load_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_waitcnt vmcnt(0)
-; GFX678-NEXT: v_max_f64 v[2:3], |v[2:3]|, |v[2:3]|
-; GFX678-NEXT: flat_store_dwordx2 v[0:1], v[2:3]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: v_test_canonicalize_fabs_var_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v2, 0
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[0:1]
-; GFX9-NEXT: s_waitcnt vmcnt(0)
-; GFX9-NEXT: v_max_f64 v[0:1], |v[0:1]|, |v[0:1]|
-; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: v_test_canonicalize_fabs_var_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_mov_b32_e32 v2, 0
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_load_b64 v[0:1], v2, s[0:1]
-; GFX11-NEXT: s_waitcnt vmcnt(0)
-; GFX11-NEXT: v_max_f64 v[0:1], |v[0:1]|, |v[0:1]|
-; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: v_test_canonicalize_fabs_var_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_mov_b32_e32 v2, 0
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_load_b64 v[0:1], v2, s[0:1]
-; GFX12-NEXT: s_wait_loadcnt 0x0
-; GFX12-NEXT: v_max_num_f64_e64 v[0:1], |v[0:1]|, |v[0:1]|
-; GFX12-NEXT: global_store_b64 v2, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: v_test_canonicalize_fabs_var_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-SDAG-NEXT: flat_load_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX678-SDAG-NEXT: v_max_f64 v[2:3], |v[2:3]|, |v[2:3]|
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[0:1], v[2:3]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: v_test_canonicalize_fabs_var_f64:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_max_f64 v[0:1], |s[2:3]|, |s[2:3]|
+; GFX678-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: v_test_canonicalize_fabs_var_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_load_dwordx2 v[0:1], v2, s[0:1]
+; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX9-SDAG-NEXT: v_max_f64 v[0:1], |v[0:1]|, |v[0:1]|
+; GFX9-SDAG-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: v_test_canonicalize_fabs_var_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: v_max_f64 v[0:1], |s[2:3]|, |s[2:3]|
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: v_test_canonicalize_fabs_var_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v2, 0
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_load_b64 v[0:1], v2, s[0:1]
+; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX11-SDAG-NEXT: v_max_f64 v[0:1], |v[0:1]|, |v[0:1]|
+; GFX11-SDAG-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: v_test_canonicalize_fabs_var_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: s_load_b64 s[2:3], s[0:1], 0x0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: v_max_f64 v[0:1], |s[2:3]|, |s[2:3]|
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: v_test_canonicalize_fabs_var_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v2, 0
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_load_b64 v[0:1], v2, s[0:1]
+; GFX12-SDAG-NEXT: s_wait_loadcnt 0x0
+; GFX12-SDAG-NEXT: v_max_num_f64_e64 v[0:1], |v[0:1]|, |v[0:1]|
+; GFX12-SDAG-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: v_test_canonicalize_fabs_var_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: s_load_b64 s[2:3], s[0:1], 0x0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: v_max_num_f64_e64 v[0:1], |s[2:3]|, |s[2:3]|
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%val = load double, ptr addrspace(1) %out
%val.fabs = call double @llvm.fabs.f64(double %val)
%canonicalized = call double @llvm.canonicalize.f64(double %val.fabs)
@@ -1346,53 +2286,101 @@ define amdgpu_kernel void @v_test_canonicalize_fabs_var_f64(ptr addrspace(1) %ou
}
define amdgpu_kernel void @v_test_canonicalize_fneg_fabs_var_f64(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: v_test_canonicalize_fneg_fabs_var_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v0, s0
-; GFX678-NEXT: v_mov_b32_e32 v1, s1
-; GFX678-NEXT: flat_load_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_waitcnt vmcnt(0)
-; GFX678-NEXT: v_max_f64 v[2:3], -|v[2:3]|, -|v[2:3]|
-; GFX678-NEXT: flat_store_dwordx2 v[0:1], v[2:3]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: v_test_canonicalize_fneg_fabs_var_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v2, 0
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[0:1]
-; GFX9-NEXT: s_waitcnt vmcnt(0)
-; GFX9-NEXT: v_max_f64 v[0:1], -|v[0:1]|, -|v[0:1]|
-; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: v_test_canonicalize_fneg_fabs_var_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_mov_b32_e32 v2, 0
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_load_b64 v[0:1], v2, s[0:1]
-; GFX11-NEXT: s_waitcnt vmcnt(0)
-; GFX11-NEXT: v_max_f64 v[0:1], -|v[0:1]|, -|v[0:1]|
-; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: v_test_canonicalize_fneg_fabs_var_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_mov_b32_e32 v2, 0
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_load_b64 v[0:1], v2, s[0:1]
-; GFX12-NEXT: s_wait_loadcnt 0x0
-; GFX12-NEXT: v_max_num_f64_e64 v[0:1], -|v[0:1]|, -|v[0:1]|
-; GFX12-NEXT: global_store_b64 v2, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: v_test_canonicalize_fneg_fabs_var_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-SDAG-NEXT: flat_load_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX678-SDAG-NEXT: v_max_f64 v[2:3], -|v[2:3]|, -|v[2:3]|
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[0:1], v[2:3]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: v_test_canonicalize_fneg_fabs_var_f64:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_max_f64 v[0:1], -|s[2:3]|, -|s[2:3]|
+; GFX678-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: v_test_canonicalize_fneg_fabs_var_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_load_dwordx2 v[0:1], v2, s[0:1]
+; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX9-SDAG-NEXT: v_max_f64 v[0:1], -|v[0:1]|, -|v[0:1]|
+; GFX9-SDAG-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: v_test_canonicalize_fneg_fabs_var_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: v_max_f64 v[0:1], -|s[2:3]|, -|s[2:3]|
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: v_test_canonicalize_fneg_fabs_var_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v2, 0
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_load_b64 v[0:1], v2, s[0:1]
+; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX11-SDAG-NEXT: v_max_f64 v[0:1], -|v[0:1]|, -|v[0:1]|
+; GFX11-SDAG-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: v_test_canonicalize_fneg_fabs_var_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: s_load_b64 s[2:3], s[0:1], 0x0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: v_max_f64 v[0:1], -|s[2:3]|, -|s[2:3]|
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: v_test_canonicalize_fneg_fabs_var_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v2, 0
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_load_b64 v[0:1], v2, s[0:1]
+; GFX12-SDAG-NEXT: s_wait_loadcnt 0x0
+; GFX12-SDAG-NEXT: v_max_num_f64_e64 v[0:1], -|v[0:1]|, -|v[0:1]|
+; GFX12-SDAG-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: v_test_canonicalize_fneg_fabs_var_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: s_load_b64 s[2:3], s[0:1], 0x0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: v_max_num_f64_e64 v[0:1], -|s[2:3]|, -|s[2:3]|
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%val = load double, ptr addrspace(1) %out
%val.fabs = call double @llvm.fabs.f64(double %val)
%val.fabs.fneg = fneg double %val.fabs
@@ -1402,53 +2390,101 @@ define amdgpu_kernel void @v_test_canonicalize_fneg_fabs_var_f64(ptr addrspace(1
}
define amdgpu_kernel void @v_test_canonicalize_fneg_var_f64(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: v_test_canonicalize_fneg_var_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v0, s0
-; GFX678-NEXT: v_mov_b32_e32 v1, s1
-; GFX678-NEXT: flat_load_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_waitcnt vmcnt(0)
-; GFX678-NEXT: v_max_f64 v[2:3], -v[2:3], -v[2:3]
-; GFX678-NEXT: flat_store_dwordx2 v[0:1], v[2:3]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: v_test_canonicalize_fneg_var_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v2, 0
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[0:1]
-; GFX9-NEXT: s_waitcnt vmcnt(0)
-; GFX9-NEXT: v_max_f64 v[0:1], -v[0:1], -v[0:1]
-; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: v_test_canonicalize_fneg_var_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_mov_b32_e32 v2, 0
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_load_b64 v[0:1], v2, s[0:1]
-; GFX11-NEXT: s_waitcnt vmcnt(0)
-; GFX11-NEXT: v_max_f64 v[0:1], -v[0:1], -v[0:1]
-; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: v_test_canonicalize_fneg_var_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_mov_b32_e32 v2, 0
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_load_b64 v[0:1], v2, s[0:1]
-; GFX12-NEXT: s_wait_loadcnt 0x0
-; GFX12-NEXT: v_max_num_f64_e64 v[0:1], -v[0:1], -v[0:1]
-; GFX12-NEXT: global_store_b64 v2, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: v_test_canonicalize_fneg_var_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, s0
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX678-SDAG-NEXT: flat_load_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX678-SDAG-NEXT: v_max_f64 v[2:3], -v[2:3], -v[2:3]
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[0:1], v[2:3]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: v_test_canonicalize_fneg_var_f64:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_max_f64 v[0:1], -s[2:3], -s[2:3]
+; GFX678-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: v_test_canonicalize_fneg_var_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_load_dwordx2 v[0:1], v2, s[0:1]
+; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX9-SDAG-NEXT: v_max_f64 v[0:1], -v[0:1], -v[0:1]
+; GFX9-SDAG-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: v_test_canonicalize_fneg_var_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: v_max_f64 v[0:1], -s[2:3], -s[2:3]
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: v_test_canonicalize_fneg_var_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v2, 0
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_load_b64 v[0:1], v2, s[0:1]
+; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX11-SDAG-NEXT: v_max_f64 v[0:1], -v[0:1], -v[0:1]
+; GFX11-SDAG-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: v_test_canonicalize_fneg_var_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: s_load_b64 s[2:3], s[0:1], 0x0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: v_max_f64 v[0:1], -s[2:3], -s[2:3]
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: v_test_canonicalize_fneg_var_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v2, 0
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_load_b64 v[0:1], v2, s[0:1]
+; GFX12-SDAG-NEXT: s_wait_loadcnt 0x0
+; GFX12-SDAG-NEXT: v_max_num_f64_e64 v[0:1], -v[0:1], -v[0:1]
+; GFX12-SDAG-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: v_test_canonicalize_fneg_var_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: s_load_b64 s[2:3], s[0:1], 0x0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: v_max_num_f64_e64 v[0:1], -s[2:3], -s[2:3]
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%val = load double, ptr addrspace(1) %out
%val.fneg = fneg double %val
%canonicalized = call double @llvm.canonicalize.f64(double %val.fneg)
@@ -1457,767 +2493,1531 @@ define amdgpu_kernel void @v_test_canonicalize_fneg_var_f64(ptr addrspace(1) %ou
}
define amdgpu_kernel void @test_fold_canonicalize_p0_f64(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: test_fold_canonicalize_p0_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: v_mov_b32_e32 v0, 0
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v3, s1
-; GFX678-NEXT: v_mov_b32_e32 v1, v0
-; GFX678-NEXT: v_mov_b32_e32 v2, s0
-; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_fold_canonicalize_p0_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, v0
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_p0_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_mov_b32_e32 v0, 0
-; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)
-; GFX11-NEXT: v_mov_b32_e32 v1, v0
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_p0_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_mov_b32_e32 v0, 0
-; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)
-; GFX12-NEXT: v_mov_b32_e32 v1, v0
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: test_fold_canonicalize_p0_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, v0
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_fold_canonicalize_p0_f64:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_fold_canonicalize_p0_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, v0
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_p0_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_p0_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1)
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v1, v0
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_p0_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v2, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_p0_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1)
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v1, v0
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_p0_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v2, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call double @llvm.canonicalize.f64(double 0.0)
store double %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @test_fold_canonicalize_n0_f64(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: test_fold_canonicalize_n0_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v0, 0
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v3, s1
-; GFX678-NEXT: v_bfrev_b32_e32 v1, 1
-; GFX678-NEXT: v_mov_b32_e32 v2, s0
-; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_fold_canonicalize_n0_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_bfrev_b32_e32 v1, 1
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_n0_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_mov_b32_e32 v0, 0
-; GFX11-NEXT: v_bfrev_b32_e32 v1, 1
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_n0_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_mov_b32_e32 v0, 0
-; GFX12-NEXT: v_bfrev_b32_e32 v1, 1
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: test_fold_canonicalize_n0_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-SDAG-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_fold_canonicalize_n0_f64:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-GISEL-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_fold_canonicalize_n0_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_n0_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-GISEL-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_n0_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-SDAG-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_n0_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-GISEL-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_n0_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-SDAG-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_n0_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-GISEL-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call double @llvm.canonicalize.f64(double -0.0)
store double %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @test_fold_canonicalize_p1_f64(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: test_fold_canonicalize_p1_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v0, 0
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v3, s1
-; GFX678-NEXT: v_mov_b32_e32 v1, 0x3ff00000
-; GFX678-NEXT: v_mov_b32_e32 v2, s0
-; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_fold_canonicalize_p1_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x3ff00000
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_p1_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x3ff00000
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_p1_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x3ff00000
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: test_fold_canonicalize_p1_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, 0x3ff00000
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_fold_canonicalize_p1_f64:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, 0x3ff00000
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_fold_canonicalize_p1_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x3ff00000
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_p1_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0x3ff00000
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_p1_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x3ff00000
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_p1_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v1, 0x3ff00000 :: v_dual_mov_b32 v2, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_p1_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x3ff00000
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_p1_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v1, 0x3ff00000 :: v_dual_mov_b32 v2, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call double @llvm.canonicalize.f64(double 1.0)
store double %canonicalized, ptr addrspace(1) %out
ret void
}
-define amdgpu_kernel void @test_fold_canonicalize_n1_f64(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: test_fold_canonicalize_n1_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v0, 0
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v3, s1
-; GFX678-NEXT: v_mov_b32_e32 v1, 0xbff00000
-; GFX678-NEXT: v_mov_b32_e32 v2, s0
-; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_fold_canonicalize_n1_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0xbff00000
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_n1_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0xbff00000
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_n1_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0xbff00000
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
- %canonicalized = call double @llvm.canonicalize.f64(double -1.0)
- store double %canonicalized, ptr addrspace(1) %out
- ret void
-}
-
-define amdgpu_kernel void @test_fold_canonicalize_literal_f64(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: test_fold_canonicalize_literal_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v0, 0
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v3, s1
-; GFX678-NEXT: v_mov_b32_e32 v1, 0x40300000
-; GFX678-NEXT: v_mov_b32_e32 v2, s0
-; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_fold_canonicalize_literal_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x40300000
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_literal_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x40300000
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_literal_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x40300000
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
- %canonicalized = call double @llvm.canonicalize.f64(double 16.0)
- store double %canonicalized, ptr addrspace(1) %out
- ret void
-}
-
-define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal0_f64(ptr addrspace(1) %out) #2 {
-; GFX678-LABEL: test_no_denormals_fold_canonicalize_denormal0_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: v_mov_b32_e32 v0, 0
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v3, s1
-; GFX678-NEXT: v_mov_b32_e32 v1, v0
-; GFX678-NEXT: v_mov_b32_e32 v2, s0
-; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_no_denormals_fold_canonicalize_denormal0_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, v0
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_no_denormals_fold_canonicalize_denormal0_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_mov_b32_e32 v0, 0
-; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)
-; GFX11-NEXT: v_mov_b32_e32 v1, v0
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_no_denormals_fold_canonicalize_denormal0_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_mov_b32_e32 v0, 0
-; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)
-; GFX12-NEXT: v_mov_b32_e32 v1, v0
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
- %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 4503599627370495 to double))
- store double %canonicalized, ptr addrspace(1) %out
- ret void
-}
-
-define amdgpu_kernel void @test_denormals_fold_canonicalize_denormal0_f64(ptr addrspace(1) %out) #3 {
-; GFX678-LABEL: test_denormals_fold_canonicalize_denormal0_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v0, -1
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v3, s1
-; GFX678-NEXT: v_mov_b32_e32 v1, 0xfffff
-; GFX678-NEXT: v_mov_b32_e32 v2, s0
-; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_denormals_fold_canonicalize_denormal0_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v2, 0
-; GFX9-NEXT: v_mov_b32_e32 v0, -1
-; GFX9-NEXT: v_mov_b32_e32 v1, 0xfffff
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_denormals_fold_canonicalize_denormal0_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v1, 0xfffff
-; GFX11-NEXT: v_mov_b32_e32 v0, -1
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_denormals_fold_canonicalize_denormal0_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v1, 0xfffff
-; GFX12-NEXT: v_mov_b32_e32 v0, -1
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b64 v2, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
+define amdgpu_kernel void @test_fold_canonicalize_n1_f64(ptr addrspace(1) %out) #1 {
+; GFX678-SDAG-LABEL: test_fold_canonicalize_n1_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, 0xbff00000
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_fold_canonicalize_n1_f64:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, 0xbff00000
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_fold_canonicalize_n1_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0xbff00000
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_n1_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0xbff00000
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_n1_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0xbff00000
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_n1_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v1, 0xbff00000 :: v_dual_mov_b32 v2, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_n1_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0xbff00000
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_n1_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v1, 0xbff00000 :: v_dual_mov_b32 v2, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
+ %canonicalized = call double @llvm.canonicalize.f64(double -1.0)
+ store double %canonicalized, ptr addrspace(1) %out
+ ret void
+}
+
+define amdgpu_kernel void @test_fold_canonicalize_literal_f64(ptr addrspace(1) %out) #1 {
+; GFX678-SDAG-LABEL: test_fold_canonicalize_literal_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, 0x40300000
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_fold_canonicalize_literal_f64:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, 0x40300000
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_fold_canonicalize_literal_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x40300000
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_literal_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0x40300000
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_literal_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x40300000
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_literal_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v1, 0x40300000 :: v_dual_mov_b32 v2, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_literal_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x40300000
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_literal_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v1, 0x40300000 :: v_dual_mov_b32 v2, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
+ %canonicalized = call double @llvm.canonicalize.f64(double 16.0)
+ store double %canonicalized, ptr addrspace(1) %out
+ ret void
+}
+
+define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal0_f64(ptr addrspace(1) %out) #2 {
+; GFX678-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal0_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, v0
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal0_f64:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal0_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, v0
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal0_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal0_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1)
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v1, v0
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal0_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v2, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal0_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1)
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v1, v0
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal0_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v2, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
+ %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 4503599627370495 to double))
+ store double %canonicalized, ptr addrspace(1) %out
+ ret void
+}
+
+define amdgpu_kernel void @test_denormals_fold_canonicalize_denormal0_f64(ptr addrspace(1) %out) #3 {
+; GFX678-SDAG-LABEL: test_denormals_fold_canonicalize_denormal0_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, -1
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, 0xfffff
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_denormals_fold_canonicalize_denormal0_f64:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, 0xfffff
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_denormals_fold_canonicalize_denormal0_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, -1
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0xfffff
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_denormals_fold_canonicalize_denormal0_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0xfffff
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_denormals_fold_canonicalize_denormal0_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v1, 0xfffff
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v0, -1
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_denormals_fold_canonicalize_denormal0_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v1, 0xfffff :: v_dual_mov_b32 v2, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_denormals_fold_canonicalize_denormal0_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v1, 0xfffff
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, -1
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_denormals_fold_canonicalize_denormal0_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v1, 0xfffff :: v_dual_mov_b32 v2, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 4503599627370495 to double))
store double %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal1_f64(ptr addrspace(1) %out) #2 {
-; GFX678-LABEL: test_no_denormals_fold_canonicalize_denormal1_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v0, 0
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v3, s1
-; GFX678-NEXT: v_bfrev_b32_e32 v1, 1
-; GFX678-NEXT: v_mov_b32_e32 v2, s0
-; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_no_denormals_fold_canonicalize_denormal1_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_bfrev_b32_e32 v1, 1
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_no_denormals_fold_canonicalize_denormal1_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_mov_b32_e32 v0, 0
-; GFX11-NEXT: v_bfrev_b32_e32 v1, 1
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_no_denormals_fold_canonicalize_denormal1_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_mov_b32_e32 v0, 0
-; GFX12-NEXT: v_bfrev_b32_e32 v1, 1
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal1_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-SDAG-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal1_f64:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-GISEL-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal1_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal1_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-GISEL-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal1_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-SDAG-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal1_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-GISEL-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_no_denormals_fold_canonicalize_denormal1_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-SDAG-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_no_denormals_fold_canonicalize_denormal1_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-GISEL-NEXT: v_bfrev_b32_e32 v1, 1
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 9227875636482146303 to double))
store double %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @test_denormals_fold_canonicalize_denormal1_f64(ptr addrspace(1) %out) #3 {
-; GFX678-LABEL: test_denormals_fold_canonicalize_denormal1_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v0, -1
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v3, s1
-; GFX678-NEXT: v_mov_b32_e32 v1, 0x800fffff
-; GFX678-NEXT: v_mov_b32_e32 v2, s0
-; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_denormals_fold_canonicalize_denormal1_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v2, 0
-; GFX9-NEXT: v_mov_b32_e32 v0, -1
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x800fffff
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_denormals_fold_canonicalize_denormal1_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v1, 0x800fffff
-; GFX11-NEXT: v_mov_b32_e32 v0, -1
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_denormals_fold_canonicalize_denormal1_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v1, 0x800fffff
-; GFX12-NEXT: v_mov_b32_e32 v0, -1
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b64 v2, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: test_denormals_fold_canonicalize_denormal1_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, -1
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, 0x800fffff
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_denormals_fold_canonicalize_denormal1_f64:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, 0x800fffff
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_denormals_fold_canonicalize_denormal1_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, -1
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x800fffff
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_denormals_fold_canonicalize_denormal1_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0x800fffff
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_denormals_fold_canonicalize_denormal1_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v1, 0x800fffff
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v0, -1
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_denormals_fold_canonicalize_denormal1_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v1, 0x800fffff :: v_dual_mov_b32 v2, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_denormals_fold_canonicalize_denormal1_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v1, 0x800fffff
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, -1
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_denormals_fold_canonicalize_denormal1_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v1, 0x800fffff :: v_dual_mov_b32 v2, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 9227875636482146303 to double))
store double %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @test_fold_canonicalize_qnan_f64(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: test_fold_canonicalize_qnan_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v0, 0
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v3, s1
-; GFX678-NEXT: v_mov_b32_e32 v1, 0x7ff80000
-; GFX678-NEXT: v_mov_b32_e32 v2, s0
-; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_fold_canonicalize_qnan_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x7ff80000
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_qnan_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_qnan_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: test_fold_canonicalize_qnan_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, 0x7ff80000
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_fold_canonicalize_qnan_f64:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, 0x7ff80000
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_fold_canonicalize_qnan_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x7ff80000
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_qnan_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0x7ff80000
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_qnan_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_qnan_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v1, 0x7ff80000 :: v_dual_mov_b32 v2, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_qnan_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_qnan_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, 0
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v1, 0x7ff80000 :: v_dual_mov_b32 v2, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call double @llvm.canonicalize.f64(double 0x7FF8000000000000)
store double %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @test_fold_canonicalize_qnan_value_neg1_f64(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: test_fold_canonicalize_qnan_value_neg1_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v0, 0
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v3, s1
-; GFX678-NEXT: v_mov_b32_e32 v1, 0x7ff80000
-; GFX678-NEXT: v_mov_b32_e32 v2, s0
-; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_fold_canonicalize_qnan_value_neg1_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x7ff80000
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_qnan_value_neg1_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_qnan_value_neg1_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: test_fold_canonicalize_qnan_value_neg1_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, 0x7ff80000
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_fold_canonicalize_qnan_value_neg1_f64:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, -1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_fold_canonicalize_qnan_value_neg1_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x7ff80000
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_qnan_value_neg1_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, -1
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_qnan_value_neg1_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_qnan_value_neg1_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v1, -1 :: v_dual_mov_b32 v2, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_qnan_value_neg1_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_qnan_value_neg1_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v1, -1 :: v_dual_mov_b32 v2, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 -1 to double))
store double %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @test_fold_canonicalize_qnan_value_neg2_f64(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: test_fold_canonicalize_qnan_value_neg2_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v0, 0
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v3, s1
-; GFX678-NEXT: v_mov_b32_e32 v1, 0x7ff80000
-; GFX678-NEXT: v_mov_b32_e32 v2, s0
-; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_fold_canonicalize_qnan_value_neg2_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x7ff80000
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_qnan_value_neg2_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_qnan_value_neg2_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: test_fold_canonicalize_qnan_value_neg2_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, 0x7ff80000
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_fold_canonicalize_qnan_value_neg2_f64:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, -2
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, -1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_fold_canonicalize_qnan_value_neg2_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x7ff80000
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_qnan_value_neg2_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, -2
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, -1
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_qnan_value_neg2_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_qnan_value_neg2_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, -2
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v1, -1 :: v_dual_mov_b32 v2, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_qnan_value_neg2_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_qnan_value_neg2_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, -2
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v1, -1 :: v_dual_mov_b32 v2, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 -2 to double))
store double %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @test_fold_canonicalize_snan0_value_f64(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: test_fold_canonicalize_snan0_value_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v0, 0
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v3, s1
-; GFX678-NEXT: v_mov_b32_e32 v1, 0x7ff80000
-; GFX678-NEXT: v_mov_b32_e32 v2, s0
-; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_fold_canonicalize_snan0_value_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x7ff80000
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_snan0_value_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_snan0_value_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: test_fold_canonicalize_snan0_value_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, 0x7ff80000
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX6-GISEL-LABEL: test_fold_canonicalize_snan0_value_f64:
+; GFX6-GISEL: ; %bb.0:
+; GFX6-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v0, 1
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v1, 0x7ff00000
+; GFX6-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX6-GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX6-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX6-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX6-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX6-GISEL-NEXT: s_endpgm
+;
+; GFX8-GISEL-LABEL: test_fold_canonicalize_snan0_value_f64:
+; GFX8-GISEL: ; %bb.0:
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, 1
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, 0x7ff00000
+; GFX8-GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX8-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX8-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX8-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX8-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX8-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_fold_canonicalize_snan0_value_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x7ff80000
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_snan0_value_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 1
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0x7ff00000
+; GFX9-GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_snan0_value_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_snan0_value_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, 1
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v1, 0x7ff00000 :: v_dual_mov_b32 v2, 0
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1)
+; GFX11-GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_snan0_value_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_snan0_value_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, 1
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v1, 0x7ff00000 :: v_dual_mov_b32 v2, 0
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1)
+; GFX12-GISEL-NEXT: v_max_num_f64_e32 v[0:1], v[0:1], v[0:1]
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 9218868437227405313 to double))
store double %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @test_fold_canonicalize_snan1_value_f64(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: test_fold_canonicalize_snan1_value_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v0, 0
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v3, s1
-; GFX678-NEXT: v_mov_b32_e32 v1, 0x7ff80000
-; GFX678-NEXT: v_mov_b32_e32 v2, s0
-; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_fold_canonicalize_snan1_value_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x7ff80000
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_snan1_value_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_snan1_value_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: test_fold_canonicalize_snan1_value_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, 0x7ff80000
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_fold_canonicalize_snan1_value_f64:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-GISEL-NEXT: v_bfrev_b32_e32 v1, -2
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_fold_canonicalize_snan1_value_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x7ff80000
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_snan1_value_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX9-GISEL-NEXT: v_bfrev_b32_e32 v1, -2
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_snan1_value_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_snan1_value_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX11-GISEL-NEXT: v_bfrev_b32_e32 v1, -2
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_snan1_value_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_snan1_value_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX12-GISEL-NEXT: v_bfrev_b32_e32 v1, -2
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 9223372036854775807 to double))
store double %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @test_fold_canonicalize_snan2_value_f64(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: test_fold_canonicalize_snan2_value_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v0, 0
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v3, s1
-; GFX678-NEXT: v_mov_b32_e32 v1, 0x7ff80000
-; GFX678-NEXT: v_mov_b32_e32 v2, s0
-; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_fold_canonicalize_snan2_value_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x7ff80000
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_snan2_value_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_snan2_value_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: test_fold_canonicalize_snan2_value_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, 0x7ff80000
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX6-GISEL-LABEL: test_fold_canonicalize_snan2_value_f64:
+; GFX6-GISEL: ; %bb.0:
+; GFX6-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v0, 1
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v1, 0xfff00000
+; GFX6-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX6-GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX6-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX6-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX6-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX6-GISEL-NEXT: s_endpgm
+;
+; GFX8-GISEL-LABEL: test_fold_canonicalize_snan2_value_f64:
+; GFX8-GISEL: ; %bb.0:
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, 1
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, 0xfff00000
+; GFX8-GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX8-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX8-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX8-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX8-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX8-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_fold_canonicalize_snan2_value_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x7ff80000
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_snan2_value_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 1
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0xfff00000
+; GFX9-GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_snan2_value_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_snan2_value_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, 1
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v1, 0xfff00000 :: v_dual_mov_b32 v2, 0
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1)
+; GFX11-GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_snan2_value_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_snan2_value_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, 1
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v1, 0xfff00000 :: v_dual_mov_b32 v2, 0
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1)
+; GFX12-GISEL-NEXT: v_max_num_f64_e32 v[0:1], v[0:1], v[0:1]
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 18442240474082181121 to double))
store double %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @test_fold_canonicalize_snan3_value_f64(ptr addrspace(1) %out) #1 {
-; GFX678-LABEL: test_fold_canonicalize_snan3_value_f64:
-; GFX678: ; %bb.0:
-; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX678-NEXT: s_add_i32 s12, s12, s17
-; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX678-NEXT: v_mov_b32_e32 v0, 0
-; GFX678-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-NEXT: v_mov_b32_e32 v3, s1
-; GFX678-NEXT: v_mov_b32_e32 v1, 0x7ff80000
-; GFX678-NEXT: v_mov_b32_e32 v2, s0
-; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX678-NEXT: s_endpgm
-;
-; GFX9-LABEL: test_fold_canonicalize_snan3_value_f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_mov_b32_e32 v0, 0
-; GFX9-NEXT: v_mov_b32_e32 v1, 0x7ff80000
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: test_fold_canonicalize_snan3_value_f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: test_fold_canonicalize_snan3_value_f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX678-SDAG-LABEL: test_fold_canonicalize_snan3_value_f64:
+; GFX678-SDAG: ; %bb.0:
+; GFX678-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX678-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX678-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, 0x7ff80000
+; GFX678-SDAG-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-SDAG-NEXT: s_endpgm
+;
+; GFX678-GISEL-LABEL: test_fold_canonicalize_snan3_value_f64:
+; GFX678-GISEL: ; %bb.0:
+; GFX678-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX678-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX678-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX678-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v3, s1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, -1
+; GFX678-GISEL-NEXT: v_mov_b32_e32 v2, s0
+; GFX678-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX678-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: test_fold_canonicalize_snan3_value_f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0x7ff80000
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: test_fold_canonicalize_snan3_value_f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, -1
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: test_fold_canonicalize_snan3_value_f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: test_fold_canonicalize_snan3_value_f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX11-GISEL-NEXT: v_dual_mov_b32 v1, -1 :: v_dual_mov_b32 v2, 0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: test_fold_canonicalize_snan3_value_f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff80000
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_store_b64 v0, v[0:1], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: test_fold_canonicalize_snan3_value_f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, -1
+; GFX12-GISEL-NEXT: v_dual_mov_b32 v1, -1 :: v_dual_mov_b32 v2, 0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 18446744073709551615 to double))
store double %canonicalized, ptr addrspace(1) %out
ret void
}
define amdgpu_kernel void @test_canonicalize_value_f64_flush(ptr addrspace(1) %arg, ptr addrspace(1) %out) #4 {
-; GFX6-LABEL: test_canonicalize_value_f64_flush:
-; GFX6: ; %bb.0:
-; GFX6-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
-; GFX6-NEXT: v_lshlrev_b32_e32 v2, 3, v0
-; GFX6-NEXT: s_add_i32 s12, s12, s17
-; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX6-NEXT: s_waitcnt lgkmcnt(0)
-; GFX6-NEXT: v_mov_b32_e32 v1, s1
-; GFX6-NEXT: v_add_i32_e32 v0, vcc, s0, v2
-; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX6-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
-; GFX6-NEXT: v_mov_b32_e32 v3, s3
-; GFX6-NEXT: v_add_i32_e32 v2, vcc, s2, v2
-; GFX6-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc
-; GFX6-NEXT: s_waitcnt vmcnt(0)
-; GFX6-NEXT: v_mul_f64 v[0:1], 1.0, v[0:1]
-; GFX6-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX6-NEXT: s_endpgm
-;
-; GFX8-LABEL: test_canonicalize_value_f64_flush:
-; GFX8: ; %bb.0:
-; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
-; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v0
-; GFX8-NEXT: s_add_i32 s12, s12, s17
-; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX8-NEXT: s_waitcnt lgkmcnt(0)
-; GFX8-NEXT: v_mov_b32_e32 v1, s1
-; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2
-; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
-; GFX8-NEXT: v_mov_b32_e32 v3, s3
-; GFX8-NEXT: v_add_u32_e32 v2, vcc, s2, v2
-; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc
-; GFX8-NEXT: s_waitcnt vmcnt(0)
-; GFX8-NEXT: v_mul_f64 v[0:1], 1.0, v[0:1]
-; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX8-NEXT: s_endpgm
+; GFX6-SDAG-LABEL: test_canonicalize_value_f64_flush:
+; GFX6-SDAG: ; %bb.0:
+; GFX6-SDAG-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX6-SDAG-NEXT: v_lshlrev_b32_e32 v2, 3, v0
+; GFX6-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX6-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-SDAG-NEXT: v_add_i32_e32 v0, vcc, s0, v2
+; GFX6-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-SDAG-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v3, s3
+; GFX6-SDAG-NEXT: v_add_i32_e32 v2, vcc, s2, v2
+; GFX6-SDAG-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc
+; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX6-SDAG-NEXT: v_mul_f64 v[0:1], 1.0, v[0:1]
+; GFX6-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX6-SDAG-NEXT: s_endpgm
+;
+; GFX6-GISEL-LABEL: test_canonicalize_value_f64_flush:
+; GFX6-GISEL: ; %bb.0:
+; GFX6-GISEL-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX6-GISEL-NEXT: v_lshlrev_b32_e32 v4, 3, v0
+; GFX6-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX6-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-GISEL-NEXT: v_add_i32_e32 v0, vcc, v0, v4
+; GFX6-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-GISEL-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v2, s2
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v3, s3
+; GFX6-GISEL-NEXT: v_add_i32_e32 v2, vcc, v2, v4
+; GFX6-GISEL-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc
+; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX6-GISEL-NEXT: v_mul_f64 v[0:1], 1.0, v[0:1]
+; GFX6-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX6-GISEL-NEXT: s_endpgm
+;
+; GFX8-SDAG-LABEL: test_canonicalize_value_f64_flush:
+; GFX8-SDAG: ; %bb.0:
+; GFX8-SDAG-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX8-SDAG-NEXT: v_lshlrev_b32_e32 v2, 3, v0
+; GFX8-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX8-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX8-SDAG-NEXT: v_add_u32_e32 v0, vcc, s0, v2
+; GFX8-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-SDAG-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v3, s3
+; GFX8-SDAG-NEXT: v_add_u32_e32 v2, vcc, s2, v2
+; GFX8-SDAG-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc
+; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX8-SDAG-NEXT: v_mul_f64 v[0:1], 1.0, v[0:1]
+; GFX8-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX8-SDAG-NEXT: s_endpgm
+;
+; GFX8-GISEL-LABEL: test_canonicalize_value_f64_flush:
+; GFX8-GISEL: ; %bb.0:
+; GFX8-GISEL-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX8-GISEL-NEXT: v_lshlrev_b32_e32 v4, 3, v0
+; GFX8-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX8-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX8-GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v4
+; GFX8-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-GISEL-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v2, s2
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v3, s3
+; GFX8-GISEL-NEXT: v_add_u32_e32 v2, vcc, v2, v4
+; GFX8-GISEL-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc
+; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX8-GISEL-NEXT: v_mul_f64 v[0:1], 1.0, v[0:1]
+; GFX8-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX8-GISEL-NEXT: s_endpgm
;
; GFX9-LABEL: test_canonicalize_value_f64_flush:
; GFX9: ; %bb.0:
@@ -2265,45 +4065,89 @@ define amdgpu_kernel void @test_canonicalize_value_f64_flush(ptr addrspace(1) %a
}
define amdgpu_kernel void @test_canonicalize_value_f32_flush(ptr addrspace(1) %arg, ptr addrspace(1) %out) #4 {
-; GFX6-LABEL: test_canonicalize_value_f32_flush:
-; GFX6: ; %bb.0:
-; GFX6-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
-; GFX6-NEXT: v_lshlrev_b32_e32 v2, 2, v0
-; GFX6-NEXT: s_add_i32 s12, s12, s17
-; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX6-NEXT: s_waitcnt lgkmcnt(0)
-; GFX6-NEXT: v_mov_b32_e32 v1, s1
-; GFX6-NEXT: v_add_i32_e32 v0, vcc, s0, v2
-; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX6-NEXT: flat_load_dword v0, v[0:1]
-; GFX6-NEXT: v_mov_b32_e32 v1, s3
-; GFX6-NEXT: s_waitcnt vmcnt(0)
-; GFX6-NEXT: v_mul_f32_e32 v3, 1.0, v0
-; GFX6-NEXT: v_add_i32_e32 v0, vcc, s2, v2
-; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX6-NEXT: flat_store_dword v[0:1], v3
-; GFX6-NEXT: s_endpgm
-;
-; GFX8-LABEL: test_canonicalize_value_f32_flush:
-; GFX8: ; %bb.0:
-; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
-; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0
-; GFX8-NEXT: s_add_i32 s12, s12, s17
-; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX8-NEXT: s_waitcnt lgkmcnt(0)
-; GFX8-NEXT: v_mov_b32_e32 v1, s1
-; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2
-; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX8-NEXT: flat_load_dword v0, v[0:1]
-; GFX8-NEXT: v_mov_b32_e32 v1, s3
-; GFX8-NEXT: s_waitcnt vmcnt(0)
-; GFX8-NEXT: v_mul_f32_e32 v3, 1.0, v0
-; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2
-; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX8-NEXT: flat_store_dword v[0:1], v3
-; GFX8-NEXT: s_endpgm
+; GFX6-SDAG-LABEL: test_canonicalize_value_f32_flush:
+; GFX6-SDAG: ; %bb.0:
+; GFX6-SDAG-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX6-SDAG-NEXT: v_lshlrev_b32_e32 v2, 2, v0
+; GFX6-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX6-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-SDAG-NEXT: v_add_i32_e32 v0, vcc, s0, v2
+; GFX6-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-SDAG-NEXT: flat_load_dword v0, v[0:1]
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v1, s3
+; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX6-SDAG-NEXT: v_mul_f32_e32 v3, 1.0, v0
+; GFX6-SDAG-NEXT: v_add_i32_e32 v0, vcc, s2, v2
+; GFX6-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-SDAG-NEXT: flat_store_dword v[0:1], v3
+; GFX6-SDAG-NEXT: s_endpgm
+;
+; GFX6-GISEL-LABEL: test_canonicalize_value_f32_flush:
+; GFX6-GISEL: ; %bb.0:
+; GFX6-GISEL-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX6-GISEL-NEXT: v_lshlrev_b32_e32 v2, 2, v0
+; GFX6-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX6-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-GISEL-NEXT: v_add_i32_e32 v0, vcc, v0, v2
+; GFX6-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-GISEL-NEXT: flat_load_dword v3, v[0:1]
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v0, s2
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v1, s3
+; GFX6-GISEL-NEXT: v_add_i32_e32 v0, vcc, v0, v2
+; GFX6-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX6-GISEL-NEXT: v_mul_f32_e32 v3, 1.0, v3
+; GFX6-GISEL-NEXT: flat_store_dword v[0:1], v3
+; GFX6-GISEL-NEXT: s_endpgm
+;
+; GFX8-SDAG-LABEL: test_canonicalize_value_f32_flush:
+; GFX8-SDAG: ; %bb.0:
+; GFX8-SDAG-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX8-SDAG-NEXT: v_lshlrev_b32_e32 v2, 2, v0
+; GFX8-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX8-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX8-SDAG-NEXT: v_add_u32_e32 v0, vcc, s0, v2
+; GFX8-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-SDAG-NEXT: flat_load_dword v0, v[0:1]
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s3
+; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX8-SDAG-NEXT: v_mul_f32_e32 v3, 1.0, v0
+; GFX8-SDAG-NEXT: v_add_u32_e32 v0, vcc, s2, v2
+; GFX8-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-SDAG-NEXT: flat_store_dword v[0:1], v3
+; GFX8-SDAG-NEXT: s_endpgm
+;
+; GFX8-GISEL-LABEL: test_canonicalize_value_f32_flush:
+; GFX8-GISEL: ; %bb.0:
+; GFX8-GISEL-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX8-GISEL-NEXT: v_lshlrev_b32_e32 v2, 2, v0
+; GFX8-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX8-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX8-GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v2
+; GFX8-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-GISEL-NEXT: flat_load_dword v3, v[0:1]
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, s2
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, s3
+; GFX8-GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v2
+; GFX8-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX8-GISEL-NEXT: v_mul_f32_e32 v3, 1.0, v3
+; GFX8-GISEL-NEXT: flat_store_dword v[0:1], v3
+; GFX8-GISEL-NEXT: s_endpgm
;
; GFX9-LABEL: test_canonicalize_value_f32_flush:
; GFX9: ; %bb.0:
@@ -2351,46 +4195,89 @@ define amdgpu_kernel void @test_canonicalize_value_f32_flush(ptr addrspace(1) %a
}
define amdgpu_kernel void @test_canonicalize_value_f16_flush(ptr addrspace(1) %arg, ptr addrspace(1) %out) #4 {
-; GFX6-LABEL: test_canonicalize_value_f16_flush:
-; GFX6: ; %bb.0:
-; GFX6-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
-; GFX6-NEXT: v_lshlrev_b32_e32 v2, 1, v0
-; GFX6-NEXT: s_add_i32 s12, s12, s17
-; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX6-NEXT: s_waitcnt lgkmcnt(0)
-; GFX6-NEXT: v_mov_b32_e32 v1, s1
-; GFX6-NEXT: v_add_i32_e32 v0, vcc, s0, v2
-; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX6-NEXT: flat_load_ushort v0, v[0:1]
-; GFX6-NEXT: v_mov_b32_e32 v1, s3
-; GFX6-NEXT: s_waitcnt vmcnt(0)
-; GFX6-NEXT: v_cvt_f32_f16_e32 v0, v0
-; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v0
-; GFX6-NEXT: v_add_i32_e32 v0, vcc, s2, v2
-; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX6-NEXT: flat_store_short v[0:1], v3
-; GFX6-NEXT: s_endpgm
-;
-; GFX8-LABEL: test_canonicalize_value_f16_flush:
-; GFX8: ; %bb.0:
-; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
-; GFX8-NEXT: v_lshlrev_b32_e32 v2, 1, v0
-; GFX8-NEXT: s_add_i32 s12, s12, s17
-; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX8-NEXT: s_waitcnt lgkmcnt(0)
-; GFX8-NEXT: v_mov_b32_e32 v1, s1
-; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2
-; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX8-NEXT: flat_load_ushort v0, v[0:1]
-; GFX8-NEXT: v_mov_b32_e32 v1, s3
-; GFX8-NEXT: s_waitcnt vmcnt(0)
-; GFX8-NEXT: v_mul_f16_e32 v3, 1.0, v0
-; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2
-; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX8-NEXT: flat_store_short v[0:1], v3
-; GFX8-NEXT: s_endpgm
+; GFX6-SDAG-LABEL: test_canonicalize_value_f16_flush:
+; GFX6-SDAG: ; %bb.0:
+; GFX6-SDAG-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX6-SDAG-NEXT: v_lshlrev_b32_e32 v2, 1, v0
+; GFX6-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX6-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-SDAG-NEXT: v_add_i32_e32 v0, vcc, s0, v2
+; GFX6-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-SDAG-NEXT: flat_load_ushort v0, v[0:1]
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v1, s3
+; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v0, v0
+; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v3, v0
+; GFX6-SDAG-NEXT: v_add_i32_e32 v0, vcc, s2, v2
+; GFX6-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-SDAG-NEXT: flat_store_short v[0:1], v3
+; GFX6-SDAG-NEXT: s_endpgm
+;
+; GFX6-GISEL-LABEL: test_canonicalize_value_f16_flush:
+; GFX6-GISEL: ; %bb.0:
+; GFX6-GISEL-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX6-GISEL-NEXT: v_lshlrev_b32_e32 v2, 1, v0
+; GFX6-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX6-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-GISEL-NEXT: v_add_i32_e32 v0, vcc, v0, v2
+; GFX6-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-GISEL-NEXT: flat_load_ushort v3, v[0:1]
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v0, s2
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v1, s3
+; GFX6-GISEL-NEXT: v_add_i32_e32 v0, vcc, v0, v2
+; GFX6-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX6-GISEL-NEXT: flat_store_short v[0:1], v3
+; GFX6-GISEL-NEXT: s_endpgm
+;
+; GFX8-SDAG-LABEL: test_canonicalize_value_f16_flush:
+; GFX8-SDAG: ; %bb.0:
+; GFX8-SDAG-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX8-SDAG-NEXT: v_lshlrev_b32_e32 v2, 1, v0
+; GFX8-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX8-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX8-SDAG-NEXT: v_add_u32_e32 v0, vcc, s0, v2
+; GFX8-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-SDAG-NEXT: flat_load_ushort v0, v[0:1]
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s3
+; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX8-SDAG-NEXT: v_mul_f16_e32 v3, 1.0, v0
+; GFX8-SDAG-NEXT: v_add_u32_e32 v0, vcc, s2, v2
+; GFX8-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-SDAG-NEXT: flat_store_short v[0:1], v3
+; GFX8-SDAG-NEXT: s_endpgm
+;
+; GFX8-GISEL-LABEL: test_canonicalize_value_f16_flush:
+; GFX8-GISEL: ; %bb.0:
+; GFX8-GISEL-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX8-GISEL-NEXT: v_lshlrev_b32_e32 v2, 1, v0
+; GFX8-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX8-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX8-GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v2
+; GFX8-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-GISEL-NEXT: flat_load_ushort v3, v[0:1]
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, s2
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, s3
+; GFX8-GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v2
+; GFX8-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX8-GISEL-NEXT: v_mul_f16_e32 v3, 1.0, v3
+; GFX8-GISEL-NEXT: flat_store_short v[0:1], v3
+; GFX8-GISEL-NEXT: s_endpgm
;
; GFX9-LABEL: test_canonicalize_value_f16_flush:
; GFX9: ; %bb.0:
@@ -2465,54 +4352,104 @@ define amdgpu_kernel void @test_canonicalize_value_f16_flush(ptr addrspace(1) %a
define amdgpu_kernel void @test_canonicalize_value_v2f16_flush(ptr addrspace(1) %arg, ptr addrspace(1) %out) #4 {
-; GFX6-LABEL: test_canonicalize_value_v2f16_flush:
-; GFX6: ; %bb.0:
-; GFX6-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
-; GFX6-NEXT: v_lshlrev_b32_e32 v2, 2, v0
-; GFX6-NEXT: s_add_i32 s12, s12, s17
-; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX6-NEXT: s_waitcnt lgkmcnt(0)
-; GFX6-NEXT: v_mov_b32_e32 v1, s1
-; GFX6-NEXT: v_add_i32_e32 v0, vcc, s0, v2
-; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX6-NEXT: flat_load_dword v0, v[0:1]
-; GFX6-NEXT: v_mov_b32_e32 v3, s3
-; GFX6-NEXT: s_waitcnt vmcnt(0)
-; GFX6-NEXT: v_lshrrev_b32_e32 v1, 16, v0
-; GFX6-NEXT: v_cvt_f32_f16_e32 v1, v1
-; GFX6-NEXT: v_cvt_f32_f16_e32 v0, v0
-; GFX6-NEXT: v_cvt_f16_f32_e32 v1, v1
-; GFX6-NEXT: v_cvt_f16_f32_e32 v0, v0
-; GFX6-NEXT: v_lshlrev_b32_e32 v1, 16, v1
-; GFX6-NEXT: v_or_b32_e32 v4, v0, v1
-; GFX6-NEXT: v_add_i32_e32 v0, vcc, s2, v2
-; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v3, vcc
-; GFX6-NEXT: flat_store_dword v[0:1], v4
-; GFX6-NEXT: s_endpgm
-;
-; GFX8-LABEL: test_canonicalize_value_v2f16_flush:
-; GFX8: ; %bb.0:
-; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
-; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0
-; GFX8-NEXT: s_add_i32 s12, s12, s17
-; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX8-NEXT: s_waitcnt lgkmcnt(0)
-; GFX8-NEXT: v_mov_b32_e32 v1, s1
-; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2
-; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX8-NEXT: flat_load_dword v0, v[0:1]
-; GFX8-NEXT: v_mov_b32_e32 v1, 0x3c00
-; GFX8-NEXT: v_mov_b32_e32 v3, s3
-; GFX8-NEXT: s_waitcnt vmcnt(0)
-; GFX8-NEXT: v_mul_f16_sdwa v1, v1, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
-; GFX8-NEXT: v_mul_f16_e32 v0, 1.0, v0
-; GFX8-NEXT: v_or_b32_e32 v4, v0, v1
-; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2
-; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v3, vcc
-; GFX8-NEXT: flat_store_dword v[0:1], v4
-; GFX8-NEXT: s_endpgm
+; GFX6-SDAG-LABEL: test_canonicalize_value_v2f16_flush:
+; GFX6-SDAG: ; %bb.0:
+; GFX6-SDAG-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX6-SDAG-NEXT: v_lshlrev_b32_e32 v2, 2, v0
+; GFX6-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX6-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-SDAG-NEXT: v_add_i32_e32 v0, vcc, s0, v2
+; GFX6-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-SDAG-NEXT: flat_load_dword v0, v[0:1]
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v3, s3
+; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX6-SDAG-NEXT: v_lshrrev_b32_e32 v1, 16, v0
+; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v1, v1
+; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v0, v0
+; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v1, v1
+; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v0, v0
+; GFX6-SDAG-NEXT: v_lshlrev_b32_e32 v1, 16, v1
+; GFX6-SDAG-NEXT: v_or_b32_e32 v4, v0, v1
+; GFX6-SDAG-NEXT: v_add_i32_e32 v0, vcc, s2, v2
+; GFX6-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v3, vcc
+; GFX6-SDAG-NEXT: flat_store_dword v[0:1], v4
+; GFX6-SDAG-NEXT: s_endpgm
+;
+; GFX6-GISEL-LABEL: test_canonicalize_value_v2f16_flush:
+; GFX6-GISEL: ; %bb.0:
+; GFX6-GISEL-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX6-GISEL-NEXT: v_lshlrev_b32_e32 v2, 2, v0
+; GFX6-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX6-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-GISEL-NEXT: v_add_i32_e32 v0, vcc, v0, v2
+; GFX6-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-GISEL-NEXT: flat_load_dword v3, v[0:1]
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v0, s2
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v1, s3
+; GFX6-GISEL-NEXT: v_add_i32_e32 v0, vcc, v0, v2
+; GFX6-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX6-GISEL-NEXT: v_lshrrev_b32_e32 v4, 16, v3
+; GFX6-GISEL-NEXT: v_and_b32_e32 v3, 0xffff, v3
+; GFX6-GISEL-NEXT: v_lshlrev_b32_e32 v4, 16, v4
+; GFX6-GISEL-NEXT: v_or_b32_e32 v3, v3, v4
+; GFX6-GISEL-NEXT: flat_store_dword v[0:1], v3
+; GFX6-GISEL-NEXT: s_endpgm
+;
+; GFX8-SDAG-LABEL: test_canonicalize_value_v2f16_flush:
+; GFX8-SDAG: ; %bb.0:
+; GFX8-SDAG-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX8-SDAG-NEXT: v_lshlrev_b32_e32 v2, 2, v0
+; GFX8-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX8-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX8-SDAG-NEXT: v_add_u32_e32 v0, vcc, s0, v2
+; GFX8-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-SDAG-NEXT: flat_load_dword v0, v[0:1]
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, 0x3c00
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v3, s3
+; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX8-SDAG-NEXT: v_mul_f16_sdwa v1, v1, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
+; GFX8-SDAG-NEXT: v_mul_f16_e32 v0, 1.0, v0
+; GFX8-SDAG-NEXT: v_or_b32_e32 v4, v0, v1
+; GFX8-SDAG-NEXT: v_add_u32_e32 v0, vcc, s2, v2
+; GFX8-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v3, vcc
+; GFX8-SDAG-NEXT: flat_store_dword v[0:1], v4
+; GFX8-SDAG-NEXT: s_endpgm
+;
+; GFX8-GISEL-LABEL: test_canonicalize_value_v2f16_flush:
+; GFX8-GISEL: ; %bb.0:
+; GFX8-GISEL-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX8-GISEL-NEXT: v_lshlrev_b32_e32 v2, 2, v0
+; GFX8-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX8-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX8-GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v2
+; GFX8-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-GISEL-NEXT: flat_load_dword v3, v[0:1]
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v4, 0x3c00
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, s2
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, s3
+; GFX8-GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v2
+; GFX8-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX8-GISEL-NEXT: v_mul_f16_e32 v5, 1.0, v3
+; GFX8-GISEL-NEXT: v_mul_f16_sdwa v3, v4, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
+; GFX8-GISEL-NEXT: v_or_b32_e32 v3, v5, v3
+; GFX8-GISEL-NEXT: flat_store_dword v[0:1], v3
+; GFX8-GISEL-NEXT: s_endpgm
;
; GFX9-LABEL: test_canonicalize_value_v2f16_flush:
; GFX9: ; %bb.0:
@@ -2560,45 +4497,89 @@ define amdgpu_kernel void @test_canonicalize_value_v2f16_flush(ptr addrspace(1)
}
define amdgpu_kernel void @test_canonicalize_value_f64_denorm(ptr addrspace(1) %arg, ptr addrspace(1) %out) #3 {
-; GFX6-LABEL: test_canonicalize_value_f64_denorm:
-; GFX6: ; %bb.0:
-; GFX6-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
-; GFX6-NEXT: v_lshlrev_b32_e32 v2, 3, v0
-; GFX6-NEXT: s_add_i32 s12, s12, s17
-; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX6-NEXT: s_waitcnt lgkmcnt(0)
-; GFX6-NEXT: v_mov_b32_e32 v1, s1
-; GFX6-NEXT: v_add_i32_e32 v0, vcc, s0, v2
-; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX6-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
-; GFX6-NEXT: v_mov_b32_e32 v3, s3
-; GFX6-NEXT: v_add_i32_e32 v2, vcc, s2, v2
-; GFX6-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc
-; GFX6-NEXT: s_waitcnt vmcnt(0)
-; GFX6-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
-; GFX6-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX6-NEXT: s_endpgm
-;
-; GFX8-LABEL: test_canonicalize_value_f64_denorm:
-; GFX8: ; %bb.0:
-; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
-; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v0
-; GFX8-NEXT: s_add_i32 s12, s12, s17
-; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX8-NEXT: s_waitcnt lgkmcnt(0)
-; GFX8-NEXT: v_mov_b32_e32 v1, s1
-; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2
-; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
-; GFX8-NEXT: v_mov_b32_e32 v3, s3
-; GFX8-NEXT: v_add_u32_e32 v2, vcc, s2, v2
-; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc
-; GFX8-NEXT: s_waitcnt vmcnt(0)
-; GFX8-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
-; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
-; GFX8-NEXT: s_endpgm
+; GFX6-SDAG-LABEL: test_canonicalize_value_f64_denorm:
+; GFX6-SDAG: ; %bb.0:
+; GFX6-SDAG-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX6-SDAG-NEXT: v_lshlrev_b32_e32 v2, 3, v0
+; GFX6-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX6-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-SDAG-NEXT: v_add_i32_e32 v0, vcc, s0, v2
+; GFX6-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-SDAG-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v3, s3
+; GFX6-SDAG-NEXT: v_add_i32_e32 v2, vcc, s2, v2
+; GFX6-SDAG-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc
+; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX6-SDAG-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX6-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX6-SDAG-NEXT: s_endpgm
+;
+; GFX6-GISEL-LABEL: test_canonicalize_value_f64_denorm:
+; GFX6-GISEL: ; %bb.0:
+; GFX6-GISEL-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX6-GISEL-NEXT: v_lshlrev_b32_e32 v4, 3, v0
+; GFX6-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX6-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-GISEL-NEXT: v_add_i32_e32 v0, vcc, v0, v4
+; GFX6-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-GISEL-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v2, s2
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v3, s3
+; GFX6-GISEL-NEXT: v_add_i32_e32 v2, vcc, v2, v4
+; GFX6-GISEL-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc
+; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX6-GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX6-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX6-GISEL-NEXT: s_endpgm
+;
+; GFX8-SDAG-LABEL: test_canonicalize_value_f64_denorm:
+; GFX8-SDAG: ; %bb.0:
+; GFX8-SDAG-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX8-SDAG-NEXT: v_lshlrev_b32_e32 v2, 3, v0
+; GFX8-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX8-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX8-SDAG-NEXT: v_add_u32_e32 v0, vcc, s0, v2
+; GFX8-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-SDAG-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v3, s3
+; GFX8-SDAG-NEXT: v_add_u32_e32 v2, vcc, s2, v2
+; GFX8-SDAG-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc
+; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX8-SDAG-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX8-SDAG-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX8-SDAG-NEXT: s_endpgm
+;
+; GFX8-GISEL-LABEL: test_canonicalize_value_f64_denorm:
+; GFX8-GISEL: ; %bb.0:
+; GFX8-GISEL-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX8-GISEL-NEXT: v_lshlrev_b32_e32 v4, 3, v0
+; GFX8-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX8-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX8-GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v4
+; GFX8-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-GISEL-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v2, s2
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v3, s3
+; GFX8-GISEL-NEXT: v_add_u32_e32 v2, vcc, v2, v4
+; GFX8-GISEL-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc
+; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX8-GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX8-GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]
+; GFX8-GISEL-NEXT: s_endpgm
;
; GFX9-LABEL: test_canonicalize_value_f64_denorm:
; GFX9: ; %bb.0:
@@ -2646,45 +4627,89 @@ define amdgpu_kernel void @test_canonicalize_value_f64_denorm(ptr addrspace(1) %
}
define amdgpu_kernel void @test_canonicalize_value_f32_denorm(ptr addrspace(1) %arg, ptr addrspace(1) %out) #3 {
-; GFX6-LABEL: test_canonicalize_value_f32_denorm:
-; GFX6: ; %bb.0:
-; GFX6-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
-; GFX6-NEXT: v_lshlrev_b32_e32 v2, 2, v0
-; GFX6-NEXT: s_add_i32 s12, s12, s17
-; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX6-NEXT: s_waitcnt lgkmcnt(0)
-; GFX6-NEXT: v_mov_b32_e32 v1, s1
-; GFX6-NEXT: v_add_i32_e32 v0, vcc, s0, v2
-; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX6-NEXT: flat_load_dword v0, v[0:1]
-; GFX6-NEXT: v_mov_b32_e32 v1, s3
-; GFX6-NEXT: s_waitcnt vmcnt(0)
-; GFX6-NEXT: v_mul_f32_e32 v3, 1.0, v0
-; GFX6-NEXT: v_add_i32_e32 v0, vcc, s2, v2
-; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX6-NEXT: flat_store_dword v[0:1], v3
-; GFX6-NEXT: s_endpgm
-;
-; GFX8-LABEL: test_canonicalize_value_f32_denorm:
-; GFX8: ; %bb.0:
-; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
-; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0
-; GFX8-NEXT: s_add_i32 s12, s12, s17
-; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX8-NEXT: s_waitcnt lgkmcnt(0)
-; GFX8-NEXT: v_mov_b32_e32 v1, s1
-; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2
-; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX8-NEXT: flat_load_dword v0, v[0:1]
-; GFX8-NEXT: v_mov_b32_e32 v1, s3
-; GFX8-NEXT: s_waitcnt vmcnt(0)
-; GFX8-NEXT: v_mul_f32_e32 v3, 1.0, v0
-; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2
-; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX8-NEXT: flat_store_dword v[0:1], v3
-; GFX8-NEXT: s_endpgm
+; GFX6-SDAG-LABEL: test_canonicalize_value_f32_denorm:
+; GFX6-SDAG: ; %bb.0:
+; GFX6-SDAG-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX6-SDAG-NEXT: v_lshlrev_b32_e32 v2, 2, v0
+; GFX6-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX6-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-SDAG-NEXT: v_add_i32_e32 v0, vcc, s0, v2
+; GFX6-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-SDAG-NEXT: flat_load_dword v0, v[0:1]
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v1, s3
+; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX6-SDAG-NEXT: v_mul_f32_e32 v3, 1.0, v0
+; GFX6-SDAG-NEXT: v_add_i32_e32 v0, vcc, s2, v2
+; GFX6-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-SDAG-NEXT: flat_store_dword v[0:1], v3
+; GFX6-SDAG-NEXT: s_endpgm
+;
+; GFX6-GISEL-LABEL: test_canonicalize_value_f32_denorm:
+; GFX6-GISEL: ; %bb.0:
+; GFX6-GISEL-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX6-GISEL-NEXT: v_lshlrev_b32_e32 v2, 2, v0
+; GFX6-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX6-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-GISEL-NEXT: v_add_i32_e32 v0, vcc, v0, v2
+; GFX6-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-GISEL-NEXT: flat_load_dword v3, v[0:1]
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v0, s2
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v1, s3
+; GFX6-GISEL-NEXT: v_add_i32_e32 v0, vcc, v0, v2
+; GFX6-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX6-GISEL-NEXT: v_mul_f32_e32 v3, 1.0, v3
+; GFX6-GISEL-NEXT: flat_store_dword v[0:1], v3
+; GFX6-GISEL-NEXT: s_endpgm
+;
+; GFX8-SDAG-LABEL: test_canonicalize_value_f32_denorm:
+; GFX8-SDAG: ; %bb.0:
+; GFX8-SDAG-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX8-SDAG-NEXT: v_lshlrev_b32_e32 v2, 2, v0
+; GFX8-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX8-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX8-SDAG-NEXT: v_add_u32_e32 v0, vcc, s0, v2
+; GFX8-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-SDAG-NEXT: flat_load_dword v0, v[0:1]
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s3
+; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX8-SDAG-NEXT: v_mul_f32_e32 v3, 1.0, v0
+; GFX8-SDAG-NEXT: v_add_u32_e32 v0, vcc, s2, v2
+; GFX8-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-SDAG-NEXT: flat_store_dword v[0:1], v3
+; GFX8-SDAG-NEXT: s_endpgm
+;
+; GFX8-GISEL-LABEL: test_canonicalize_value_f32_denorm:
+; GFX8-GISEL: ; %bb.0:
+; GFX8-GISEL-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX8-GISEL-NEXT: v_lshlrev_b32_e32 v2, 2, v0
+; GFX8-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX8-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX8-GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v2
+; GFX8-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-GISEL-NEXT: flat_load_dword v3, v[0:1]
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, s2
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, s3
+; GFX8-GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v2
+; GFX8-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX8-GISEL-NEXT: v_mul_f32_e32 v3, 1.0, v3
+; GFX8-GISEL-NEXT: flat_store_dword v[0:1], v3
+; GFX8-GISEL-NEXT: s_endpgm
;
; GFX9-LABEL: test_canonicalize_value_f32_denorm:
; GFX9: ; %bb.0:
@@ -2733,46 +4758,89 @@ define amdgpu_kernel void @test_canonicalize_value_f32_denorm(ptr addrspace(1) %
; FIXME: Conversion to float should count as the canonicalize pre-gfx8
define amdgpu_kernel void @test_canonicalize_value_f16_denorm(ptr addrspace(1) %arg, ptr addrspace(1) %out) #3 {
-; GFX6-LABEL: test_canonicalize_value_f16_denorm:
-; GFX6: ; %bb.0:
-; GFX6-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
-; GFX6-NEXT: v_lshlrev_b32_e32 v2, 1, v0
-; GFX6-NEXT: s_add_i32 s12, s12, s17
-; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX6-NEXT: s_waitcnt lgkmcnt(0)
-; GFX6-NEXT: v_mov_b32_e32 v1, s1
-; GFX6-NEXT: v_add_i32_e32 v0, vcc, s0, v2
-; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX6-NEXT: flat_load_ushort v0, v[0:1]
-; GFX6-NEXT: v_mov_b32_e32 v1, s3
-; GFX6-NEXT: s_waitcnt vmcnt(0)
-; GFX6-NEXT: v_cvt_f32_f16_e32 v0, v0
-; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v0
-; GFX6-NEXT: v_add_i32_e32 v0, vcc, s2, v2
-; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX6-NEXT: flat_store_short v[0:1], v3
-; GFX6-NEXT: s_endpgm
-;
-; GFX8-LABEL: test_canonicalize_value_f16_denorm:
-; GFX8: ; %bb.0:
-; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
-; GFX8-NEXT: v_lshlrev_b32_e32 v2, 1, v0
-; GFX8-NEXT: s_add_i32 s12, s12, s17
-; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX8-NEXT: s_waitcnt lgkmcnt(0)
-; GFX8-NEXT: v_mov_b32_e32 v1, s1
-; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2
-; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX8-NEXT: flat_load_ushort v0, v[0:1]
-; GFX8-NEXT: v_mov_b32_e32 v1, s3
-; GFX8-NEXT: s_waitcnt vmcnt(0)
-; GFX8-NEXT: v_max_f16_e32 v3, v0, v0
-; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2
-; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX8-NEXT: flat_store_short v[0:1], v3
-; GFX8-NEXT: s_endpgm
+; GFX6-SDAG-LABEL: test_canonicalize_value_f16_denorm:
+; GFX6-SDAG: ; %bb.0:
+; GFX6-SDAG-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX6-SDAG-NEXT: v_lshlrev_b32_e32 v2, 1, v0
+; GFX6-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX6-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-SDAG-NEXT: v_add_i32_e32 v0, vcc, s0, v2
+; GFX6-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-SDAG-NEXT: flat_load_ushort v0, v[0:1]
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v1, s3
+; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v0, v0
+; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v3, v0
+; GFX6-SDAG-NEXT: v_add_i32_e32 v0, vcc, s2, v2
+; GFX6-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-SDAG-NEXT: flat_store_short v[0:1], v3
+; GFX6-SDAG-NEXT: s_endpgm
+;
+; GFX6-GISEL-LABEL: test_canonicalize_value_f16_denorm:
+; GFX6-GISEL: ; %bb.0:
+; GFX6-GISEL-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX6-GISEL-NEXT: v_lshlrev_b32_e32 v2, 1, v0
+; GFX6-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX6-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-GISEL-NEXT: v_add_i32_e32 v0, vcc, v0, v2
+; GFX6-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-GISEL-NEXT: flat_load_ushort v3, v[0:1]
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v0, s2
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v1, s3
+; GFX6-GISEL-NEXT: v_add_i32_e32 v0, vcc, v0, v2
+; GFX6-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX6-GISEL-NEXT: flat_store_short v[0:1], v3
+; GFX6-GISEL-NEXT: s_endpgm
+;
+; GFX8-SDAG-LABEL: test_canonicalize_value_f16_denorm:
+; GFX8-SDAG: ; %bb.0:
+; GFX8-SDAG-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX8-SDAG-NEXT: v_lshlrev_b32_e32 v2, 1, v0
+; GFX8-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX8-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX8-SDAG-NEXT: v_add_u32_e32 v0, vcc, s0, v2
+; GFX8-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-SDAG-NEXT: flat_load_ushort v0, v[0:1]
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s3
+; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX8-SDAG-NEXT: v_max_f16_e32 v3, v0, v0
+; GFX8-SDAG-NEXT: v_add_u32_e32 v0, vcc, s2, v2
+; GFX8-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-SDAG-NEXT: flat_store_short v[0:1], v3
+; GFX8-SDAG-NEXT: s_endpgm
+;
+; GFX8-GISEL-LABEL: test_canonicalize_value_f16_denorm:
+; GFX8-GISEL: ; %bb.0:
+; GFX8-GISEL-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX8-GISEL-NEXT: v_lshlrev_b32_e32 v2, 1, v0
+; GFX8-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX8-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX8-GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v2
+; GFX8-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-GISEL-NEXT: flat_load_ushort v3, v[0:1]
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, s2
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, s3
+; GFX8-GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v2
+; GFX8-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX8-GISEL-NEXT: v_max_f16_e32 v3, v3, v3
+; GFX8-GISEL-NEXT: flat_store_short v[0:1], v3
+; GFX8-GISEL-NEXT: s_endpgm
;
; GFX9-LABEL: test_canonicalize_value_f16_denorm:
; GFX9: ; %bb.0:
@@ -2848,53 +4916,102 @@ define amdgpu_kernel void @test_canonicalize_value_f16_denorm(ptr addrspace(1) %
define amdgpu_kernel void @test_canonicalize_value_v2f16_denorm(ptr addrspace(1) %arg, ptr addrspace(1) %out) #3 {
-; GFX6-LABEL: test_canonicalize_value_v2f16_denorm:
-; GFX6: ; %bb.0:
-; GFX6-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
-; GFX6-NEXT: v_lshlrev_b32_e32 v2, 2, v0
-; GFX6-NEXT: s_add_i32 s12, s12, s17
-; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX6-NEXT: s_waitcnt lgkmcnt(0)
-; GFX6-NEXT: v_mov_b32_e32 v1, s1
-; GFX6-NEXT: v_add_i32_e32 v0, vcc, s0, v2
-; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX6-NEXT: flat_load_dword v0, v[0:1]
-; GFX6-NEXT: v_mov_b32_e32 v3, s3
-; GFX6-NEXT: s_waitcnt vmcnt(0)
-; GFX6-NEXT: v_lshrrev_b32_e32 v1, 16, v0
-; GFX6-NEXT: v_cvt_f32_f16_e32 v1, v1
-; GFX6-NEXT: v_cvt_f32_f16_e32 v0, v0
-; GFX6-NEXT: v_cvt_f16_f32_e32 v1, v1
-; GFX6-NEXT: v_cvt_f16_f32_e32 v0, v0
-; GFX6-NEXT: v_lshlrev_b32_e32 v1, 16, v1
-; GFX6-NEXT: v_or_b32_e32 v4, v0, v1
-; GFX6-NEXT: v_add_i32_e32 v0, vcc, s2, v2
-; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v3, vcc
-; GFX6-NEXT: flat_store_dword v[0:1], v4
-; GFX6-NEXT: s_endpgm
-;
-; GFX8-LABEL: test_canonicalize_value_v2f16_denorm:
-; GFX8: ; %bb.0:
-; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
-; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0
-; GFX8-NEXT: s_add_i32 s12, s12, s17
-; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX8-NEXT: s_waitcnt lgkmcnt(0)
-; GFX8-NEXT: v_mov_b32_e32 v1, s1
-; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2
-; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX8-NEXT: flat_load_dword v0, v[0:1]
-; GFX8-NEXT: v_mov_b32_e32 v1, s3
-; GFX8-NEXT: s_waitcnt vmcnt(0)
-; GFX8-NEXT: v_max_f16_sdwa v3, v0, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
-; GFX8-NEXT: v_max_f16_e32 v0, v0, v0
-; GFX8-NEXT: v_or_b32_e32 v3, v0, v3
-; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2
-; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX8-NEXT: flat_store_dword v[0:1], v3
-; GFX8-NEXT: s_endpgm
+; GFX6-SDAG-LABEL: test_canonicalize_value_v2f16_denorm:
+; GFX6-SDAG: ; %bb.0:
+; GFX6-SDAG-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX6-SDAG-NEXT: v_lshlrev_b32_e32 v2, 2, v0
+; GFX6-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX6-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-SDAG-NEXT: v_add_i32_e32 v0, vcc, s0, v2
+; GFX6-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-SDAG-NEXT: flat_load_dword v0, v[0:1]
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v3, s3
+; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX6-SDAG-NEXT: v_lshrrev_b32_e32 v1, 16, v0
+; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v1, v1
+; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v0, v0
+; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v1, v1
+; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v0, v0
+; GFX6-SDAG-NEXT: v_lshlrev_b32_e32 v1, 16, v1
+; GFX6-SDAG-NEXT: v_or_b32_e32 v4, v0, v1
+; GFX6-SDAG-NEXT: v_add_i32_e32 v0, vcc, s2, v2
+; GFX6-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v3, vcc
+; GFX6-SDAG-NEXT: flat_store_dword v[0:1], v4
+; GFX6-SDAG-NEXT: s_endpgm
+;
+; GFX6-GISEL-LABEL: test_canonicalize_value_v2f16_denorm:
+; GFX6-GISEL: ; %bb.0:
+; GFX6-GISEL-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX6-GISEL-NEXT: v_lshlrev_b32_e32 v2, 2, v0
+; GFX6-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX6-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-GISEL-NEXT: v_add_i32_e32 v0, vcc, v0, v2
+; GFX6-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-GISEL-NEXT: flat_load_dword v3, v[0:1]
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v0, s2
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v1, s3
+; GFX6-GISEL-NEXT: v_add_i32_e32 v0, vcc, v0, v2
+; GFX6-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX6-GISEL-NEXT: v_lshrrev_b32_e32 v4, 16, v3
+; GFX6-GISEL-NEXT: v_and_b32_e32 v3, 0xffff, v3
+; GFX6-GISEL-NEXT: v_lshlrev_b32_e32 v4, 16, v4
+; GFX6-GISEL-NEXT: v_or_b32_e32 v3, v3, v4
+; GFX6-GISEL-NEXT: flat_store_dword v[0:1], v3
+; GFX6-GISEL-NEXT: s_endpgm
+;
+; GFX8-SDAG-LABEL: test_canonicalize_value_v2f16_denorm:
+; GFX8-SDAG: ; %bb.0:
+; GFX8-SDAG-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX8-SDAG-NEXT: v_lshlrev_b32_e32 v2, 2, v0
+; GFX8-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX8-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX8-SDAG-NEXT: v_add_u32_e32 v0, vcc, s0, v2
+; GFX8-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-SDAG-NEXT: flat_load_dword v0, v[0:1]
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s3
+; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX8-SDAG-NEXT: v_max_f16_sdwa v3, v0, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
+; GFX8-SDAG-NEXT: v_max_f16_e32 v0, v0, v0
+; GFX8-SDAG-NEXT: v_or_b32_e32 v3, v0, v3
+; GFX8-SDAG-NEXT: v_add_u32_e32 v0, vcc, s2, v2
+; GFX8-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-SDAG-NEXT: flat_store_dword v[0:1], v3
+; GFX8-SDAG-NEXT: s_endpgm
+;
+; GFX8-GISEL-LABEL: test_canonicalize_value_v2f16_denorm:
+; GFX8-GISEL: ; %bb.0:
+; GFX8-GISEL-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x0
+; GFX8-GISEL-NEXT: v_lshlrev_b32_e32 v2, 2, v0
+; GFX8-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX8-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, s0
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, s1
+; GFX8-GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v2
+; GFX8-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-GISEL-NEXT: flat_load_dword v3, v[0:1]
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, s2
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, s3
+; GFX8-GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v2
+; GFX8-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX8-GISEL-NEXT: v_max_f16_e32 v4, v3, v3
+; GFX8-GISEL-NEXT: v_max_f16_sdwa v3, v3, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
+; GFX8-GISEL-NEXT: v_or_b32_e32 v3, v4, v3
+; GFX8-GISEL-NEXT: flat_store_dword v[0:1], v3
+; GFX8-GISEL-NEXT: s_endpgm
;
; GFX9-LABEL: test_canonicalize_value_v2f16_denorm:
; GFX9: ; %bb.0:
@@ -2942,88 +5059,169 @@ define amdgpu_kernel void @test_canonicalize_value_v2f16_denorm(ptr addrspace(1)
}
define amdgpu_kernel void @v_test_canonicalize_var_v2f64(ptr addrspace(1) %out) #1 {
-; GFX6-LABEL: v_test_canonicalize_var_v2f64:
-; GFX6: ; %bb.0:
-; GFX6-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX6-NEXT: v_lshlrev_b32_e32 v0, 4, v0
-; GFX6-NEXT: s_add_i32 s12, s12, s17
-; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX6-NEXT: s_waitcnt lgkmcnt(0)
-; GFX6-NEXT: v_mov_b32_e32 v1, s1
-; GFX6-NEXT: v_add_i32_e32 v0, vcc, s0, v0
-; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX6-NEXT: flat_load_dwordx4 v[0:3], v[0:1]
-; GFX6-NEXT: v_mov_b32_e32 v5, s1
-; GFX6-NEXT: v_mov_b32_e32 v4, s0
-; GFX6-NEXT: s_waitcnt vmcnt(0)
-; GFX6-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]
-; GFX6-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
-; GFX6-NEXT: flat_store_dwordx4 v[4:5], v[0:3]
-; GFX6-NEXT: s_endpgm
-;
-; GFX8-LABEL: v_test_canonicalize_var_v2f64:
-; GFX8: ; %bb.0:
-; GFX8-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX8-NEXT: v_lshlrev_b32_e32 v0, 4, v0
-; GFX8-NEXT: s_add_i32 s12, s12, s17
-; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13
-; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
-; GFX8-NEXT: s_waitcnt lgkmcnt(0)
-; GFX8-NEXT: v_mov_b32_e32 v1, s1
-; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v0
-; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
-; GFX8-NEXT: flat_load_dwordx4 v[0:3], v[0:1]
-; GFX8-NEXT: v_mov_b32_e32 v5, s1
-; GFX8-NEXT: v_mov_b32_e32 v4, s0
-; GFX8-NEXT: s_waitcnt vmcnt(0)
-; GFX8-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]
-; GFX8-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
-; GFX8-NEXT: flat_store_dwordx4 v[4:5], v[0:3]
-; GFX8-NEXT: s_endpgm
-;
-; GFX9-LABEL: v_test_canonicalize_var_v2f64:
-; GFX9: ; %bb.0:
-; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
-; GFX9-NEXT: v_lshlrev_b32_e32 v0, 4, v0
-; GFX9-NEXT: v_mov_b32_e32 v4, 0
-; GFX9-NEXT: s_waitcnt lgkmcnt(0)
-; GFX9-NEXT: global_load_dwordx4 v[0:3], v0, s[0:1]
-; GFX9-NEXT: s_waitcnt vmcnt(0)
-; GFX9-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]
-; GFX9-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
-; GFX9-NEXT: global_store_dwordx4 v4, v[0:3], s[0:1]
-; GFX9-NEXT: s_endpgm
-;
-; GFX11-LABEL: v_test_canonicalize_var_v2f64:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0
-; GFX11-NEXT: v_mov_b32_e32 v4, 0
-; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2)
-; GFX11-NEXT: v_lshlrev_b32_e32 v0, 4, v0
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: global_load_b128 v[0:3], v0, s[0:1]
-; GFX11-NEXT: s_waitcnt vmcnt(0)
-; GFX11-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]
-; GFX11-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
-; GFX11-NEXT: global_store_b128 v4, v[0:3], s[0:1]
-; GFX11-NEXT: s_endpgm
-;
-; GFX12-LABEL: v_test_canonicalize_var_v2f64:
-; GFX12: ; %bb.0:
-; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
-; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v0
-; GFX12-NEXT: v_mov_b32_e32 v4, 0
-; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_2)
-; GFX12-NEXT: v_lshlrev_b32_e32 v0, 4, v0
-; GFX12-NEXT: s_wait_kmcnt 0x0
-; GFX12-NEXT: global_load_b128 v[0:3], v0, s[0:1]
-; GFX12-NEXT: s_wait_loadcnt 0x0
-; GFX12-NEXT: v_max_num_f64_e32 v[2:3], v[2:3], v[2:3]
-; GFX12-NEXT: v_max_num_f64_e32 v[0:1], v[0:1], v[0:1]
-; GFX12-NEXT: global_store_b128 v4, v[0:3], s[0:1]
-; GFX12-NEXT: s_endpgm
+; GFX6-SDAG-LABEL: v_test_canonicalize_var_v2f64:
+; GFX6-SDAG: ; %bb.0:
+; GFX6-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX6-SDAG-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; GFX6-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX6-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX6-SDAG-NEXT: v_add_i32_e32 v0, vcc, s0, v0
+; GFX6-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX6-SDAG-NEXT: flat_load_dwordx4 v[0:3], v[0:1]
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v5, s1
+; GFX6-SDAG-NEXT: v_mov_b32_e32 v4, s0
+; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX6-SDAG-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]
+; GFX6-SDAG-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX6-SDAG-NEXT: flat_store_dwordx4 v[4:5], v[0:3]
+; GFX6-SDAG-NEXT: s_endpgm
+;
+; GFX6-GISEL-LABEL: v_test_canonicalize_var_v2f64:
+; GFX6-GISEL: ; %bb.0:
+; GFX6-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX6-GISEL-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; GFX6-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX6-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX6-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX6-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v5, s1
+; GFX6-GISEL-NEXT: v_mov_b32_e32 v4, s0
+; GFX6-GISEL-NEXT: v_add_i32_e32 v0, vcc, v4, v0
+; GFX6-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v5, vcc
+; GFX6-GISEL-NEXT: flat_load_dwordx4 v[0:3], v[0:1]
+; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX6-GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX6-GISEL-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]
+; GFX6-GISEL-NEXT: flat_store_dwordx4 v[4:5], v[0:3]
+; GFX6-GISEL-NEXT: s_endpgm
+;
+; GFX8-SDAG-LABEL: v_test_canonicalize_var_v2f64:
+; GFX8-SDAG: ; %bb.0:
+; GFX8-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX8-SDAG-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; GFX8-SDAG-NEXT: s_add_i32 s12, s12, s17
+; GFX8-SDAG-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-SDAG-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, s1
+; GFX8-SDAG-NEXT: v_add_u32_e32 v0, vcc, s0, v0
+; GFX8-SDAG-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; GFX8-SDAG-NEXT: flat_load_dwordx4 v[0:3], v[0:1]
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v5, s1
+; GFX8-SDAG-NEXT: v_mov_b32_e32 v4, s0
+; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX8-SDAG-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]
+; GFX8-SDAG-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX8-SDAG-NEXT: flat_store_dwordx4 v[4:5], v[0:3]
+; GFX8-SDAG-NEXT: s_endpgm
+;
+; GFX8-GISEL-LABEL: v_test_canonicalize_var_v2f64:
+; GFX8-GISEL: ; %bb.0:
+; GFX8-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX8-GISEL-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; GFX8-GISEL-NEXT: s_add_i32 s12, s12, s17
+; GFX8-GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13
+; GFX8-GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8
+; GFX8-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v5, s1
+; GFX8-GISEL-NEXT: v_mov_b32_e32 v4, s0
+; GFX8-GISEL-NEXT: v_add_u32_e32 v0, vcc, v4, v0
+; GFX8-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v5, vcc
+; GFX8-GISEL-NEXT: flat_load_dwordx4 v[0:3], v[0:1]
+; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX8-GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX8-GISEL-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]
+; GFX8-GISEL-NEXT: flat_store_dwordx4 v[4:5], v[0:3]
+; GFX8-GISEL-NEXT: s_endpgm
+;
+; GFX9-SDAG-LABEL: v_test_canonicalize_var_v2f64:
+; GFX9-SDAG: ; %bb.0:
+; GFX9-SDAG-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-SDAG-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; GFX9-SDAG-NEXT: v_mov_b32_e32 v4, 0
+; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-SDAG-NEXT: global_load_dwordx4 v[0:3], v0, s[0:1]
+; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX9-SDAG-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]
+; GFX9-SDAG-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX9-SDAG-NEXT: global_store_dwordx4 v4, v[0:3], s[0:1]
+; GFX9-SDAG-NEXT: s_endpgm
+;
+; GFX9-GISEL-LABEL: v_test_canonicalize_var_v2f64:
+; GFX9-GISEL: ; %bb.0:
+; GFX9-GISEL-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; GFX9-GISEL-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; GFX9-GISEL-NEXT: v_mov_b32_e32 v4, 0
+; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-GISEL-NEXT: global_load_dwordx4 v[0:3], v0, s[0:1]
+; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX9-GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX9-GISEL-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]
+; GFX9-GISEL-NEXT: global_store_dwordx4 v4, v[0:3], s[0:1]
+; GFX9-GISEL-NEXT: s_endpgm
+;
+; GFX11-SDAG-LABEL: v_test_canonicalize_var_v2f64:
+; GFX11-SDAG: ; %bb.0:
+; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-SDAG-NEXT: v_and_b32_e32 v0, 0x3ff, v0
+; GFX11-SDAG-NEXT: v_mov_b32_e32 v4, 0
+; GFX11-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_2)
+; GFX11-SDAG-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-SDAG-NEXT: global_load_b128 v[0:3], v0, s[0:1]
+; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0)
+; GFX11-SDAG-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]
+; GFX11-SDAG-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX11-SDAG-NEXT: global_store_b128 v4, v[0:3], s[0:1]
+; GFX11-SDAG-NEXT: s_endpgm
+;
+; GFX11-GISEL-LABEL: v_test_canonicalize_var_v2f64:
+; GFX11-GISEL: ; %bb.0:
+; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX11-GISEL-NEXT: v_and_b32_e32 v0, 0x3ff, v0
+; GFX11-GISEL-NEXT: v_mov_b32_e32 v4, 0
+; GFX11-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2)
+; GFX11-GISEL-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-GISEL-NEXT: global_load_b128 v[0:3], v0, s[0:1]
+; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0)
+; GFX11-GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
+; GFX11-GISEL-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]
+; GFX11-GISEL-NEXT: global_store_b128 v4, v[0:3], s[0:1]
+; GFX11-GISEL-NEXT: s_endpgm
+;
+; GFX12-SDAG-LABEL: v_test_canonicalize_var_v2f64:
+; GFX12-SDAG: ; %bb.0:
+; GFX12-SDAG-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-SDAG-NEXT: v_and_b32_e32 v0, 0x3ff, v0
+; GFX12-SDAG-NEXT: v_mov_b32_e32 v4, 0
+; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_2)
+; GFX12-SDAG-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0
+; GFX12-SDAG-NEXT: global_load_b128 v[0:3], v0, s[0:1]
+; GFX12-SDAG-NEXT: s_wait_loadcnt 0x0
+; GFX12-SDAG-NEXT: v_max_num_f64_e32 v[2:3], v[2:3], v[2:3]
+; GFX12-SDAG-NEXT: v_max_num_f64_e32 v[0:1], v[0:1], v[0:1]
+; GFX12-SDAG-NEXT: global_store_b128 v4, v[0:3], s[0:1]
+; GFX12-SDAG-NEXT: s_endpgm
+;
+; GFX12-GISEL-LABEL: v_test_canonicalize_var_v2f64:
+; GFX12-GISEL: ; %bb.0:
+; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x0
+; GFX12-GISEL-NEXT: v_and_b32_e32 v0, 0x3ff, v0
+; GFX12-GISEL-NEXT: v_mov_b32_e32 v4, 0
+; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2)
+; GFX12-GISEL-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0
+; GFX12-GISEL-NEXT: global_load_b128 v[0:3], v0, s[0:1]
+; GFX12-GISEL-NEXT: s_wait_loadcnt 0x0
+; GFX12-GISEL-NEXT: v_max_num_f64_e32 v[0:1], v[0:1], v[0:1]
+; GFX12-GISEL-NEXT: v_max_num_f64_e32 v[2:3], v[2:3], v[2:3]
+; GFX12-GISEL-NEXT: global_store_b128 v4, v[0:3], s[0:1]
+; GFX12-GISEL-NEXT: s_endpgm
%tid = call i32 @llvm.amdgcn.workitem.id.x()
%gep = getelementptr <2 x double>, ptr addrspace(1) %out, i32 %tid
%val = load <2 x double>, ptr addrspace(1) %gep
@@ -3328,3 +5526,12 @@ attributes #4 = { nounwind "denormal-fp-math"="preserve-sign,preserve-sign" }
attributes #5 = { nounwind "denormal-fp-math-f32"="dynamic,dynamic" }
attributes #6 = { nounwind "denormal-fp-math-f32"="dynamic,ieee" }
attributes #7 = { nounwind "denormal-fp-math-f32"="ieee,dynamic" }
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; GFX11-GISEL-FAKE16: {{.*}}
+; GFX11-GISEL-TRUE16: {{.*}}
+; GFX11-SDAG-FAKE16: {{.*}}
+; GFX11-SDAG-TRUE16: {{.*}}
+; GFX12-GISEL-FAKE16: {{.*}}
+; GFX12-GISEL-TRUE16: {{.*}}
+; GFX12-SDAG-FAKE16: {{.*}}
+; GFX12-SDAG-TRUE16: {{.*}}
>From 141df97fa4d9caeacd44f585a34a3bbee7ee17ad Mon Sep 17 00:00:00 2001
From: Vang Thao <vang.thao at amd.com>
Date: Wed, 7 Jan 2026 12:05:04 -0800
Subject: [PATCH 2/3] Missed adding -new-reg-bank-select to fcanonicalize.ll
---
llvm/test/CodeGen/AMDGPU/fcanonicalize.ll | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/llvm/test/CodeGen/AMDGPU/fcanonicalize.ll b/llvm/test/CodeGen/AMDGPU/fcanonicalize.ll
index 4477c87f05354..78ea7fde4bf28 100644
--- a/llvm/test/CodeGen/AMDGPU/fcanonicalize.ll
+++ b/llvm/test/CodeGen/AMDGPU/fcanonicalize.ll
@@ -1,18 +1,18 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii < %s | FileCheck -check-prefixes=GFX678,GFX678-SDAG,GFX6-SDAG %s
-; RUN: llc -global-isel=1 -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii < %s | FileCheck -check-prefixes=GFX678,GFX678-GISEL,GFX6-GISEL %s
+; RUN: llc -global-isel=1 -new-reg-bank-select -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii < %s | FileCheck -check-prefixes=GFX678,GFX678-GISEL,GFX6-GISEL %s
; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=fiji < %s | FileCheck -check-prefixes=GFX678,GFX678-SDAG,GFX8-SDAG %s
-; RUN: llc -global-isel=1 -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=fiji < %s | FileCheck -check-prefixes=GFX678,GFX678-GISEL,GFX8-GISEL %s
+; RUN: llc -global-isel=1 -new-reg-bank-select -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=fiji < %s | FileCheck -check-prefixes=GFX678,GFX678-GISEL,GFX8-GISEL %s
; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck -check-prefixes=GFX9,GFX9-SDAG %s
-; RUN: llc -global-isel=1 -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck -check-prefixes=GFX9,GFX9-GISEL %s
+; RUN: llc -global-isel=1 -new-reg-bank-select -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck -check-prefixes=GFX9,GFX9-GISEL %s
; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-SDAG,GFX11-TRUE16,GFX11-SDAG-TRUE16 %s
-; RUN: llc -global-isel=1 -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-GISEL,GFX11-TRUE16,GFX11-GISEL-TRUE16 %s
+; RUN: llc -global-isel=1 -new-reg-bank-select -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-GISEL,GFX11-TRUE16,GFX11-GISEL-TRUE16 %s
; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-SDAG,GFX11-FAKE16,GFX11-SDAG-FAKE16 %s
-; RUN: llc -global-isel=1 -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-GISEL,GFX11-FAKE16,GFX11-GISEL-FAKE16 %s
+; RUN: llc -global-isel=1 -new-reg-bank-select -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-GISEL,GFX11-FAKE16,GFX11-GISEL-FAKE16 %s
; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-SDAG,GFX12-TRUE16,GFX12-SDAG-TRUE16 %s
-; RUN: llc -global-isel=1 -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-GISEL,GFX12-TRUE16,GFX12-GISEL-TRUE16 %s
+; RUN: llc -global-isel=1 -new-reg-bank-select -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-GISEL,GFX12-TRUE16,GFX12-GISEL-TRUE16 %s
; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-SDAG,GFX12-FAKE16,GFX12-SDAG-FAKE16 %s
-; RUN: llc -global-isel=1 -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-GISEL,GFX12-FAKE16,GFX12-GISEL-FAKE16 %s
+; RUN: llc -global-isel=1 -new-reg-bank-select -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-GISEL,GFX12-FAKE16,GFX12-GISEL-FAKE16 %s
declare float @llvm.fabs.f32(float) #0
declare float @llvm.canonicalize.f32(float) #0
@@ -382,7 +382,7 @@ define amdgpu_kernel void @v_test_canonicalize_fneg_fabs_var_f32(ptr addrspace(1
; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, s0
; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, s1
; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-GISEL-NEXT: v_mul_f32_e64 v2, 1.0, -|s2|
+; GFX678-GISEL-NEXT: v_mul_f32_e64 v2, -1.0, |s2|
; GFX678-GISEL-NEXT: flat_store_dword v[0:1], v2
; GFX678-GISEL-NEXT: s_endpgm
;
@@ -486,7 +486,7 @@ define amdgpu_kernel void @v_test_canonicalize_fneg_var_f32(ptr addrspace(1) %ou
; GFX678-GISEL-NEXT: v_mov_b32_e32 v0, s0
; GFX678-GISEL-NEXT: v_mov_b32_e32 v1, s1
; GFX678-GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GFX678-GISEL-NEXT: v_mul_f32_e64 v2, 1.0, -s2
+; GFX678-GISEL-NEXT: v_mul_f32_e64 v2, -1.0, s2
; GFX678-GISEL-NEXT: flat_store_dword v[0:1], v2
; GFX678-GISEL-NEXT: s_endpgm
;
>From 92fdbe2dfc3df7dfd8a1989c54c838ec440c7521 Mon Sep 17 00:00:00 2001
From: Vang Thao <vang.thao at amd.com>
Date: Wed, 7 Jan 2026 12:52:01 -0800
Subject: [PATCH 3/3] Address review comments
---
llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp | 4 ++--
.../CodeGen/AMDGPU/GlobalISel/regbankselect-fcanonicalize.mir | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp b/llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp
index d2605262fc9e3..55753fcf6bb7b 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp
@@ -1022,10 +1022,10 @@ RegBankLegalizeRules::RegBankLegalizeRules(const GCNSubtarget &_ST,
.Any({{DivV2S32}, {{VgprV2S32}, {VgprV2S32}}});
addRulesForGOpcs({G_FCANONICALIZE}, Standard)
- .Uni(S16, {{UniInVgprS16}, {Vgpr16}})
- .Div(S16, {{Vgpr16}, {Vgpr16}})
.Uni(S32, {{UniInVgprS32}, {Vgpr32}})
.Div(S32, {{Vgpr32}, {Vgpr32}})
+ .Uni(S16, {{UniInVgprS16}, {Vgpr16}})
+ .Div(S16, {{Vgpr16}, {Vgpr16}})
.Uni(S64, {{UniInVgprS64}, {Vgpr64}})
.Div(S64, {{Vgpr64}, {Vgpr64}})
.Uni(V2S16, {{UniInVgprV2S16}, {VgprV2S16}})
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-fcanonicalize.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-fcanonicalize.mir
index 4f71082fb22a1..da8fdd23d38fd 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-fcanonicalize.mir
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-fcanonicalize.mir
@@ -1,5 +1,5 @@
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
-# RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -run-pass="amdgpu-regbankselect,amdgpu-regbanklegalize" -verify-machineinstrs -o - %s | FileCheck %s
+# RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -run-pass='amdgpu-regbankselect,amdgpu-regbanklegalize' -o - %s | FileCheck %s
---
name: fcanonicalize_s16_s
More information about the llvm-commits
mailing list