aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp2
-rw-r--r--llvm/test/CodeGen/AArch64/constant-pool-partition.ll175
-rw-r--r--llvm/test/CodeGen/AArch64/jump-table-partition.ll34
-rw-r--r--llvm/test/CodeGen/X86/global-variable-partition.ll38
4 files changed, 174 insertions, 75 deletions
diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
index 756bb05..3c165d9 100644
--- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
@@ -673,7 +673,7 @@ getELFSectionNameForGlobal(const GlobalObject *GO, SectionKind Kind,
break;
}
default:
- // Note this is unreachable code.
+ llvm_unreachable("Unknown jump table hotness");
break;
}
} else if (std::optional<StringRef> Prefix = F->getSectionPrefix())
diff --git a/llvm/test/CodeGen/AArch64/constant-pool-partition.ll b/llvm/test/CodeGen/AArch64/constant-pool-partition.ll
index 9f4b3e2..61b3b60 100644
--- a/llvm/test/CodeGen/AArch64/constant-pool-partition.ll
+++ b/llvm/test/CodeGen/AArch64/constant-pool-partition.ll
@@ -1,11 +1,21 @@
; RUN: llc -mtriple=aarch64 -partition-static-data-sections \
; RUN: -function-sections -unique-section-names=false \
-; RUN: %s -o - 2>&1 | FileCheck %s --dump-input=always
+; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=HOT,COMM --dump-input=always
+
+; RUN: llc -mtriple=aarch64 -partition-static-data-sections \
+; RUN: -function-sections -unique-section-names=false \
+; RUN: -preserve-hot-data-section-prefix=false \
+; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=NOHOT,COMM --dump-input=always
+
+; Repeat the RUN commands above for big-endian systems.
+; RUN: llc -mtriple=aarch64_be -partition-static-data-sections \
+; RUN: -function-sections -unique-section-names=false \
+; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=HOT,COMM --dump-input=always
-; Repeat the RUN command above for big-endian systems.
; RUN: llc -mtriple=aarch64_be -partition-static-data-sections \
; RUN: -function-sections -unique-section-names=false \
-; RUN: %s -o - 2>&1 | FileCheck %s --dump-input=always
+; RUN: -preserve-hot-data-section-prefix=false \
+; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=NOHOT,COMM --dump-input=always
; Tests that constant pool hotness is aggregated across the module. The
; static-data-splitter processes data from cold_func first, unprofiled_func
@@ -19,77 +29,112 @@
; function, constant pools for this constant should not have `.unlikely` suffix.
;; Constant pools for function @cold_func.
-; CHECK: .section .rodata.cst8.hot.,"aM",@progbits,8
-; CHECK-NEXT: .p2align
-; CHECK-NEXT: .LCPI0_0:
-; CHECK-NEXT: .xword 0x3fe5c28f5c28f5c3 // double 0.68000000000000005
-; CHECK-NEXT: .section .rodata.cst8.unlikely.,"aM",@progbits,8
-; CHECK-NEXT: .p2align
-; CHECK-NEXT: .LCPI0_1:
-; CHECK-NEXT: .xword 0x3fe5eb851eb851ec // double 0.68500000000000005
-; CHECK-NEXT: .section .rodata.cst8,"aM",@progbits,8
-; CHECK-NEXT: .p2align
-; CHECK-NEXT: .LCPI0_2:
-; CHECK-NEXT: .byte 0 // 0x0
-; CHECK-NEXT: .byte 4 // 0x4
-; CHECK-NEXT: .byte 8 // 0x8
-; CHECK-NEXT: .byte 12 // 0xc
-; CHECK-NEXT: .byte 255 // 0xff
-; CHECK-NEXT: .byte 255 // 0xff
-; CHECK-NEXT: .byte 255 // 0xff
-; CHECK-NEXT: .byte 255 // 0xff
+; HOT: .section .rodata.cst8.hot.,"aM",@progbits,8
+; HOT-NEXT: .p2align
+; HOT-NEXT: .LCPI0_0:
+; HOT-NEXT: .xword 0x3fe5c28f5c28f5c3 // double 0.68000000000000005
+; HOT-NEXT: .section .rodata.cst8.unlikely.,"aM",@progbits,8
+; HOT-NEXT: .p2align
+; HOT-NEXT: .LCPI0_1:
+; HOT-NEXT: .xword 0x3fe5eb851eb851ec // double 0.68500000000000005
+; HOT-NEXT: .section .rodata.cst8,"aM",@progbits,8
+; HOT-NEXT: .p2align
+; HOT-NEXT: .LCPI0_2:
+; HOT-NEXT: .byte 0 // 0x0
+; HOT-NEXT: .byte 4 // 0x4
+; HOT-NEXT: .byte 8 // 0x8
+; HOT-NEXT: .byte 12 // 0xc
+; HOT-NEXT: .byte 255 // 0xff
+; HOT-NEXT: .byte 255 // 0xff
+; HOT-NEXT: .byte 255 // 0xff
+; HOT-NEXT: .byte 255 // 0xff
+
+;; Constant pools for function @cold_func.
+; NOHOT: .section .rodata.cst8,"aM",@progbits,8
+; NOHOT-NEXT: .p2align
+; NOHOT-NEXT: .LCPI0_0:
+; NOHOT-NEXT: .xword 0x3fe5c28f5c28f5c3 // double 0.68000000000000005
+; NOHOT-NEXT: .LCPI0_2:
+; NOHOT-NEXT: .byte 0 // 0x0
+; NOHOT-NEXT: .byte 4 // 0x4
+; NOHOT-NEXT: .byte 8 // 0x8
+; NOHOT-NEXT: .byte 12 // 0xc
+; NOHOT-NEXT: .byte 255 // 0xff
+; NOHOT-NEXT: .byte 255 // 0xff
+; NOHOT-NEXT: .byte 255 // 0xff
+; NOHOT-NEXT: .byte 255 // 0xff
+; NOHOT-NEXT: .section .rodata.cst8.unlikely.,"aM",@progbits,8
+; NOHOT-NEXT: .p2align
+; NOHOT-NEXT: .LCPI0_1:
+; NOHOT-NEXT: .xword 0x3fe5eb851eb851ec // double 0.68500000000000005
;; Constant pools for function @unprofiled_func
-; CHECK: .section .rodata.cst8,"aM",@progbits,8
-; CHECK-NEXT: .p2align
-; CHECK-NEXT: .LCPI1_0:
-; CHECK-NEXT: .byte 0 // 0x0
-; CHECK-NEXT: .byte 4 // 0x4
-; CHECK-NEXT: .byte 8 // 0x8
-; CHECK-NEXT: .byte 12 // 0xc
-; CHECK-NEXT: .byte 255 // 0xff
-; CHECK-NEXT: .byte 255 // 0xff
-; CHECK-NEXT: .byte 255 // 0xff
-; CHECK-NEXT: .byte 255 // 0xff
-; CHECK-NEXT: .section .rodata.cst16,"aM",@progbits,16
-; CHECK-NEXT: .p2align
-; CHECK-NEXT: .LCPI1_1:
-; CHECK-NEXT: .word 2 // 0x2
-; CHECK-NEXT: .word 3 // 0x3
-; CHECK-NEXT: .word 5 // 0x5
-; CHECK-NEXT: .word 7 // 0x7
-; CHECK-NEXT: .section .rodata.cst16.hot.,"aM",@progbits,16
-; CHECK-NEXT: .p2align
-; CHECK-NEXT: .LCPI1_2:
-; CHECK-NEXT: .word 442 // 0x1ba
-; CHECK-NEXT: .word 100 // 0x64
-; CHECK-NEXT: .word 0 // 0x0
-; CHECK-NEXT: .word 0 // 0x0
+; COMM: .section .rodata.cst8,"aM",@progbits,8
+; COMM-NEXT: .p2align
+; COMM-NEXT: .LCPI1_0:
+; COMM-NEXT: .byte 0 // 0x0
+; COMM-NEXT: .byte 4 // 0x4
+; COMM-NEXT: .byte 8 // 0x8
+; COMM-NEXT: .byte 12 // 0xc
+; COMM-NEXT: .byte 255 // 0xff
+; COMM-NEXT: .byte 255 // 0xff
+; COMM-NEXT: .byte 255 // 0xff
+; COMM-NEXT: .byte 255 // 0xff
+
+; HOT-NEXT: .section .rodata.cst16,"aM",@progbits,16
+; HOT-NEXT: .p2align
+; HOT-NEXT: .LCPI1_1:
+; HOT-NEXT: .word 2 // 0x2
+; HOT-NEXT: .word 3 // 0x3
+; HOT-NEXT: .word 5 // 0x5
+; HOT-NEXT: .word 7 // 0x7
+; HOT-NEXT: .section .rodata.cst16.hot.,"aM",@progbits,16
+; HOT-NEXT: .p2align
+; HOT-NEXT: .LCPI1_2:
+; HOT-NEXT: .word 442 // 0x1ba
+; HOT-NEXT: .word 100 // 0x64
+; HOT-NEXT: .word 0 // 0x0
+; HOT-NEXT: .word 0 // 0x0
+
+; NOHOT: .section .rodata.cst16,"aM",@progbits,16
+; NOHOT-NEXT: .p2align
+; NOHOT-NEXT: .LCPI1_1:
+; NOHOT-NEXT: .word 2 // 0x2
+; NOHOT-NEXT: .word 3 // 0x3
+; NOHOT-NEXT: .word 5 // 0x5
+; NOHOT-NEXT: .word 7 // 0x7
+; NOHOT-NEXT: .LCPI1_2:
+; NOHOT-NEXT: .word 442 // 0x1ba
+; NOHOT-NEXT: .word 100 // 0x64
+; NOHOT-NEXT: .word 0 // 0x0
+; NOHOT-NEXT: .word 0 // 0x0
;; Constant pools for function @hot_func
-; CHECK: .section .rodata.cst8.hot.,"aM",@progbits,8
-; CHECK-NEXT: .p2align
-; CHECK-NEXT: .LCPI2_0:
-; CHECK-NEXT: .xword 0x3fe5c28f5c28f5c3 // double 0.68000000000000005
-; CHECK-NEXT: .section .rodata.cst16.hot.,"aM",@progbits,16
-; CHECK-NEXT: .p2align
-; CHECK-NEXT: .LCPI2_1:
-; CHECK-NEXT: .word 0 // 0x0
-; CHECK-NEXT: .word 100 // 0x64
-; CHECK-NEXT: .word 0 // 0x0
-; CHECK-NEXT: .word 442 // 0x1ba
-; CHECK-NEXT: .LCPI2_2:
-; CHECK-NEXT: .word 442 // 0x1ba
-; CHECK-NEXT: .word 100 // 0x64
-; CHECK-NEXT: .word 0 // 0x0
-; CHECK-NEXT: .word 0 // 0x0
+; HOT: .section .rodata.cst8.hot.,"aM",@progbits,8
+; NOHOT: .section .rodata.cst8,"aM",@progbits,8
+; COMM: .p2align
+; COMM-NEXT: .LCPI2_0:
+; COMM-NEXT: .xword 0x3fe5c28f5c28f5c3 // double 0.68000000000000005
+; NOHOT: .section .rodata.cst16,"aM",@progbits,16
+; HOT-NEXT: .section .rodata.cst16.hot.,"aM",@progbits,16
+; COMM: .p2align
+; COMM-NEXT: .LCPI2_1:
+; COMM-NEXT: .word 0 // 0x0
+; COMM-NEXT: .word 100 // 0x64
+; COMM-NEXT: .word 0 // 0x0
+; COMM-NEXT: .word 442 // 0x1ba
+; COMM-NEXT: .LCPI2_2:
+; COMM-NEXT: .word 442 // 0x1ba
+; COMM-NEXT: .word 100 // 0x64
+; COMM-NEXT: .word 0 // 0x0
+; COMM-NEXT: .word 0 // 0x0
;; For global variable @val
;; The section name remains `.rodata.cst32` without hotness prefix because
;; the variable has external linkage and not analyzed. Compiler need symbolized
;; data access profiles to annotate such global variables' hotness.
-; CHECK: .section .rodata.cst32,"aM",@progbits,32
-; CHECK-NEXT: .globl val
+; COMM: .section .rodata.cst32,"aM",@progbits,32
+; COMM-NEXT: .globl val
define i32 @cold_func(double %x, <16 x i8> %a, <16 x i8> %b) !prof !16 {
%2 = tail call i32 (...) @func_taking_arbitrary_param(double 6.800000e-01)
diff --git a/llvm/test/CodeGen/AArch64/jump-table-partition.ll b/llvm/test/CodeGen/AArch64/jump-table-partition.ll
index 47a7aa5..e6eea5d1 100644
--- a/llvm/test/CodeGen/AArch64/jump-table-partition.ll
+++ b/llvm/test/CodeGen/AArch64/jump-table-partition.ll
@@ -7,17 +7,24 @@
; The static-data-splitter pass doesn't run.
; RUN: llc -mtriple=aarch64-unknown-linux-gnu -function-sections=true \
; RUN: -aarch64-enable-atomic-cfg-tidy=false -aarch64-min-jump-table-entries=2 \
-; RUN: -unique-section-names=true %s -o - 2>&1 | FileCheck %s --check-prefixes=DEFAULT
+; RUN: -unique-section-names=true %s -o - 2>&1 | FileCheck %s --check-prefixes=DEFAULT,COMM
+
+; Repeat the command with -preserve-hot-data-section-prefix=false
+; RUN: llc -mtriple=aarch64-unknown-linux-gnu -function-sections=true \
+; RUN: -aarch64-enable-atomic-cfg-tidy=false -aarch64-min-jump-table-entries=2 \
+; RUN: -preserve-hot-data-section-prefix=false \
+; RUN: -unique-section-names=true %s -o - 2>&1 | FileCheck %s --check-prefixes=DEFNOHOT,COMM
; DEFAULT: .section .rodata.hot.foo,"a",@progbits
-; DEFAULT: .LJTI0_0:
-; DEFAULT: .LJTI0_1:
-; DEFAULT: .LJTI0_2:
-; DEFAULT: .LJTI0_3:
-; DEFAULT: .section .rodata.func_without_profile,"a",@progbits
-; DEFAULT: .LJTI1_0:
-; DEFAULT: .section .rodata.bar_prefix.bar,"a",@progbits
-; DEFAULT: .LJTI2_0
+; DEFNOHOT: .section .rodata.foo,"a",@progbits
+; COMM: .LJTI0_0:
+; COMM: .LJTI0_1:
+; COMM: .LJTI0_2:
+; COMM: .LJTI0_3:
+; COMM: .section .rodata.func_without_profile,"a",@progbits
+; COMM: .LJTI1_0:
+; COMM: .section .rodata.bar_prefix.bar,"a",@progbits
+; COMM: .LJTI2_0
; Test that section names are uniqufied by numbers but not function names with
; {-function-sections, -unique-section-names=false}. Specifically, @foo jump
@@ -40,6 +47,14 @@
; RUN: -aarch64-enable-atomic-cfg-tidy=false -aarch64-min-jump-table-entries=2 \
; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=FUNCLESS,JT
+;; Repeat the commands above with -preserve-hot-data-section-prefix=false
+; RUN: llc -mtriple=aarch64-unknown-linux-gnu -partition-static-data-sections \
+; RUN: -function-sections -unique-section-names=false \
+; RUN: -preserve-hot-data-section-prefix=false \
+; RUN: -aarch64-enable-atomic-cfg-tidy=false -aarch64-min-jump-table-entries=2 \
+; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=NOHOT,JT
+
+
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "aarch64-unknown-linux-gnu"
@@ -58,6 +73,7 @@ target triple = "aarch64-unknown-linux-gnu"
; NUM: .section .rodata.hot.,"a",@progbits,unique,2
; FUNC: .section .rodata.hot.foo,"a",@progbits
; FUNCLESS: .section .rodata.hot.,"a",@progbits
+; NOHOT: .section .rodata,"a",@progbits
; JT: .LJTI0_0:
; JT: .LJTI0_2:
; NUM: .section .rodata.unlikely.,"a",@progbits,unique,3
diff --git a/llvm/test/CodeGen/X86/global-variable-partition.ll b/llvm/test/CodeGen/X86/global-variable-partition.ll
index ce06d17..a60f56a 100644
--- a/llvm/test/CodeGen/X86/global-variable-partition.ll
+++ b/llvm/test/CodeGen/X86/global-variable-partition.ll
@@ -29,11 +29,33 @@ target triple = "x86_64-unknown-linux-gnu"
; RUN: -data-sections=false -unique-section-names=false \
; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=AGG,COMMON --dump-input=always
+;; Repeat the commands above with '-preserve-hot-data-section-prefix=false'
+
+; RUN: llc -mtriple=x86_64-unknown-linux-gnu -relocation-model=pic \
+; RUN: -partition-static-data-sections=true \
+; RUN: -data-sections=true -unique-section-names=false \
+; RUN: -preserve-hot-data-section-prefix=false \
+; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=COMMON,NOHOT,MUT --dump-input=always
+
+; RUN: llc -mtriple=x86_64-unknown-linux-gnu -relocation-model=pic \
+; RUN: -partition-static-data-sections=true \
+; RUN: -data-sections=true -unique-section-names=false \
+; RUN: -preserve-hot-data-section-prefix=false \
+; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=COMMON,NOHOT,MUT --dump-input=always
+
+; RUN: llc -mtriple=x86_64-unknown-linux-gnu -relocation-model=pic \
+; RUN: -partition-static-data-sections=true \
+; RUN: -data-sections=false -unique-section-names=false \
+; RUN: -preserve-hot-data-section-prefix=false \
+; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=COMMON,NOHOT --dump-input=always
+
+
; For @.str and @.str.1
; COMMON: .type .L.str,@object
; SYM-NEXT: .section .rodata.str1.1.hot.
; UNIQ-NEXT: .section .rodata.str1.1.hot.,"aMS",@progbits,1
; AGG-NEXT: .section .rodata.str1.1.hot
+; NOHOT: .section .rodata.str1.1,"aMS",@progbits,1
; COMMON-NEXT: .L.str:
; COMMON-NEXT: "hot\t"
; COMMON: .L.str.1:
@@ -44,24 +66,32 @@ target triple = "x86_64-unknown-linux-gnu"
; SYM-NEXT: .section .data.rel.ro.hot.hot_relro_array
; UNIQ-NEXT: .section .data.rel.ro.hot.,"aw",@progbits,unique,1
; AGG-NEXT: .section .data.rel.ro.hot.,"aw",@progbits
+; NOHOT: .section .data.rel.ro,"aw",@progbits
; For @hot_data, which is accessed by {cold_func, unprofiled_func, hot_func}.
; COMMON: .type hot_data,@object
; SYM-NEXT: .section .data.hot.hot_data,"aw",@progbits
; UNIQ-NEXT: .section .data.hot.,"aw",@progbits,unique,2
; AGG-NEXT: .section .data.hot.,"aw",@progbits
+; The `.section` directive is omitted for .data with -unique-section-names=false.
+; See MCSectionELF::shouldOmitSectionDirective for the implementation details.
+; MUT: .section .data,"aw"
; For @hot_bss, which is accessed by {unprofiled_func, hot_func}.
; COMMON: .type hot_bss,@object
; SYM-NEXT: .section .bss.hot.hot_bss,"aw",@nobits
; UNIQ-NEXT: .section .bss.hot.,"aw",@nobits,unique,3
; AGG-NEXT: .section .bss.hot.,"aw",@nobits
+; The `.section` directive is omitted for .bss with -unique-section-names=false.
+; See MCSectionELF::shouldOmitSectionDirective for the implementation details.
+; MUT: .section .bss,"aw"
; For @.str.2
; COMMON: .type .L.str.2,@object
; SYM-NEXT: .section .rodata.str1.1.unlikely.,"aMS",@progbits,1
; UNIQ-NEXT: .section .rodata.str1.1.unlikely.,"aMS",@progbits,1
; AGG-NEXT: .section .rodata.str1.1.unlikely.,"aMS",@progbits,1
+; NOHOT: .section .rodata.str1.1.unlikely.,"aMS",@progbits,1
; COMMON-NEXT: .L.str.2:
; COMMON-NEXT: "cold%d\t%d\t%d\n"
@@ -70,12 +100,14 @@ target triple = "x86_64-unknown-linux-gnu"
; SYM-NEXT: .section .bss.unlikely.cold_bss,"aw",@nobits
; UNIQ-NEXT: .section .bss.unlikely.,"aw",@nobits,unique,4
; AGG-NEXT: .section .bss.unlikely.,"aw",@nobits
+; NOHOT: .section .bss.unlikely.,"aw",@nobits
; For @cold_data
; COMMON: .type cold_data,@object
; SYM-NEXT: .section .data.unlikely.cold_data,"aw",@progbits
; UNIQ-NEXT: .section .data.unlikely.,"aw",@progbits,unique,5
; AGG-NEXT: .section .data.unlikely.,"aw",@progbits
+; NOHOT: .section .data.unlikely.,"aw",@progbits
; For @cold_data_custom_foo_section
; It has an explicit section 'foo' and shouldn't have hot or unlikely suffix.
@@ -83,12 +115,14 @@ target triple = "x86_64-unknown-linux-gnu"
; SYM-NEXT: .section foo,"aw",@progbits
; UNIQ-NEXT: .section foo,"aw",@progbits
; AGG-NEXT: .section foo,"aw",@progbits
+; NOHOT: .section foo,"aw",@progbits
; For @cold_relro_array
; COMMON: .type cold_relro_array,@object
; SYM-NEXT: .section .data.rel.ro.unlikely.cold_relro_array,"aw",@progbits
; UNIQ-NEXT: .section .data.rel.ro.unlikely.,"aw",@progbits,unique,6
; AGG-NEXT: .section .data.rel.ro.unlikely.,"aw",@progbits
+; NOHOT: .section .data.rel.ro.unlikely.,"aw",@progbits
; Currently static-data-splitter only analyzes access from code.
; @bss2 and @data3 are indirectly accessed by code through @hot_relro_array
@@ -99,12 +133,14 @@ target triple = "x86_64-unknown-linux-gnu"
; SYM-NEXT: .section .bss.unlikely.bss2,"aw",@nobits
; UNIQ-NEXT: .section .bss.unlikely.,"aw",@nobits,unique,7
; AGG-NEXT: .section .bss.unlikely.,"aw",@nobits
+; NOHOT: .section .bss.unlikely.,"aw",@nobits
; For @data3
; COMMON: .type data3,@object
; SYM-NEXT: .section .data.unlikely.data3,"aw",@progbits
; UNIQ-NEXT: .section .data.unlikely.,"aw",@progbits,unique,8
; AGG-NEXT: .section .data.unlikely.,"aw",@progbits
+; NOHOT: .section .data.unlikely.,"aw",@progbits
; For @data_with_unknown_hotness
; SYM: .type .Ldata_with_unknown_hotness,@object # @data_with_unknown_hotness
@@ -113,6 +149,7 @@ target triple = "x86_64-unknown-linux-gnu"
; The `.section` directive is omitted for .data with -unique-section-names=false.
; See MCSectionELF::shouldOmitSectionDirective for the implementation details.
; AGG: .data
+; NOHOT: .data
; COMMON: .Ldata_with_unknown_hotness:
; For @hot_data_custom_bar_section
@@ -122,6 +159,7 @@ target triple = "x86_64-unknown-linux-gnu"
; SYM: hot_data_custom_bar_section
; UNIQ: .section bar,"aw",@progbits
; AGG: .section bar,"aw",@progbits
+; NOHOT: .section bar,"aw",@progbits
@.str = private unnamed_addr constant [5 x i8] c"hot\09\00", align 1
@.str.1 = private unnamed_addr constant [10 x i8] c"%d\09%d\09%d\0A\00", align 1