[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