target triple = "i386-pc-linux-gnu"
%"struct.kc::impl_Ccode_option" = type { %"struct.kc::impl_abstract_phylum" }
-%"struct.kc::impl_CexpressionDQ" = type { %"struct.kc::impl_Ccode_option", %"struct.kc::impl_Ccode_option"*, %"struct.kc::impl_CexpressionDQ"* }
-%"struct.kc::impl_Ctext" = type { %"struct.kc::impl_Ccode_option", i32, %"struct.kc::impl_casestring__Str"*, %"struct.kc::impl_Ctext_elem"*, %"struct.kc::impl_Ctext"* }
-%"struct.kc::impl_Ctext_elem" = type { %"struct.kc::impl_abstract_phylum", i32, %"struct.kc::impl_casestring__Str"* }
-%"struct.kc::impl_ID" = type { %"struct.kc::impl_abstract_phylum", %"struct.kc::impl_Ccode_option"*, %"struct.kc::impl_casestring__Str"*, i32, %"struct.kc::impl_casestring__Str"* }
-%"struct.kc::impl_abstract_phylum" = type { i32 (...)** }
-%"struct.kc::impl_ac_abstract_declarator_AcAbsdeclDirdecl" = type { %"struct.kc::impl_Ccode_option", %"struct.kc::impl_Ccode_option"*, %"struct.kc::impl_Ccode_option"* }
-%"struct.kc::impl_casestring__Str" = type { %"struct.kc::impl_abstract_phylum", i8* }
-%"struct.kc::impl_elem_patternrepresentation" = type { %"struct.kc::impl_abstract_phylum", i32, %"struct.kc::impl_casestring__Str"*, %"struct.kc::impl_ID"* }
-%"struct.kc::impl_fileline" = type { %"struct.kc::impl_abstract_phylum", %"struct.kc::impl_casestring__Str"*, i32 }
+%"struct.kc::impl_CexpressionDQ" = type { %"struct.kc::impl_Ccode_option", ptr, ptr }
+%"struct.kc::impl_Ctext" = type { %"struct.kc::impl_Ccode_option", i32, ptr, ptr, ptr }
+%"struct.kc::impl_Ctext_elem" = type { %"struct.kc::impl_abstract_phylum", i32, ptr }
+%"struct.kc::impl_ID" = type { %"struct.kc::impl_abstract_phylum", ptr, ptr, i32, ptr }
+%"struct.kc::impl_abstract_phylum" = type { ptr }
+%"struct.kc::impl_ac_abstract_declarator_AcAbsdeclDirdecl" = type { %"struct.kc::impl_Ccode_option", ptr, ptr }
+%"struct.kc::impl_casestring__Str" = type { %"struct.kc::impl_abstract_phylum", ptr }
+%"struct.kc::impl_elem_patternrepresentation" = type { %"struct.kc::impl_abstract_phylum", i32, ptr, ptr }
+%"struct.kc::impl_fileline" = type { %"struct.kc::impl_abstract_phylum", ptr, i32 }
%"struct.kc::impl_fileline_FileLine" = type { %"struct.kc::impl_fileline" }
-%"struct.kc::impl_outmostpatterns" = type { %"struct.kc::impl_Ccode_option", %"struct.kc::impl_elem_patternrepresentation"*, %"struct.kc::impl_outmostpatterns"* }
-%"struct.kc::impl_withcaseinfo_Withcaseinfo" = type { %"struct.kc::impl_Ccode_option", %"struct.kc::impl_outmostpatterns"*, %"struct.kc::impl_outmostpatterns"*, %"struct.kc::impl_Ctext"* }
+%"struct.kc::impl_outmostpatterns" = type { %"struct.kc::impl_Ccode_option", ptr, ptr }
+%"struct.kc::impl_withcaseinfo_Withcaseinfo" = type { %"struct.kc::impl_Ccode_option", ptr, ptr, ptr }
-@_ZTVN2kc13impl_filelineE = external constant [13 x i32 (...)*], align 32
+@_ZTVN2kc13impl_filelineE = external constant [13 x ptr], align 32
@.str = external constant [1 x i8], align 1
-@_ZTVN2kc22impl_fileline_FileLineE = external constant [13 x i32 (...)*], align 32
+@_ZTVN2kc22impl_fileline_FileLineE = external constant [13 x ptr], align 32
-define void @_ZN2kc22impl_fileline_FileLineC2EPNS_20impl_casestring__StrEi(%"struct.kc::impl_fileline_FileLine"* %this, %"struct.kc::impl_casestring__Str"* %_file, i32 %_line) align 2 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+define void @_ZN2kc22impl_fileline_FileLineC2EPNS_20impl_casestring__StrEi(ptr %this, ptr %_file, i32 %_line) align 2 personality ptr @__gxx_personality_v0 {
entry:
- %this_addr = alloca %"struct.kc::impl_fileline_FileLine"*, align 4
- %_file_addr = alloca %"struct.kc::impl_casestring__Str"*, align 4
+ %this_addr = alloca ptr, align 4
+ %_file_addr = alloca ptr, align 4
%_line_addr = alloca i32, align 4
%save_filt.150 = alloca i32
- %save_eptr.149 = alloca i8*
- %iftmp.99 = alloca %"struct.kc::impl_casestring__Str"*
- %eh_exception = alloca i8*
+ %save_eptr.149 = alloca ptr
+ %iftmp.99 = alloca ptr
+ %eh_exception = alloca ptr
%eh_selector = alloca i32
%"alloca point" = bitcast i32 0 to i32
- store %"struct.kc::impl_fileline_FileLine"* %this, %"struct.kc::impl_fileline_FileLine"** %this_addr
- store %"struct.kc::impl_casestring__Str"* %_file, %"struct.kc::impl_casestring__Str"** %_file_addr
- store i32 %_line, i32* %_line_addr
- %0 = load %"struct.kc::impl_fileline_FileLine"*, %"struct.kc::impl_fileline_FileLine"** %this_addr, align 4
- %1 = getelementptr inbounds %"struct.kc::impl_fileline_FileLine", %"struct.kc::impl_fileline_FileLine"* %0, i32 0, i32 0
+ store ptr %this, ptr %this_addr
+ store ptr %_file, ptr %_file_addr
+ store i32 %_line, ptr %_line_addr
+ %0 = load ptr, ptr %this_addr, align 4
call void @_ZN2kc13impl_filelineC2Ev() nounwind
- %2 = load %"struct.kc::impl_fileline_FileLine"*, %"struct.kc::impl_fileline_FileLine"** %this_addr, align 4
- %3 = getelementptr inbounds %"struct.kc::impl_fileline_FileLine", %"struct.kc::impl_fileline_FileLine"* %2, i32 0, i32 0
- %4 = getelementptr inbounds %"struct.kc::impl_fileline", %"struct.kc::impl_fileline"* %3, i32 0, i32 0
- %5 = getelementptr inbounds %"struct.kc::impl_abstract_phylum", %"struct.kc::impl_abstract_phylum"* %4, i32 0, i32 0
- store i32 (...)** getelementptr inbounds ([13 x i32 (...)*], [13 x i32 (...)*]* @_ZTVN2kc22impl_fileline_FileLineE, i32 0, i32 2), i32 (...)*** %5, align 4
- %6 = load %"struct.kc::impl_casestring__Str"*, %"struct.kc::impl_casestring__Str"** %_file_addr, align 4
- %7 = icmp eq %"struct.kc::impl_casestring__Str"* %6, null
- br i1 %7, label %bb, label %bb1
+ %1 = load ptr, ptr %this_addr, align 4
+ store ptr getelementptr inbounds ([13 x ptr], ptr @_ZTVN2kc22impl_fileline_FileLineE, i32 0, i32 2), ptr %1, align 4
+ %2 = load ptr, ptr %_file_addr, align 4
+ %3 = icmp eq ptr %2, null
+ br i1 %3, label %bb, label %bb1
bb: ; preds = %entry
- %8 = invoke %"struct.kc::impl_casestring__Str"* @_ZN2kc12mkcasestringEPKci()
+ %4 = invoke ptr @_ZN2kc12mkcasestringEPKci()
to label %invcont unwind label %lpad
invcont: ; preds = %bb
- store %"struct.kc::impl_casestring__Str"* %8, %"struct.kc::impl_casestring__Str"** %iftmp.99, align 4
+ store ptr %4, ptr %iftmp.99, align 4
br label %bb2
bb1: ; preds = %entry
- %9 = load %"struct.kc::impl_casestring__Str"*, %"struct.kc::impl_casestring__Str"** %_file_addr, align 4
- store %"struct.kc::impl_casestring__Str"* %9, %"struct.kc::impl_casestring__Str"** %iftmp.99, align 4
+ %5 = load ptr, ptr %_file_addr, align 4
+ store ptr %5, ptr %iftmp.99, align 4
br label %bb2
bb2: ; preds = %bb1, %invcont
- %10 = load %"struct.kc::impl_fileline_FileLine"*, %"struct.kc::impl_fileline_FileLine"** %this_addr, align 4
- %11 = getelementptr inbounds %"struct.kc::impl_fileline_FileLine", %"struct.kc::impl_fileline_FileLine"* %10, i32 0, i32 0
- %12 = getelementptr inbounds %"struct.kc::impl_fileline", %"struct.kc::impl_fileline"* %11, i32 0, i32 1
- %13 = load %"struct.kc::impl_casestring__Str"*, %"struct.kc::impl_casestring__Str"** %iftmp.99, align 4
- store %"struct.kc::impl_casestring__Str"* %13, %"struct.kc::impl_casestring__Str"** %12, align 4
- %14 = load %"struct.kc::impl_fileline_FileLine"*, %"struct.kc::impl_fileline_FileLine"** %this_addr, align 4
- %15 = getelementptr inbounds %"struct.kc::impl_fileline_FileLine", %"struct.kc::impl_fileline_FileLine"* %14, i32 0, i32 0
- %16 = getelementptr inbounds %"struct.kc::impl_fileline", %"struct.kc::impl_fileline"* %15, i32 0, i32 2
- %17 = load i32, i32* %_line_addr, align 4
- store i32 %17, i32* %16, align 4
+ %6 = load ptr, ptr %this_addr, align 4
+ %7 = getelementptr inbounds %"struct.kc::impl_fileline", ptr %6, i32 0, i32 1
+ %8 = load ptr, ptr %iftmp.99, align 4
+ store ptr %8, ptr %7, align 4
+ %9 = load ptr, ptr %this_addr, align 4
+ %10 = getelementptr inbounds %"struct.kc::impl_fileline", ptr %9, i32 0, i32 2
+ %11 = load i32, ptr %_line_addr, align 4
+ store i32 %11, ptr %10, align 4
ret void
lpad: ; preds = %bb
- %eh_ptr = landingpad { i8*, i32 }
+ %eh_ptr = landingpad { ptr, i32 }
cleanup
- %exn = extractvalue { i8*, i32 } %eh_ptr, 0
- store i8* %exn, i8** %eh_exception
- %eh_ptr4 = load i8*, i8** %eh_exception
- %eh_select5 = extractvalue { i8*, i32 } %eh_ptr, 1
- store i32 %eh_select5, i32* %eh_selector
- %eh_select = load i32, i32* %eh_selector
- store i32 %eh_select, i32* %save_filt.150, align 4
- %eh_value = load i8*, i8** %eh_exception
- store i8* %eh_value, i8** %save_eptr.149, align 4
- %18 = load %"struct.kc::impl_fileline_FileLine"*, %"struct.kc::impl_fileline_FileLine"** %this_addr, align 4
- %19 = bitcast %"struct.kc::impl_fileline_FileLine"* %18 to %"struct.kc::impl_fileline"*
- call void @_ZN2kc13impl_filelineD2Ev(%"struct.kc::impl_fileline"* %19) nounwind
- %20 = load i8*, i8** %save_eptr.149, align 4
- store i8* %20, i8** %eh_exception, align 4
- %21 = load i32, i32* %save_filt.150, align 4
- store i32 %21, i32* %eh_selector, align 4
- %eh_ptr6 = load i8*, i8** %eh_exception
+ %exn = extractvalue { ptr, i32 } %eh_ptr, 0
+ store ptr %exn, ptr %eh_exception
+ %eh_ptr4 = load ptr, ptr %eh_exception
+ %eh_select5 = extractvalue { ptr, i32 } %eh_ptr, 1
+ store i32 %eh_select5, ptr %eh_selector
+ %eh_select = load i32, ptr %eh_selector
+ store i32 %eh_select, ptr %save_filt.150, align 4
+ %eh_value = load ptr, ptr %eh_exception
+ store ptr %eh_value, ptr %save_eptr.149, align 4
+ %12 = load ptr, ptr %this_addr, align 4
+ call void @_ZN2kc13impl_filelineD2Ev(ptr %12) nounwind
+ %13 = load ptr, ptr %save_eptr.149, align 4
+ store ptr %13, ptr %eh_exception, align 4
+ %14 = load i32, ptr %save_filt.150, align 4
+ store i32 %14, ptr %eh_selector, align 4
+ %eh_ptr6 = load ptr, ptr %eh_exception
call void @_Unwind_Resume_or_Rethrow()
unreachable
}
declare void @_ZN2kc13impl_filelineC2Ev() nounwind align 2
-define void @_ZN2kc13impl_filelineD1Ev(%"struct.kc::impl_fileline"* %this) nounwind align 2 {
+define void @_ZN2kc13impl_filelineD1Ev(ptr %this) nounwind align 2 {
entry:
- %this_addr = alloca %"struct.kc::impl_fileline"*, align 4
+ %this_addr = alloca ptr, align 4
%"alloca point" = bitcast i32 0 to i32
- store %"struct.kc::impl_fileline"* %this, %"struct.kc::impl_fileline"** %this_addr
- %0 = load %"struct.kc::impl_fileline"*, %"struct.kc::impl_fileline"** %this_addr, align 4
- %1 = getelementptr inbounds %"struct.kc::impl_fileline", %"struct.kc::impl_fileline"* %0, i32 0, i32 0
- %2 = getelementptr inbounds %"struct.kc::impl_abstract_phylum", %"struct.kc::impl_abstract_phylum"* %1, i32 0, i32 0
- store i32 (...)** getelementptr inbounds ([13 x i32 (...)*], [13 x i32 (...)*]* @_ZTVN2kc13impl_filelineE, i32 0, i32 2), i32 (...)*** %2, align 4
- %3 = trunc i32 0 to i8
- %toBool = icmp ne i8 %3, 0
+ store ptr %this, ptr %this_addr
+ %0 = load ptr, ptr %this_addr, align 4
+ store ptr getelementptr inbounds ([13 x ptr], ptr @_ZTVN2kc13impl_filelineE, i32 0, i32 2), ptr %0, align 4
+ %1 = trunc i32 0 to i8
+ %toBool = icmp ne i8 %1, 0
br i1 %toBool, label %bb1, label %return
bb1: ; preds = %entry
- %4 = load %"struct.kc::impl_fileline"*, %"struct.kc::impl_fileline"** %this_addr, align 4
- %5 = bitcast %"struct.kc::impl_fileline"* %4 to i8*
+ %2 = load ptr, ptr %this_addr, align 4
call void @_ZdlPv() nounwind
br label %return
declare void @_ZdlPv() nounwind
-define void @_ZN2kc13impl_filelineD2Ev(%"struct.kc::impl_fileline"* %this) nounwind align 2 {
+define void @_ZN2kc13impl_filelineD2Ev(ptr %this) nounwind align 2 {
entry:
- %this_addr = alloca %"struct.kc::impl_fileline"*, align 4
+ %this_addr = alloca ptr, align 4
%"alloca point" = bitcast i32 0 to i32
- store %"struct.kc::impl_fileline"* %this, %"struct.kc::impl_fileline"** %this_addr
- %0 = load %"struct.kc::impl_fileline"*, %"struct.kc::impl_fileline"** %this_addr, align 4
- %1 = getelementptr inbounds %"struct.kc::impl_fileline", %"struct.kc::impl_fileline"* %0, i32 0, i32 0
- %2 = getelementptr inbounds %"struct.kc::impl_abstract_phylum", %"struct.kc::impl_abstract_phylum"* %1, i32 0, i32 0
- store i32 (...)** getelementptr inbounds ([13 x i32 (...)*], [13 x i32 (...)*]* @_ZTVN2kc13impl_filelineE, i32 0, i32 2), i32 (...)*** %2, align 4
- %3 = trunc i32 0 to i8
- %toBool = icmp ne i8 %3, 0
+ store ptr %this, ptr %this_addr
+ %0 = load ptr, ptr %this_addr, align 4
+ store ptr getelementptr inbounds ([13 x ptr], ptr @_ZTVN2kc13impl_filelineE, i32 0, i32 2), ptr %0, align 4
+ %1 = trunc i32 0 to i8
+ %toBool = icmp ne i8 %1, 0
br i1 %toBool, label %bb1, label %return
bb1: ; preds = %entry
- %4 = load %"struct.kc::impl_fileline"*, %"struct.kc::impl_fileline"** %this_addr, align 4
- %5 = bitcast %"struct.kc::impl_fileline"* %4 to i8*
+ %2 = load ptr, ptr %this_addr, align 4
call void @_ZdlPv() nounwind
br label %return
ret void
}
-define void @_ZN2kc22impl_fileline_FileLineC1EPNS_20impl_casestring__StrEi(%"struct.kc::impl_fileline_FileLine"* %this, %"struct.kc::impl_casestring__Str"* %_file, i32 %_line) align 2 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+define void @_ZN2kc22impl_fileline_FileLineC1EPNS_20impl_casestring__StrEi(ptr %this, ptr %_file, i32 %_line) align 2 personality ptr @__gxx_personality_v0 {
entry:
- %this_addr = alloca %"struct.kc::impl_fileline_FileLine"*, align 4
- %_file_addr = alloca %"struct.kc::impl_casestring__Str"*, align 4
+ %this_addr = alloca ptr, align 4
+ %_file_addr = alloca ptr, align 4
%_line_addr = alloca i32, align 4
%save_filt.148 = alloca i32
- %save_eptr.147 = alloca i8*
- %iftmp.99 = alloca %"struct.kc::impl_casestring__Str"*
- %eh_exception = alloca i8*
+ %save_eptr.147 = alloca ptr
+ %iftmp.99 = alloca ptr
+ %eh_exception = alloca ptr
%eh_selector = alloca i32
%"alloca point" = bitcast i32 0 to i32
- store %"struct.kc::impl_fileline_FileLine"* %this, %"struct.kc::impl_fileline_FileLine"** %this_addr
- store %"struct.kc::impl_casestring__Str"* %_file, %"struct.kc::impl_casestring__Str"** %_file_addr
- store i32 %_line, i32* %_line_addr
- %0 = load %"struct.kc::impl_fileline_FileLine"*, %"struct.kc::impl_fileline_FileLine"** %this_addr, align 4
- %1 = getelementptr inbounds %"struct.kc::impl_fileline_FileLine", %"struct.kc::impl_fileline_FileLine"* %0, i32 0, i32 0
+ store ptr %this, ptr %this_addr
+ store ptr %_file, ptr %_file_addr
+ store i32 %_line, ptr %_line_addr
+ %0 = load ptr, ptr %this_addr, align 4
call void @_ZN2kc13impl_filelineC2Ev() nounwind
- %2 = load %"struct.kc::impl_fileline_FileLine"*, %"struct.kc::impl_fileline_FileLine"** %this_addr, align 4
- %3 = getelementptr inbounds %"struct.kc::impl_fileline_FileLine", %"struct.kc::impl_fileline_FileLine"* %2, i32 0, i32 0
- %4 = getelementptr inbounds %"struct.kc::impl_fileline", %"struct.kc::impl_fileline"* %3, i32 0, i32 0
- %5 = getelementptr inbounds %"struct.kc::impl_abstract_phylum", %"struct.kc::impl_abstract_phylum"* %4, i32 0, i32 0
- store i32 (...)** getelementptr inbounds ([13 x i32 (...)*], [13 x i32 (...)*]* @_ZTVN2kc22impl_fileline_FileLineE, i32 0, i32 2), i32 (...)*** %5, align 4
- %6 = load %"struct.kc::impl_casestring__Str"*, %"struct.kc::impl_casestring__Str"** %_file_addr, align 4
- %7 = icmp eq %"struct.kc::impl_casestring__Str"* %6, null
- br i1 %7, label %bb, label %bb1
+ %1 = load ptr, ptr %this_addr, align 4
+ store ptr getelementptr inbounds ([13 x ptr], ptr @_ZTVN2kc22impl_fileline_FileLineE, i32 0, i32 2), ptr %1, align 4
+ %2 = load ptr, ptr %_file_addr, align 4
+ %3 = icmp eq ptr %2, null
+ br i1 %3, label %bb, label %bb1
bb: ; preds = %entry
- %8 = invoke %"struct.kc::impl_casestring__Str"* @_ZN2kc12mkcasestringEPKci()
+ %4 = invoke ptr @_ZN2kc12mkcasestringEPKci()
to label %invcont unwind label %lpad
invcont: ; preds = %bb
- store %"struct.kc::impl_casestring__Str"* %8, %"struct.kc::impl_casestring__Str"** %iftmp.99, align 4
+ store ptr %4, ptr %iftmp.99, align 4
br label %bb2
bb1: ; preds = %entry
- %9 = load %"struct.kc::impl_casestring__Str"*, %"struct.kc::impl_casestring__Str"** %_file_addr, align 4
- store %"struct.kc::impl_casestring__Str"* %9, %"struct.kc::impl_casestring__Str"** %iftmp.99, align 4
+ %5 = load ptr, ptr %_file_addr, align 4
+ store ptr %5, ptr %iftmp.99, align 4
br label %bb2
bb2: ; preds = %bb1, %invcont
- %10 = load %"struct.kc::impl_fileline_FileLine"*, %"struct.kc::impl_fileline_FileLine"** %this_addr, align 4
- %11 = getelementptr inbounds %"struct.kc::impl_fileline_FileLine", %"struct.kc::impl_fileline_FileLine"* %10, i32 0, i32 0
- %12 = getelementptr inbounds %"struct.kc::impl_fileline", %"struct.kc::impl_fileline"* %11, i32 0, i32 1
- %13 = load %"struct.kc::impl_casestring__Str"*, %"struct.kc::impl_casestring__Str"** %iftmp.99, align 4
- store %"struct.kc::impl_casestring__Str"* %13, %"struct.kc::impl_casestring__Str"** %12, align 4
- %14 = load %"struct.kc::impl_fileline_FileLine"*, %"struct.kc::impl_fileline_FileLine"** %this_addr, align 4
- %15 = getelementptr inbounds %"struct.kc::impl_fileline_FileLine", %"struct.kc::impl_fileline_FileLine"* %14, i32 0, i32 0
- %16 = getelementptr inbounds %"struct.kc::impl_fileline", %"struct.kc::impl_fileline"* %15, i32 0, i32 2
- %17 = load i32, i32* %_line_addr, align 4
- store i32 %17, i32* %16, align 4
+ %6 = load ptr, ptr %this_addr, align 4
+ %7 = getelementptr inbounds %"struct.kc::impl_fileline", ptr %6, i32 0, i32 1
+ %8 = load ptr, ptr %iftmp.99, align 4
+ store ptr %8, ptr %7, align 4
+ %9 = load ptr, ptr %this_addr, align 4
+ %10 = getelementptr inbounds %"struct.kc::impl_fileline", ptr %9, i32 0, i32 2
+ %11 = load i32, ptr %_line_addr, align 4
+ store i32 %11, ptr %10, align 4
ret void
lpad: ; preds = %bb
- %eh_ptr = landingpad { i8*, i32 }
+ %eh_ptr = landingpad { ptr, i32 }
cleanup
- %exn = extractvalue { i8*, i32 } %eh_ptr, 0
- store i8* %exn, i8** %eh_exception
- %eh_ptr4 = load i8*, i8** %eh_exception
- %eh_select5 = extractvalue { i8*, i32 } %eh_ptr, 1
- store i32 %eh_select5, i32* %eh_selector
- %eh_select = load i32, i32* %eh_selector
- store i32 %eh_select, i32* %save_filt.148, align 4
- %eh_value = load i8*, i8** %eh_exception
- store i8* %eh_value, i8** %save_eptr.147, align 4
- %18 = load %"struct.kc::impl_fileline_FileLine"*, %"struct.kc::impl_fileline_FileLine"** %this_addr, align 4
- %19 = bitcast %"struct.kc::impl_fileline_FileLine"* %18 to %"struct.kc::impl_fileline"*
- call void @_ZN2kc13impl_filelineD2Ev(%"struct.kc::impl_fileline"* %19) nounwind
- %20 = load i8*, i8** %save_eptr.147, align 4
- store i8* %20, i8** %eh_exception, align 4
- %21 = load i32, i32* %save_filt.148, align 4
- store i32 %21, i32* %eh_selector, align 4
- %eh_ptr6 = load i8*, i8** %eh_exception
+ %exn = extractvalue { ptr, i32 } %eh_ptr, 0
+ store ptr %exn, ptr %eh_exception
+ %eh_ptr4 = load ptr, ptr %eh_exception
+ %eh_select5 = extractvalue { ptr, i32 } %eh_ptr, 1
+ store i32 %eh_select5, ptr %eh_selector
+ %eh_select = load i32, ptr %eh_selector
+ store i32 %eh_select, ptr %save_filt.148, align 4
+ %eh_value = load ptr, ptr %eh_exception
+ store ptr %eh_value, ptr %save_eptr.147, align 4
+ %12 = load ptr, ptr %this_addr, align 4
+ call void @_ZN2kc13impl_filelineD2Ev(ptr %12) nounwind
+ %13 = load ptr, ptr %save_eptr.147, align 4
+ store ptr %13, ptr %eh_exception, align 4
+ %14 = load i32, ptr %save_filt.148, align 4
+ store i32 %14, ptr %eh_selector, align 4
+ %eh_ptr6 = load ptr, ptr %eh_exception
call void @_Unwind_Resume_or_Rethrow()
unreachable
}
declare void @_Unwind_Resume_or_Rethrow()
-define void @_ZN2kc21printer_functor_classC2Ev(%"struct.kc::impl_abstract_phylum"* %this) nounwind align 2 {
+define void @_ZN2kc21printer_functor_classC2Ev(ptr %this) nounwind align 2 {
entry:
unreachable
}
-define %"struct.kc::impl_Ccode_option"* @_ZN2kc11phylum_castIPNS_17impl_withcaseinfoES1_EET_PT0_(%"struct.kc::impl_Ccode_option"* %t) nounwind {
+define ptr @_ZN2kc11phylum_castIPNS_17impl_withcaseinfoES1_EET_PT0_(ptr %t) nounwind {
entry:
- ret %"struct.kc::impl_Ccode_option"* null
+ ret ptr null
}
-define %"struct.kc::impl_abstract_phylum"* @_ZNK2kc43impl_ac_direct_declarator_AcDirectDeclProto9subphylumEi(%"struct.kc::impl_ac_abstract_declarator_AcAbsdeclDirdecl"* %this, i32 %no) nounwind align 2 {
+define ptr @_ZNK2kc43impl_ac_direct_declarator_AcDirectDeclProto9subphylumEi(ptr %this, i32 %no) nounwind align 2 {
entry:
- ret %"struct.kc::impl_abstract_phylum"* undef
+ ret ptr undef
}
-define void @_ZN2kc30impl_withcaseinfo_WithcaseinfoD0Ev(%"struct.kc::impl_withcaseinfo_Withcaseinfo"* %this) nounwind align 2 {
+define void @_ZN2kc30impl_withcaseinfo_WithcaseinfoD0Ev(ptr %this) nounwind align 2 {
entry:
unreachable
}
-define void @_ZN2kc30impl_withcaseinfo_WithcaseinfoC1EPNS_26impl_patternrepresentationES2_PNS_10impl_CtextE(%"struct.kc::impl_withcaseinfo_Withcaseinfo"* %this, %"struct.kc::impl_outmostpatterns"* %_patternrepresentation_1, %"struct.kc::impl_outmostpatterns"* %_patternrepresentation_2, %"struct.kc::impl_Ctext"* %_Ctext_1) nounwind align 2 {
+define void @_ZN2kc30impl_withcaseinfo_WithcaseinfoC1EPNS_26impl_patternrepresentationES2_PNS_10impl_CtextE(ptr %this, ptr %_patternrepresentation_1, ptr %_patternrepresentation_2, ptr %_Ctext_1) nounwind align 2 {
entry:
unreachable
}
-define void @_ZN2kc21impl_rewriteviewsinfoC2EPNS_20impl_rewriteviewinfoEPS0_(%"struct.kc::impl_CexpressionDQ"* %this, %"struct.kc::impl_Ccode_option"* %p1, %"struct.kc::impl_CexpressionDQ"* %p2) nounwind align 2 {
+define void @_ZN2kc21impl_rewriteviewsinfoC2EPNS_20impl_rewriteviewinfoEPS0_(ptr %this, ptr %p1, ptr %p2) nounwind align 2 {
entry:
unreachable
}
-define %"struct.kc::impl_Ctext_elem"* @_ZN2kc11phylum_castIPNS_9impl_termENS_20impl_abstract_phylumEEET_PT0_(%"struct.kc::impl_abstract_phylum"* %t) nounwind {
+define ptr @_ZN2kc11phylum_castIPNS_9impl_termENS_20impl_abstract_phylumEEET_PT0_(ptr %t) nounwind {
entry:
unreachable
}
-define void @_ZN2kc27impl_ac_parameter_type_listD2Ev(%"struct.kc::impl_Ccode_option"* %this) nounwind align 2 {
+define void @_ZN2kc27impl_ac_parameter_type_listD2Ev(ptr %this) nounwind align 2 {
entry:
ret void
}
-define void @_ZN2kc21impl_ac_operator_nameD2Ev(%"struct.kc::impl_Ctext_elem"* %this) nounwind align 2 {
+define void @_ZN2kc21impl_ac_operator_nameD2Ev(ptr %this) nounwind align 2 {
entry:
ret void
}
-declare %"struct.kc::impl_casestring__Str"* @_ZN2kc12mkcasestringEPKci()
+declare ptr @_ZN2kc12mkcasestringEPKci()
; None of these functions should be merged
-define i32 @store_as0(i32* %x) {
+define i32 @store_as0(ptr %x) {
; CHECK-LABEL: @store_as0(
; CHECK: call void @foo(
- %gep = getelementptr i32, i32* %x, i32 4
- %y = load i32, i32* %gep
+ %gep = getelementptr i32, ptr %x, i32 4
+ %y = load i32, ptr %gep
call void @foo(i32 %y) nounwind
ret i32 %y
}
-define i32 @store_as1(i32 addrspace(1)* %x) {
+define i32 @store_as1(ptr addrspace(1) %x) {
; CHECK-LABEL: @store_as1(
; CHECK: call void @foo(
- %gep = getelementptr i32, i32 addrspace(1)* %x, i32 4
- %y = load i32, i32 addrspace(1)* %gep
+ %gep = getelementptr i32, ptr addrspace(1) %x, i32 4
+ %y = load i32, ptr addrspace(1) %gep
call void @foo(i32 %y) nounwind
ret i32 %y
}
-define i32 @store_as2(i32 addrspace(2)* %x) {
+define i32 @store_as2(ptr addrspace(2) %x) {
; CHECK-LABEL: @store_as2(
; CHECK: call void @foo(
- %gep = getelementptr i32, i32 addrspace(2)* %x, i32 4
- %y = load i32, i32 addrspace(2)* %gep
+ %gep = getelementptr i32, ptr addrspace(2) %x, i32 4
+ %y = load i32, ptr addrspace(2) %gep
call void @foo(i32 %y) nounwind
ret i32 %y
}
; Aliases should always be created for the weak functions, and
; for external functions if there is no local function
-; CHECK: @external_external_2 = unnamed_addr alias void (float*), bitcast (void (i32*)* @external_external_1 to void (float*)*)
-; CHECK: @weak_weak_2 = weak unnamed_addr alias void (float*), bitcast (void (i32*)* @0 to void (float*)*)
-; CHECK: @weak_weak_1 = weak unnamed_addr alias void (i32*), void (i32*)* @0
-; CHECK: @weak_external_1 = weak unnamed_addr alias void (i32*), bitcast (void (float*)* @weak_external_2 to void (i32*)*)
-; CHECK: @external_weak_2 = weak unnamed_addr alias void (float*), bitcast (void (i32*)* @external_weak_1 to void (float*)*)
-; CHECK: @weak_internal_1 = weak unnamed_addr alias void (i32*), bitcast (void (float*)* @weak_internal_2 to void (i32*)*)
-; CHECK: @internal_weak_2 = weak unnamed_addr alias void (float*), bitcast (void (i32*)* @internal_weak_1 to void (float*)*)
+; CHECK: @external_external_2 = unnamed_addr alias void (ptr), ptr @external_external_1
+; CHECK: @weak_weak_2 = weak unnamed_addr alias void (ptr), ptr @0
+; CHECK: @weak_weak_1 = weak unnamed_addr alias void (ptr), ptr @0
+; CHECK: @weak_external_1 = weak unnamed_addr alias void (ptr), ptr @weak_external_2
+; CHECK: @external_weak_2 = weak unnamed_addr alias void (ptr), ptr @external_weak_1
+; CHECK: @weak_internal_1 = weak unnamed_addr alias void (ptr), ptr @weak_internal_2
+; CHECK: @internal_weak_2 = weak unnamed_addr alias void (ptr), ptr @internal_weak_1
; A strong backing function had to be created for the weak-weak pair
-; CHECK: define private void @0(i32* %a) unnamed_addr
+; CHECK: define private void @0(ptr %a) unnamed_addr
; CHECK-NEXT: call void @dummy4()
; These internal functions are dropped in favor of the external ones
-; CHECK-NOT: define internal void @external_internal_2(float *%a) unnamed_addr
-; CHECK-NOT: define internal void @internal_external_1(i32 *%a) unnamed_addr
-; CHECK-NOT: define internal void @internal_external_1(i32 *%a) unnamed_addr
-; CHECK-NOT: define internal void @internal_external_2(float *%a) unnamed_addr
+; CHECK-NOT: define internal void @external_internal_2(ptr %a) unnamed_addr
+; CHECK-NOT: define internal void @internal_external_1(ptr %a) unnamed_addr
+; CHECK-NOT: define internal void @internal_external_1(ptr %a) unnamed_addr
+; CHECK-NOT: define internal void @internal_external_2(ptr %a) unnamed_addr
; Only used to mark which functions should be merged.
declare void @dummy1()
declare void @dummy8()
declare void @dummy9()
-define void @external_external_1(i32 *%a) unnamed_addr {
+define void @external_external_1(ptr %a) unnamed_addr {
call void @dummy1()
ret void
}
-define void @external_external_2(float *%a) unnamed_addr {
+define void @external_external_2(ptr %a) unnamed_addr {
call void @dummy1()
ret void
}
-define void @external_internal_1(i32 *%a) unnamed_addr {
+define void @external_internal_1(ptr %a) unnamed_addr {
call void @dummy2()
ret void
}
-define internal void @external_internal_2(float *%a) unnamed_addr {
+define internal void @external_internal_2(ptr %a) unnamed_addr {
call void @dummy2()
ret void
}
-define internal void @internal_external_1(i32 *%a) unnamed_addr {
+define internal void @internal_external_1(ptr %a) unnamed_addr {
call void @dummy3()
ret void
}
-define void @internal_external_2(float *%a) unnamed_addr {
+define void @internal_external_2(ptr %a) unnamed_addr {
call void @dummy3()
ret void
}
-define weak void @weak_weak_1(i32 *%a) unnamed_addr {
+define weak void @weak_weak_1(ptr %a) unnamed_addr {
call void @dummy4()
ret void
}
-define weak void @weak_weak_2(float *%a) unnamed_addr {
+define weak void @weak_weak_2(ptr %a) unnamed_addr {
call void @dummy4()
ret void
}
-define weak void @weak_external_1(i32 *%a) unnamed_addr {
+define weak void @weak_external_1(ptr %a) unnamed_addr {
call void @dummy5()
ret void
}
-define external void @weak_external_2(float *%a) unnamed_addr {
+define external void @weak_external_2(ptr %a) unnamed_addr {
call void @dummy5()
ret void
}
-define external void @external_weak_1(i32 *%a) unnamed_addr {
+define external void @external_weak_1(ptr %a) unnamed_addr {
call void @dummy6()
ret void
}
-define weak void @external_weak_2(float *%a) unnamed_addr {
+define weak void @external_weak_2(ptr %a) unnamed_addr {
call void @dummy6()
ret void
}
-define weak void @weak_internal_1(i32 *%a) unnamed_addr {
+define weak void @weak_internal_1(ptr %a) unnamed_addr {
call void @dummy7()
ret void
}
-define internal void @weak_internal_2(float *%a) unnamed_addr {
+define internal void @weak_internal_2(ptr %a) unnamed_addr {
call void @dummy7()
ret void
}
-define internal void @internal_weak_1(i32 *%a) unnamed_addr {
+define internal void @internal_weak_1(ptr %a) unnamed_addr {
call void @dummy8()
ret void
}
-define weak void @internal_weak_2(float *%a) unnamed_addr {
+define weak void @internal_weak_2(ptr %a) unnamed_addr {
call void @dummy8()
ret void
}
-define internal void @internal_internal_1(i32 *%a) unnamed_addr {
+define internal void @internal_internal_1(ptr %a) unnamed_addr {
call void @dummy9()
ret void
}
-define internal void @internal_internal_2(float *%a) unnamed_addr {
+define internal void @internal_internal_2(ptr %a) unnamed_addr {
call void @dummy9()
ret void
}
; CHECK-LABEL: define void @size1
; CHECK-NOT: call void @
-define void @size1(i8 *%f) {
+define void @size1(ptr %f) {
%v = alloca %kv1, align 8
- %f_2 = bitcast i8* %f to void (%kv1 *)*
- call void %f_2(%kv1 * %v)
- call void %f_2(%kv1 * %v)
- call void %f_2(%kv1 * %v)
- call void %f_2(%kv1 * %v)
+ call void %f(ptr %v)
+ call void %f(ptr %v)
+ call void %f(ptr %v)
+ call void %f(ptr %v)
ret void
}
; CHECK-LABEL: define void @size2
; CHECK-NOT: call void @
-define void @size2(i8 *%f) {
+define void @size2(ptr %f) {
%v = alloca %kv2, align 8
- %f_2 = bitcast i8* %f to void (%kv2 *)*
- call void %f_2(%kv2 * %v)
- call void %f_2(%kv2 * %v)
- call void %f_2(%kv2 * %v)
- call void %f_2(%kv2 * %v)
+ call void %f(ptr %v)
+ call void %f(ptr %v)
+ call void %f(ptr %v)
+ call void %f(ptr %v)
ret void
}
; CHECK-LABEL: define void @align1
; CHECK-NOT: call void @
-define void @align1(i8 *%f) {
+define void @align1(ptr %f) {
%v = alloca %kv3, align 8
- %f_2 = bitcast i8* %f to void (%kv3 *)*
- call void %f_2(%kv3 * %v)
- call void %f_2(%kv3 * %v)
- call void %f_2(%kv3 * %v)
- call void %f_2(%kv3 * %v)
+ call void %f(ptr %v)
+ call void %f(ptr %v)
+ call void %f(ptr %v)
+ call void %f(ptr %v)
ret void
}
; CHECK-LABEL: define void @align2
; CHECK-NOT: call void @
-define void @align2(i8 *%f) {
+define void @align2(ptr %f) {
%v = alloca %kv3, align 16
- %f_2 = bitcast i8* %f to void (%kv3 *)*
- call void %f_2(%kv3 * %v)
- call void %f_2(%kv3 * %v)
- call void %f_2(%kv3 * %v)
- call void %f_2(%kv3 * %v)
+ call void %f(ptr %v)
+ call void %f(ptr %v)
+ call void %f(ptr %v)
+ call void %f(ptr %v)
ret void
}
%Di = type <{ i32 }>
%Si = type <{ i32 }>
-define void @B(%Opaque_type* sret(%Opaque_type) %a, %S2i* %b, i32* %xp, i32* %yp) {
- %x = load i32, i32* %xp
- %y = load i32, i32* %yp
+define void @B(ptr sret(%Opaque_type) %a, ptr %b, ptr %xp, ptr %yp) {
+ %x = load i32, ptr %xp
+ %y = load i32, ptr %yp
%sum = add i32 %x, %y
%sum2 = add i32 %sum, %y
%sum3 = add i32 %sum2, %y
ret void
}
-define void @C(%Opaque_type* sret(%Opaque_type) %a, %S2i* %b, i32* %xp, i32* %yp) {
- %x = load i32, i32* %xp
- %y = load i32, i32* %yp
+define void @C(ptr sret(%Opaque_type) %a, ptr %b, ptr %xp, ptr %yp) {
+ %x = load i32, ptr %xp
+ %y = load i32, ptr %yp
%sum = add i32 %x, %y
%sum2 = add i32 %sum, %y
%sum3 = add i32 %sum2, %y
ret void
}
-define void @A(%Opaque_type* sret(%Opaque_type) %a, %D2i* %b, i32* %xp, i32* %yp) {
- %x = load i32, i32* %xp
- %y = load i32, i32* %yp
+define void @A(ptr sret(%Opaque_type) %a, ptr %b, ptr %xp, ptr %yp) {
+ %x = load i32, ptr %xp
+ %y = load i32, ptr %yp
%sum = add i32 %x, %y
%sum2 = add i32 %sum, %y
%sum3 = add i32 %sum2, %y
}
; Make sure we transfer the parameter attributes to the call site.
-; CHECK-LABEL: define void @C(%Opaque_type* sret
-; CHECK: tail call void bitcast (void (%Opaque_type*, %D2i*, i32*, i32*)* @A to void (%Opaque_type*, %S2i*, i32*, i32*)*)(%Opaque_type* sret(%Opaque_type) %0, %S2i* %1, i32* %2, i32* %3)
+; CHECK-LABEL: define void @C(ptr sret
+; CHECK: tail call void @A(ptr sret(%Opaque_type) %0, ptr %1, ptr %2, ptr %3)
; CHECK: ret void
; Make sure we transfer the parameter attributes to the call site.
-; CHECK-LABEL: define void @B(%Opaque_type* sret
-; CHECK: %5 = bitcast
-; CHECK: tail call void @A(%Opaque_type* sret(%Opaque_type) %0, %D2i* %5, i32* %2, i32* %3)
+; CHECK-LABEL: define void @B(ptr sret
+; CHECK: tail call void @A(ptr sret(%Opaque_type) %0, ptr %1, ptr %2, ptr %3)
; CHECK: ret void
@d = external dso_local global %struct.c
-define void @e(%struct.a* byval(%struct.a) %f) {
+define void @e(ptr byval(%struct.a) %f) {
; CHECK-LABEL: @e(
; CHECK-NEXT: ret void
;
ret void
}
-define void @g(%struct.c* byval(%struct.c) %f) {
+define void @g(ptr byval(%struct.c) %f) {
; CHECK-LABEL: @g(
; CHECK-NEXT: ret void
;
define void @h() {
; CHECK-LABEL: @h(
-; CHECK-NEXT: call void bitcast (void (%struct.a*)* @e to void (%struct.c*)*)(%struct.c* byval(%struct.c) @d)
+; CHECK-NEXT: call void @e(ptr byval(%struct.c) @d)
; CHECK-NEXT: ret void
;
- call void @g(%struct.c* byval(%struct.c) @d)
+ call void @g(ptr byval(%struct.c) @d)
ret void
}
define internal void @foo() {
; CHECK: define internal void @foo()
- call void @callee_i32(i32* byval(i32) @i)
+ call void @callee_i32(ptr byval(i32) @i)
ret void
}
define internal void @bar() {
; CHECK: define internal void @bar()
- call void @callee_float(float* byval(float) @f)
+ call void @callee_float(ptr byval(float) @f)
ret void
}
define internal void @baz() {
; CHECK-NOT: define{{.*}}@bar
- call void @callee_float(float* byval(float) @f)
+ call void @callee_float(ptr byval(float) @f)
ret void
}
ret void
}
-declare void @callee_i32(i32* byval(i32))
-declare void @callee_float(float* byval(float))
+declare void @callee_i32(ptr byval(i32))
+declare void @callee_float(ptr byval(float))
ret i8 %out
}
-define i8 @invoke_with_range() personality i8* undef {
+define i8 @invoke_with_range() personality ptr undef {
%out = invoke i8 @dummy() to label %next unwind label %lpad, !range !0
next:
ret i8 %out
lpad:
- %pad = landingpad { i8*, i32 } cleanup
- resume { i8*, i32 } zeroinitializer
+ %pad = landingpad { ptr, i32 } cleanup
+ resume { ptr, i32 } zeroinitializer
}
-define i8 @invoke_no_range() personality i8* undef {
+define i8 @invoke_no_range() personality ptr undef {
; CHECK-LABEL: @invoke_no_range()
; CHECK-NEXT: invoke i8 @dummy
%out = invoke i8 @dummy() to label %next unwind label %lpad
ret i8 %out
lpad:
- %pad = landingpad { i8*, i32 } cleanup
- resume { i8*, i32 } zeroinitializer
+ %pad = landingpad { ptr, i32 } cleanup
+ resume { ptr, i32 } zeroinitializer
}
-define i8 @invoke_different_range() personality i8* undef {
+define i8 @invoke_different_range() personality ptr undef {
; CHECK-LABEL: @invoke_different_range()
; CHECK-NEXT: invoke i8 @dummy
%out = invoke i8 @dummy() to label %next unwind label %lpad, !range !1
ret i8 %out
lpad:
- %pad = landingpad { i8*, i32 } cleanup
- resume { i8*, i32 } zeroinitializer
+ %pad = landingpad { ptr, i32 } cleanup
+ resume { ptr, i32 } zeroinitializer
}
-define i8 @invoke_with_same_range() personality i8* undef {
+define i8 @invoke_with_same_range() personality ptr undef {
; CHECK-LABEL: @invoke_with_same_range()
; CHECK: tail call i8 @invoke_with_range()
%out = invoke i8 @dummy() to label %next unwind label %lpad, !range !0
ret i8 %out
lpad:
- %pad = landingpad { i8*, i32 } cleanup
- resume { i8*, i32 } zeroinitializer
+ %pad = landingpad { ptr, i32 } cleanup
+ resume { ptr, i32 } zeroinitializer
}
define i8 @call_with_same_range() {
; RUN: opt -S -passes=mergefunc %s | FileCheck %s
-@symbols = linkonce_odr global <{ i8*, i8* }> <{ i8* bitcast (i32 (i32, i32)* @f to i8*), i8* bitcast (i32 (i32, i32)* @g to i8*) }>
+@symbols = linkonce_odr global <{ ptr, ptr }> <{ ptr @f, ptr @g }>
$f = comdat any
$g = comdat any
%.qux.2496 = type { i32, %.qux.2497 }
%.qux.2497 = type { i8, i32 }
-%.qux.2585 = type { i32, i32, i8* }
+%.qux.2585 = type { i32, i32, ptr }
@g2 = external unnamed_addr constant [9 x i8], align 1
-@g3 = internal unnamed_addr constant [1 x i8*] [i8* bitcast (i8* (%.qux.2585*)* @func35 to i8*)]
+@g3 = internal unnamed_addr constant [1 x ptr] [ptr @func35]
-define internal i32 @func1(i32* %ptr, { i32, i32 }* nocapture %method) align 2 {
+define internal i32 @func1(ptr %ptr, ptr nocapture %method) align 2 {
br label %1
; <label>:1
ret i32 undef
}
-define internal i32 @func10(%.qux.2496* nocapture %this) align 2 {
- %1 = getelementptr inbounds %.qux.2496, %.qux.2496* %this, i32 0, i32 1, i32 1
- %2 = load i32, i32* %1, align 4
+define internal i32 @func10(ptr nocapture %this) align 2 {
+ %1 = getelementptr inbounds %.qux.2496, ptr %this, i32 0, i32 1, i32 1
+ %2 = load i32, ptr %1, align 4
ret i32 %2
}
-define internal i8* @func29(i32* nocapture %this) align 2 {
- ret i8* getelementptr inbounds ([9 x i8], [9 x i8]* @g2, i32 0, i32 0)
+define internal ptr @func29(ptr nocapture %this) align 2 {
+ ret ptr @g2
}
-define internal i32* @func33(%.qux.2585* nocapture %this) align 2 {
- ret i32* undef
+define internal ptr @func33(ptr nocapture %this) align 2 {
+ ret ptr undef
}
-define internal i32* @func34(%.qux.2585* nocapture %this) align 2 {
- %1 = getelementptr inbounds %.qux.2585, %.qux.2585* %this, i32 0
- ret i32* undef
+define internal ptr @func34(ptr nocapture %this) align 2 {
+ ret ptr undef
}
-define internal i8* @func35(%.qux.2585* nocapture %this) align 2 {
- %1 = getelementptr inbounds %.qux.2585, %.qux.2585* %this, i32 0, i32 2
- %2 = load i8*, i8** %1, align 4
- ret i8* %2
+define internal ptr @func35(ptr nocapture %this) align 2 {
+ %1 = getelementptr inbounds %.qux.2585, ptr %this, i32 0, i32 2
+ %2 = load ptr, ptr %1, align 4
+ ret ptr %2
}
; causes an assert in the ValueHandle call back because we are RAUWing with a
; different type (AllocaInst) than its key type (GlobalValue).
-@G = internal global i8** null
-@G2 = internal global i8** null
+@G = internal global ptr null
+@G2 = internal global ptr null
-define i32 @main(i32 %argc, i8** %argv) norecurse {
+define i32 @main(i32 %argc, ptr %argv) norecurse {
; CHECK: alloca
- store i8** %argv, i8*** @G
+ store ptr %argv, ptr @G
ret i32 0
}
-define internal i8** @dead1(i64 %p) {
+define internal ptr @dead1(i64 %p) {
call void @right(i64 %p)
call void @right(i64 %p)
call void @right(i64 %p)
call void @right(i64 %p)
- %tmp = load i8**, i8*** @G
- ret i8** %tmp
+ %tmp = load ptr, ptr @G
+ ret ptr %tmp
}
-define internal i8** @dead2(i64 %p) {
+define internal ptr @dead2(i64 %p) {
call void @right(i64 %p)
call void @right(i64 %p)
call void @right(i64 %p)
call void @right(i64 %p)
- %tmp = load i8**, i8*** @G2
- ret i8** %tmp
+ %tmp = load ptr, ptr @G2
+ ret ptr %tmp
}
define void @left(i64 %p) {
; CHECK-NOT: @b
-@x = constant { i32 ()*, i32 ()* } { i32 ()* @a, i32 ()* @b }
-; CHECK: { i32 ()* @a, i32 ()* @a }
+@x = constant { ptr, ptr } { ptr @a, ptr @b }
+; CHECK: { ptr @a, ptr @a }
define i32 @func() {
; CHECK-LABEL: @func(
;; Check the cases involving dso_local_equivalent where we do not expect functions to be merged.
; RUN: opt -S -passes=mergefunc < %s | FileCheck %s
-@x = constant { i32 ()*, i32 ()* } { i32 ()* @a, i32 ()* @b }
-; CHECK: { i32 ()* @a, i32 ()* @b }
+@x = constant { ptr, ptr } { ptr @a, ptr @b }
+; CHECK: { ptr @a, ptr @b }
-@x2 = constant { i32 ()*, i32 ()* } { i32 ()* @c, i32 ()* @d }
-; CHECK: { i32 ()* @c, i32 ()* @d }
+@x2 = constant { ptr, ptr } { ptr @c, ptr @d }
+; CHECK: { ptr @c, ptr @d }
;; func1 and func2 are different functions.
declare i32 @func1()
; These should not be merged, the type of the GEP pointer argument does not have
; the same stride.
-%"struct1" = type <{ i8*, i32, [4 x i8] }>
-%"struct2" = type { i8*, { i64, i64 } }
+%"struct1" = type <{ ptr, i32, [4 x i8] }>
+%"struct2" = type { ptr, { i64, i64 } }
-define internal %struct2* @Ffunc(%struct2* %P, i64 %i) {
+define internal ptr @Ffunc(ptr %P, i64 %i) {
; CHECK-LABEL: @Ffunc(
; CHECK-NEXT: getelementptr
; CHECK-NEXT: getelementptr
; CHECK-NEXT: getelementptr
; CHECK-NEXT: getelementptr
; CHECK-NEXT: ret
- %1 = getelementptr inbounds %"struct2", %"struct2"* %P, i64 %i
- %2 = getelementptr inbounds %"struct2", %"struct2"* %P, i64 %i
- %3 = getelementptr inbounds %"struct2", %"struct2"* %P, i64 %i
- %4 = getelementptr inbounds %"struct2", %"struct2"* %P, i64 %i
- %5 = getelementptr inbounds %"struct2", %"struct2"* %P, i64 %i
- %6 = getelementptr inbounds %"struct2", %"struct2"* %P, i64 %i
- ret %struct2* %6
+ %1 = getelementptr inbounds %"struct2", ptr %P, i64 %i
+ %2 = getelementptr inbounds %"struct2", ptr %P, i64 %i
+ %3 = getelementptr inbounds %"struct2", ptr %P, i64 %i
+ %4 = getelementptr inbounds %"struct2", ptr %P, i64 %i
+ %5 = getelementptr inbounds %"struct2", ptr %P, i64 %i
+ %6 = getelementptr inbounds %"struct2", ptr %P, i64 %i
+ ret ptr %6
}
-define internal %struct1* @Gfunc(%struct1* %P, i64 %i) {
+define internal ptr @Gfunc(ptr %P, i64 %i) {
; CHECK-LABEL: @Gfunc(
; CHECK-NEXT: getelementptr
; CHECK-NEXT: getelementptr
; CHECK-NEXT: getelementptr
; CHECK-NEXT: getelementptr
; CHECK-NEXT: ret
- %1 = getelementptr inbounds %"struct1", %"struct1"* %P, i64 %i
- %2 = getelementptr inbounds %"struct1", %"struct1"* %P, i64 %i
- %3 = getelementptr inbounds %"struct1", %"struct1"* %P, i64 %i
- %4 = getelementptr inbounds %"struct1", %"struct1"* %P, i64 %i
- %5 = getelementptr inbounds %"struct1", %"struct1"* %P, i64 %i
- %6 = getelementptr inbounds %"struct1", %"struct1"* %P, i64 %i
- ret %struct1* %6
+ %1 = getelementptr inbounds %"struct1", ptr %P, i64 %i
+ %2 = getelementptr inbounds %"struct1", ptr %P, i64 %i
+ %3 = getelementptr inbounds %"struct1", ptr %P, i64 %i
+ %4 = getelementptr inbounds %"struct1", ptr %P, i64 %i
+ %5 = getelementptr inbounds %"struct1", ptr %P, i64 %i
+ %6 = getelementptr inbounds %"struct1", ptr %P, i64 %i
+ ret ptr %6
}
; CHECK-NEXT: tail call void @float_ptr_null()
; CHECK-LABEL: @int_ptr_arg_same
-; CHECK-NEXT: %2 = bitcast i32* %0 to float*
-; CHECK-NEXT: tail call void @float_ptr_arg_same(float* %2)
+; CHECK-NEXT: tail call void @float_ptr_arg_same(ptr %0)
; Used to satisfy minimum size limit
declare void @stuff()
; Can be merged
define void @float_ptr_null() {
- call void asm "nop", "r"(float* null)
+ call void asm "nop", "r"(ptr null)
call void @stuff()
ret void
}
define void @int_ptr_null() {
- call void asm "nop", "r"(i32* null)
+ call void asm "nop", "r"(ptr null)
call void @stuff()
ret void
}
; Can be merged (uses same argument differing by pointer type)
-define void @float_ptr_arg_same(float*) {
- call void asm "nop", "r"(float* %0)
+define void @float_ptr_arg_same(ptr) {
+ call void asm "nop", "r"(ptr %0)
call void @stuff()
ret void
}
-define void @int_ptr_arg_same(i32*) {
- call void asm "nop", "r"(i32* %0)
+define void @int_ptr_arg_same(ptr) {
+ call void asm "nop", "r"(ptr %0)
call void @stuff()
ret void
}
; Can not be merged (uses different arguments)
-define void @float_ptr_arg_different(float*, float*) {
- call void asm "nop", "r"(float* %0)
+define void @float_ptr_arg_different(ptr, ptr) {
+ call void asm "nop", "r"(ptr %0)
call void @stuff()
ret void
}
-define void @int_ptr_arg_different(i32*, i32*) {
- call void asm "nop", "r"(i32* %1)
+define void @int_ptr_arg_different(ptr, ptr) {
+ call void asm "nop", "r"(ptr %1)
call void @stuff()
ret void
}
%.qux.2496 = type { i32, %.qux.2497 }
%.qux.2497 = type { i8, i32 }
-%.qux.2585 = type { i32, i32, i8* }
+%.qux.2585 = type { i32, i32, ptr }
@g2 = external addrspace(1) constant [9 x i8], align 1
-@g3 = internal unnamed_addr constant [1 x i8*] [i8* bitcast (i8* (%.qux.2585 addrspace(1)*)* @func35 to i8*)]
+@g3 = internal unnamed_addr constant [1 x ptr] [ptr @func35]
-define internal i32 @func10(%.qux.2496 addrspace(1)* nocapture %this) align 2 {
+define internal i32 @func10(ptr addrspace(1) nocapture %this) align 2 {
bb:
- %tmp = getelementptr inbounds %.qux.2496, %.qux.2496 addrspace(1)* %this, i32 0, i32 1, i32 1
- %tmp1 = load i32, i32 addrspace(1)* %tmp, align 4
+ %tmp = getelementptr inbounds %.qux.2496, ptr addrspace(1) %this, i32 0, i32 1, i32 1
+ %tmp1 = load i32, ptr addrspace(1) %tmp, align 4
ret i32 %tmp1
}
; Check for pointer bitwidth equal assertion failure
-define internal i8* @func35(%.qux.2585 addrspace(1)* nocapture %this) align 2 {
+define internal ptr @func35(ptr addrspace(1) nocapture %this) align 2 {
bb:
; CHECK-LABEL: @func35(
-; CHECK: %[[V2:.+]] = bitcast %.qux.2585 addrspace(1)* %{{.*}} to %.qux.2496 addrspace(1)*
-; CHECK: %[[V3:.+]] = tail call i32 @func10(%.qux.2496 addrspace(1)* nocapture %[[V2]])
-; CHECK: %{{.*}} = inttoptr i32 %[[V3]] to i8*
- %tmp = getelementptr inbounds %.qux.2585, %.qux.2585 addrspace(1)* %this, i32 0, i32 2
- %tmp1 = load i8*, i8* addrspace(1)* %tmp, align 4
- ret i8* %tmp1
+; CHECK: %[[V3:.+]] = tail call i32 @func10(ptr addrspace(1) nocapture %{{.*}})
+; CHECK: %{{.*}} = inttoptr i32 %[[V3]] to ptr
+ %tmp = getelementptr inbounds %.qux.2585, ptr addrspace(1) %this, i32 0, i32 2
+ %tmp1 = load ptr, ptr addrspace(1) %tmp, align 4
+ ret ptr %tmp1
}
%.qux.2496 = type { i32, %.qux.2497 }
%.qux.2497 = type { i8, i32 }
-%.qux.2585 = type { i32, i32, i8* }
+%.qux.2585 = type { i32, i32, ptr }
@g2 = external unnamed_addr constant [9 x i8], align 1
-@g3 = internal unnamed_addr constant [1 x i8*] [i8* bitcast (i8* (%.qux.2585*)* @func35 to i8*)]
+@g3 = internal unnamed_addr constant [1 x ptr] [ptr @func35]
-define internal i32 @func1(i32* %ptr, { i32, i32 }* nocapture %method) align 2 {
+define internal i32 @func1(ptr %ptr, ptr nocapture %method) align 2 {
bb:
br label %bb1
ret i32 undef
}
-define internal i32 @func10(%.qux.2496* nocapture %this) align 2 {
+define internal i32 @func10(ptr nocapture %this) align 2 {
bb:
- %tmp = getelementptr inbounds %.qux.2496, %.qux.2496* %this, i32 0, i32 1, i32 1
- %tmp1 = load i32, i32* %tmp, align 4
+ %tmp = getelementptr inbounds %.qux.2496, ptr %this, i32 0, i32 1, i32 1
+ %tmp1 = load i32, ptr %tmp, align 4
ret i32 %tmp1
}
-define internal i8* @func29(i32* nocapture %this) align 2 {
+define internal ptr @func29(ptr nocapture %this) align 2 {
bb:
- ret i8* getelementptr inbounds ([9 x i8], [9 x i8]* @g2, i32 0, i32 0)
+ ret ptr @g2
}
-define internal i32* @func33(%.qux.2585* nocapture %this) align 2 {
+define internal ptr @func33(ptr nocapture %this) align 2 {
bb:
- ret i32* undef
+ ret ptr undef
}
-define internal i32* @func34(%.qux.2585* nocapture %this) align 2 {
+define internal ptr @func34(ptr nocapture %this) align 2 {
bb:
- %tmp = getelementptr inbounds %.qux.2585, %.qux.2585* %this, i32 0
- ret i32* undef
+ ret ptr undef
}
-define internal i8* @func35(%.qux.2585* nocapture %this) align 2 {
+define internal ptr @func35(ptr nocapture %this) align 2 {
bb:
; CHECK-LABEL: @func35(
-; CHECK: %[[V2:.+]] = bitcast %.qux.2585* %{{.*}} to %.qux.2496*
-; CHECK: %[[V3:.+]] = tail call i32 @func10(%.qux.2496* nocapture %[[V2]])
-; CHECK: %{{.*}} = inttoptr i32 %[[V3]] to i8*
- %tmp = getelementptr inbounds %.qux.2585, %.qux.2585* %this, i32 0, i32 2
- %tmp1 = load i8*, i8** %tmp, align 4
- ret i8* %tmp1
+; CHECK: %[[V3:.+]] = tail call i32 @func10(ptr nocapture %{{.*}})
+; CHECK: %{{.*}} = inttoptr i32 %[[V3]] to ptr
+ %tmp = getelementptr inbounds %.qux.2585, ptr %this, i32 0, i32 2
+ %tmp1 = load ptr, ptr %tmp, align 4
+ ret ptr %tmp1
}
; This creates a use of @funB, preventing -passes=mergefunc from deleting it.
; @funC, however, can safely be deleted as it has no uses, and is discardable
; if unused.
-@take_addr_of_funB = global i8* bitcast (i32 (i32, i32)* @funB to i8*)
+@take_addr_of_funB = global ptr @funB
entry:
%retval = alloca i32, align 4
%i.addr = alloca i32, align 4
- store i32 %i, i32* %i.addr, align 4
- %0 = load i32, i32* %i.addr, align 4
+ store i32 %i, ptr %i.addr, align 4
+ %0 = load i32, ptr %i.addr, align 4
%cmp = icmp eq i32 %0, 1
br i1 %cmp, label %if.then, label %if.end
if.then:
- store i32 3, i32* %retval
+ store i32 3, ptr %retval
br label %return
if.end:
- %1 = load i32, i32* %i.addr, align 4
+ %1 = load i32, ptr %i.addr, align 4
%cmp1 = icmp eq i32 %1, 3
br i1 %cmp1, label %if.then.2, label %if.end.3
if.then.2:
- store i32 56, i32* %retval
+ store i32 56, ptr %retval
br label %return
if.end.3:
- store i32 0, i32* %retval
+ store i32 0, ptr %retval
br label %return
return:
- %2 = load i32, i32* %retval
+ %2 = load i32, ptr %retval
ret i32 %2
}
-define internal i8* @Afunc(i32* %P) {
- store i32 1, i32* %P
- store i32 3, i32* %P
- ret i8* blockaddress(@_Z1fi, %if.then.2)
+define internal ptr @Afunc(ptr %P) {
+ store i32 1, ptr %P
+ store i32 3, ptr %P
+ ret ptr blockaddress(@_Z1fi, %if.then.2)
}
-define internal i8* @Bfunc(i32* %P) {
+define internal ptr @Bfunc(ptr %P) {
; CHECK-NOT: @Bfunc
- store i32 1, i32* %P
- store i32 3, i32* %P
- ret i8* blockaddress(@_Z1fi, %if.then.2)
+ store i32 1, ptr %P
+ store i32 3, ptr %P
+ ret ptr blockaddress(@_Z1fi, %if.then.2)
}
entry:
%i.addr = alloca i32, align 4
%ret = alloca i32, align 4
- %l = alloca i8*, align 8
- store i32 %i, i32* %i.addr, align 4
- store i32 0, i32* %ret, align 4
- store i8* blockaddress(@_Z1fi, %val_0), i8** %l, align 8
- %0 = load i32, i32* %i.addr, align 4
+ %l = alloca ptr, align 8
+ store i32 %i, ptr %i.addr, align 4
+ store i32 0, ptr %ret, align 4
+ store ptr blockaddress(@_Z1fi, %val_0), ptr %l, align 8
+ %0 = load i32, ptr %i.addr, align 4
%and = and i32 %0, 256
%cmp = icmp eq i32 %and, 0
br i1 %cmp, label %if.then, label %if.end
if.then:
- store i8* blockaddress(@_Z1fi, %val_1), i8** %l, align 8
+ store ptr blockaddress(@_Z1fi, %val_1), ptr %l, align 8
br label %if.end
if.end:
- %1 = load i8*, i8** %l, align 8
+ %1 = load ptr, ptr %l, align 8
br label %indirectgoto
val_1:
- store i32 42, i32* %ret, align 4
+ store i32 42, ptr %ret, align 4
br label %end
val_0:
- store i32 12, i32* %ret, align 4
+ store i32 12, ptr %ret, align 4
br label %end
end:
- %2 = load i32, i32* %ret, align 4
+ %2 = load i32, ptr %ret, align 4
ret i32 %2
indirectgoto:
- %indirect.goto.dest = phi i8* [ %1, %if.end ]
- indirectbr i8* %indirect.goto.dest, [label %val_0, label %val_1]
+ %indirect.goto.dest = phi ptr [ %1, %if.end ]
+ indirectbr ptr %indirect.goto.dest, [label %val_0, label %val_1]
}
define i32 @_Z1gi(i32 %i) #0 {
entry:
%i.addr = alloca i32, align 4
%ret = alloca i32, align 4
- %l = alloca i8*, align 8
- store i32 %i, i32* %i.addr, align 4
- store i32 0, i32* %ret, align 4
- store i8* blockaddress(@_Z1gi, %val_0), i8** %l, align 8
- %0 = load i32, i32* %i.addr, align 4
+ %l = alloca ptr, align 8
+ store i32 %i, ptr %i.addr, align 4
+ store i32 0, ptr %ret, align 4
+ store ptr blockaddress(@_Z1gi, %val_0), ptr %l, align 8
+ %0 = load i32, ptr %i.addr, align 4
%and = and i32 %0, 256
%cmp = icmp eq i32 %and, 0
br i1 %cmp, label %if.then, label %if.end
if.then:
- store i8* blockaddress(@_Z1gi, %val_1), i8** %l, align 8
+ store ptr blockaddress(@_Z1gi, %val_1), ptr %l, align 8
br label %if.end
if.end:
- %1 = load i8*, i8** %l, align 8
+ %1 = load ptr, ptr %l, align 8
br label %indirectgoto
val_0:
- store i32 12, i32* %ret, align 4
+ store i32 12, ptr %ret, align 4
br label %end
val_1:
- store i32 42, i32* %ret, align 4
+ store i32 42, ptr %ret, align 4
br label %end
end:
- %2 = load i32, i32* %ret, align 4
+ %2 = load i32, ptr %ret, align 4
ret i32 %2
indirectgoto:
- %indirect.goto.dest = phi i8* [ %1, %if.end ]
- indirectbr i8* %indirect.goto.dest, [label %val_0, label %val_1]
+ %indirect.goto.dest = phi ptr [ %1, %if.end ]
+ indirectbr ptr %indirect.goto.dest, [label %val_0, label %val_1]
}
; Afunc and Bfunc differ only in that one returns i64, the other a pointer.
; These should be merged.
-define internal i64 @Afunc(i32* %P, i32* %Q) {
+define internal i64 @Afunc(ptr %P, ptr %Q) {
; CHECK-LABEL: define internal i64 @Afunc
- store i32 4, i32* %P
- store i32 6, i32* %Q
+ store i32 4, ptr %P
+ store i32 6, ptr %Q
ret i64 0
}
-define internal i64* @Bfunc(i32* %P, i32* %Q) {
+define internal ptr @Bfunc(ptr %P, ptr %Q) {
; MERGE-NOT: @Bfunc
- store i32 4, i32* %P
- store i32 6, i32* %Q
- ret i64* null
+ store i32 4, ptr %P
+ store i32 6, ptr %Q
+ ret ptr null
}
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
; Merging should still work even if the values are wrapped in a vector.
-define internal <2 x i64> @Mfunc(i32* %P, i32* %Q) {
+define internal <2 x i64> @Mfunc(ptr %P, ptr %Q) {
; CHECK-LABEL: define internal <2 x i64> @Mfunc
- store i32 1, i32* %P
- store i32 1, i32* %Q
+ store i32 1, ptr %P
+ store i32 1, ptr %Q
ret <2 x i64> <i64 0, i64 0>
}
-define internal <2 x i64*> @Nfunc(i32* %P, i32* %Q) {
+define internal <2 x ptr> @Nfunc(ptr %P, ptr %Q) {
; MERGE-NOT: @Nfunc
- store i32 1, i32* %P
- store i32 1, i32* %Q
- ret <2 x i64*> <i64* null, i64* null>
+ store i32 1, ptr %P
+ store i32 1, ptr %Q
+ ret <2 x ptr> <ptr null, ptr null>
}
}
; CHECK-LABEL: @f1(
-; CHECK: ptrtoint i64*
+; CHECK: ptrtoint ptr
; CHECK: tail call void @f0(i64
-define void @f1(i64* %p0) {
+define void @f1(ptr %p0) {
entry:
call void @stuff()
call void @stuff()
; CHECK-NOT: @b
-@x = constant { void ()*, void ()* } { void ()* @a, void ()* @b }
-; CHECK: { void ()* @a, void ()* @a }
+@x = constant { ptr, ptr } { ptr @a, ptr @b }
+; CHECK: { ptr @a, ptr @a }
define internal void @a() unnamed_addr {
ret void
; CHECK-NOT: @b
-@x = constant { i32 (i32)*, i32 (i32)* }
- { i32 (i32)* bitcast (i32 (%A)* @a to i32 (i32)*),
- i32 (i32)* bitcast (i32 (%B)* @b to i32 (i32)*) }
-; CHECK: { i32 (i32)* bitcast (i32 (%A)* @a to i32 (i32)*), i32 (i32)* bitcast (i32 (%A)* @a to i32 (i32)*) }
+@x = constant { ptr, ptr }
+ { ptr @a,
+ ptr @b }
+; CHECK: { ptr @a, ptr @a }
define internal i32 @a(%A) unnamed_addr {
extractvalue %A %0, 0
define i32 @c(i32) {
insertvalue %B undef, i32 %0, 0
call i32 @b(%B %2)
-; CHECK: call i32 bitcast (i32 (%A)* @a to i32 (%B)*)(%B %2)
+; CHECK: call i32 @a(%B %2)
ret i32 %3
}
; CHECK-NOT: @b
-@x = constant { i32 (i32)*, i32 (i32)* } { i32 (i32)* @a, i32 (i32)* @b }
-; CHECK: { i32 (i32)* @a, i32 (i32)* @a }
+@x = constant { ptr, ptr } { ptr @a, ptr @b }
+; CHECK: { ptr @a, ptr @a }
define internal i32 @a(i32 %a) unnamed_addr {
%b = xor i32 %a, 0
; RUN: opt -S -passes=mergefunc < %s | FileCheck %s
-@llvm.compiler.used = appending global [1 x i8*] [i8* bitcast (i32 (i32)* @a to i8*)], section "llvm.metadata"
+@llvm.compiler.used = appending global [1 x ptr] [ptr @a], section "llvm.metadata"
define internal i32 @a(i32 %a) unnamed_addr {
%b = xor i32 %a, 0
ret i32 %b
}
-; CHECK-LABEL: @llvm.compiler.used = appending global [1 x i8*] [i8* bitcast (i32 (i32)* @a to i8*)], section "llvm.metadata"
+; CHECK-LABEL: @llvm.compiler.used = appending global [1 x ptr] [ptr @a], section "llvm.metadata"
; CHECK-LABEL: define i32 @b(i32 %a) unnamed_addr
; CHECK-NEXT: xor
%i = alloca i32, align 4
%m = alloca i32, align 4
%j = alloca i32, align 4
- store i32 %x, i32* %x.addr, align 4
- call void @llvm.dbg.declare(metadata i32* %x.addr, metadata !11, metadata !12), !dbg !13
- store i32 %y, i32* %y.addr, align 4
- call void @llvm.dbg.declare(metadata i32* %y.addr, metadata !14, metadata !12), !dbg !15
- call void @llvm.dbg.declare(metadata i32* %i, metadata !16, metadata !12), !dbg !17
- call void @llvm.dbg.declare(metadata i32* %m, metadata !18, metadata !12), !dbg !19
- call void @llvm.dbg.declare(metadata i32* %j, metadata !20, metadata !12), !dbg !21
- %0 = load i32, i32* %x.addr, align 4, !dbg !22
- %1 = load i32, i32* %y.addr, align 4, !dbg !24
+ store i32 %x, ptr %x.addr, align 4
+ call void @llvm.dbg.declare(metadata ptr %x.addr, metadata !11, metadata !12), !dbg !13
+ store i32 %y, ptr %y.addr, align 4
+ call void @llvm.dbg.declare(metadata ptr %y.addr, metadata !14, metadata !12), !dbg !15
+ call void @llvm.dbg.declare(metadata ptr %i, metadata !16, metadata !12), !dbg !17
+ call void @llvm.dbg.declare(metadata ptr %m, metadata !18, metadata !12), !dbg !19
+ call void @llvm.dbg.declare(metadata ptr %j, metadata !20, metadata !12), !dbg !21
+ %0 = load i32, ptr %x.addr, align 4, !dbg !22
+ %1 = load i32, ptr %y.addr, align 4, !dbg !24
%cmp = icmp sgt i32 %0, %1, !dbg !25
br i1 %cmp, label %if.then, label %if.else, !dbg !26
if.then: ; preds = %entry
- %2 = load i32, i32* %x.addr, align 4, !dbg !27
- store i32 %2, i32* %m, align 4, !dbg !28
+ %2 = load i32, ptr %x.addr, align 4, !dbg !27
+ store i32 %2, ptr %m, align 4, !dbg !28
br label %if.end, !dbg !29
if.else: ; preds = %entry
- %3 = load i32, i32* %y.addr, align 4, !dbg !30
- store i32 %3, i32* %m, align 4, !dbg !31
+ %3 = load i32, ptr %y.addr, align 4, !dbg !30
+ store i32 %3, ptr %m, align 4, !dbg !31
br label %if.end
if.end: ; preds = %if.else, %if.then
- %4 = load i32, i32* %m, align 4, !dbg !32
+ %4 = load i32, ptr %m, align 4, !dbg !32
ret i32 %4, !dbg !33
}
; OPTIMIZATION_LEVEL_0-NEXT: entry:
; OPTIMIZATION_LEVEL_0-NEXT: %x.addr = alloca i32, align 4
; OPTIMIZATION_LEVEL_0-NEXT: %y.addr = alloca i32, align 4
-; OPTIMIZATION_LEVEL_0-NEXT: store i32 %x, i32* %x.addr, align 4
-; OPTIMIZATION_LEVEL_0-NEXT: call void @llvm.dbg.declare(metadata i32* %x.addr, metadata !{{[0-9]+}}, metadata !DIExpression()), !dbg !{{[0-9]+}}
-; OPTIMIZATION_LEVEL_0-NEXT: store i32 %y, i32* %y.addr, align 4
-; OPTIMIZATION_LEVEL_0-NEXT: call void @llvm.dbg.declare(metadata i32* %y.addr, metadata !{{[0-9]+}}, metadata !DIExpression()), !dbg !{{[0-9]+}}
+; OPTIMIZATION_LEVEL_0-NEXT: store i32 %x, ptr %x.addr, align 4
+; OPTIMIZATION_LEVEL_0-NEXT: call void @llvm.dbg.declare(metadata ptr %x.addr, metadata !{{[0-9]+}}, metadata !DIExpression()), !dbg !{{[0-9]+}}
+; OPTIMIZATION_LEVEL_0-NEXT: store i32 %y, ptr %y.addr, align 4
+; OPTIMIZATION_LEVEL_0-NEXT: call void @llvm.dbg.declare(metadata ptr %y.addr, metadata !{{[0-9]+}}, metadata !DIExpression()), !dbg !{{[0-9]+}}
; OPTIMIZATION_LEVEL_0-NEXT: %0 = tail call i32 @maxA(i32 %x, i32 %y), !dbg !{{[0-9]+}}
; OPTIMIZATION_LEVEL_0-NEXT: ret i32 %0, !dbg !{{[0-9]+}}
; OPTIMIZATION_LEVEL_0-NEXT: }
%i = alloca i32, align 4
%m = alloca i32, align 4
%j = alloca i32, align 4
- store i32 %x, i32* %x.addr, align 4
- call void @llvm.dbg.declare(metadata i32* %x.addr, metadata !35, metadata !12), !dbg !36
- store i32 %y, i32* %y.addr, align 4
- call void @llvm.dbg.declare(metadata i32* %y.addr, metadata !37, metadata !12), !dbg !38
- call void @llvm.dbg.declare(metadata i32* %i, metadata !39, metadata !12), !dbg !40
- call void @llvm.dbg.declare(metadata i32* %m, metadata !41, metadata !12), !dbg !42
- call void @llvm.dbg.declare(metadata i32* %j, metadata !43, metadata !12), !dbg !44
- %0 = load i32, i32* %x.addr, align 4, !dbg !45
- %1 = load i32, i32* %y.addr, align 4, !dbg !47
+ store i32 %x, ptr %x.addr, align 4
+ call void @llvm.dbg.declare(metadata ptr %x.addr, metadata !35, metadata !12), !dbg !36
+ store i32 %y, ptr %y.addr, align 4
+ call void @llvm.dbg.declare(metadata ptr %y.addr, metadata !37, metadata !12), !dbg !38
+ call void @llvm.dbg.declare(metadata ptr %i, metadata !39, metadata !12), !dbg !40
+ call void @llvm.dbg.declare(metadata ptr %m, metadata !41, metadata !12), !dbg !42
+ call void @llvm.dbg.declare(metadata ptr %j, metadata !43, metadata !12), !dbg !44
+ %0 = load i32, ptr %x.addr, align 4, !dbg !45
+ %1 = load i32, ptr %y.addr, align 4, !dbg !47
%cmp = icmp sgt i32 %0, %1, !dbg !48
br i1 %cmp, label %if.then, label %if.else, !dbg !49
if.then: ; preds = %entry
- %2 = load i32, i32* %x.addr, align 4, !dbg !50
- store i32 %2, i32* %m, align 4, !dbg !51
+ %2 = load i32, ptr %x.addr, align 4, !dbg !50
+ store i32 %2, ptr %m, align 4, !dbg !51
br label %if.end, !dbg !52
if.else: ; preds = %entry
- %3 = load i32, i32* %y.addr, align 4, !dbg !53
- store i32 %3, i32* %m, align 4, !dbg !54
+ %3 = load i32, ptr %y.addr, align 4, !dbg !53
+ store i32 %3, ptr %m, align 4, !dbg !54
br label %if.end
if.end: ; preds = %if.else, %if.then
- %4 = load i32, i32* %m, align 4, !dbg !55
+ %4 = load i32, ptr %m, align 4, !dbg !55
ret i32 %4, !dbg !56
}
target datalayout = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32"
-%kv1 = type { i32*, i32* }
-%kv2 = type { i8*, i8* }
+%kv1 = type { ptr, ptr }
+%kv2 = type { ptr, ptr }
declare void @noop()
define %kv1 @fn1() {
; CHECK-LABEL: @fn1(
%tmp = alloca %kv1
- %v1 = getelementptr %kv1, %kv1* %tmp, i32 0, i32 0
- store i32* null, i32** %v1
- %v2 = getelementptr %kv1, %kv1* %tmp, i32 0, i32 0
- store i32* null, i32** %v2
+ store ptr null, ptr %tmp
+ store ptr null, ptr %tmp
call void @noop()
- %v3 = load %kv1, %kv1* %tmp
+ %v3 = load %kv1, ptr %tmp
ret %kv1 %v3
}
; CHECK-LABEL: @fn2(
; CHECK: %1 = tail call %kv1 @fn1()
; CHECK: %2 = extractvalue %kv1 %1, 0
-; CHECK: %3 = bitcast i32* %2 to i8*
-; CHECK: %4 = insertvalue %kv2 poison, i8* %3, 0
+; CHECK: %3 = insertvalue %kv2 poison, ptr %2, 0
%tmp = alloca %kv2
- %v1 = getelementptr %kv2, %kv2* %tmp, i32 0, i32 0
- store i8* null, i8** %v1
- %v2 = getelementptr %kv2, %kv2* %tmp, i32 0, i32 0
- store i8* null, i8** %v2
+ store ptr null, ptr %tmp
+ store ptr null, ptr %tmp
call void @noop()
- %v3 = load %kv2, %kv2* %tmp
+ %v3 = load %kv2, ptr %tmp
ret %kv2 %v3
}
; RUN: opt -S -passes=mergefunc %s | FileCheck %s
; CHECK-LABEL: define void @foo
-; CHECK: call void %bc
-define void @foo(i8* byval(i8) %a0, i8* swiftself %a4) {
+; CHECK: call void %a0
+define void @foo(ptr byval(i8) %a0, ptr swiftself %a4) {
entry:
- %bc = bitcast i8* %a0 to void (i8*, i8*)*
- call void %bc(i8* byval(i8) %a0, i8* swiftself %a4)
+ call void %a0(ptr byval(i8) %a0, ptr swiftself %a4)
ret void
}
; CHECK-LABEL: define void @bar
-; CHECK: call void %bc
-define void @bar(i8* byval(i8) %a0, i8** swifterror %a4) {
+; CHECK: call void %a0
+define void @bar(ptr byval(i8) %a0, ptr swifterror %a4) {
entry:
- %bc = bitcast i8* %a0 to void (i8*, i8**)*
- call void %bc(i8* byval(i8) %a0, i8** swifterror %a4)
+ call void %a0(ptr byval(i8) %a0, ptr swifterror %a4)
ret void
}
entry:
%i.addr = alloca i32, align 4
%ret = alloca i32, align 4
- %l = alloca i8*, align 8
- store i32 %i, i32* %i.addr, align 4
- store i32 0, i32* %ret, align 4
+ %l = alloca ptr, align 8
+ store i32 %i, ptr %i.addr, align 4
+ store i32 0, ptr %ret, align 4
; Right here, this is val_0, and later the if might assign val_1
- store i8* blockaddress(@_Z1fi, %val_0), i8** %l, align 8
- %0 = load i32, i32* %i.addr, align 4
+ store ptr blockaddress(@_Z1fi, %val_0), ptr %l, align 8
+ %0 = load i32, ptr %i.addr, align 4
%and = and i32 %0, 256
%cmp = icmp eq i32 %and, 0
br i1 %cmp, label %if.then, label %if.end
if.then:
- store i8* blockaddress(@_Z1fi, %val_1), i8** %l, align 8
+ store ptr blockaddress(@_Z1fi, %val_1), ptr %l, align 8
br label %if.end
if.end:
- %1 = load i8*, i8** %l, align 8
+ %1 = load ptr, ptr %l, align 8
br label %indirectgoto
val_0:
- store i32 12, i32* %ret, align 4
+ store i32 12, ptr %ret, align 4
br label %end
val_1:
- store i32 42, i32* %ret, align 4
+ store i32 42, ptr %ret, align 4
br label %end
end:
- %2 = load i32, i32* %ret, align 4
+ %2 = load i32, ptr %ret, align 4
ret i32 %2
indirectgoto:
- %indirect.goto.dest = phi i8* [ %1, %if.end ]
- indirectbr i8* %indirect.goto.dest, [label %val_0, label %val_1]
+ %indirect.goto.dest = phi ptr [ %1, %if.end ]
+ indirectbr ptr %indirect.goto.dest, [label %val_0, label %val_1]
}
; Function Attrs: nounwind uwtable
entry:
%i.addr = alloca i32, align 4
%ret = alloca i32, align 4
- %l = alloca i8*, align 8
- store i32 %i, i32* %i.addr, align 4
- store i32 0, i32* %ret, align 4
+ %l = alloca ptr, align 8
+ store i32 %i, ptr %i.addr, align 4
+ store i32 0, ptr %ret, align 4
; This time, we store val_1 initially, and later the if might assign val_0
- store i8* blockaddress(@_Z1gi, %val_1), i8** %l, align 8
- %0 = load i32, i32* %i.addr, align 4
+ store ptr blockaddress(@_Z1gi, %val_1), ptr %l, align 8
+ %0 = load i32, ptr %i.addr, align 4
%and = and i32 %0, 256
%cmp = icmp eq i32 %and, 0
br i1 %cmp, label %if.then, label %if.end
if.then:
- store i8* blockaddress(@_Z1gi, %val_0), i8** %l, align 8
+ store ptr blockaddress(@_Z1gi, %val_0), ptr %l, align 8
br label %if.end
if.end:
- %1 = load i8*, i8** %l, align 8
+ %1 = load ptr, ptr %l, align 8
br label %indirectgoto
val_0:
- store i32 12, i32* %ret, align 4
+ store i32 12, ptr %ret, align 4
br label %end
val_1:
- store i32 42, i32* %ret, align 4
+ store i32 42, ptr %ret, align 4
br label %end
end:
- %2 = load i32, i32* %ret, align 4
+ %2 = load i32, ptr %ret, align 4
ret i32 %2
indirectgoto:
- %indirect.goto.dest = phi i8* [ %1, %if.end ]
- indirectbr i8* %indirect.goto.dest, [label %val_1, label %val_0]
+ %indirect.goto.dest = phi ptr [ %1, %if.end ]
+ indirectbr ptr %indirect.goto.dest, [label %val_1, label %val_0]
}
target triple = "x86_64-unknown-linux-gnu"
-define internal i8* @Afunc(i32* %P) {
+define internal ptr @Afunc(ptr %P) {
; CHECK-LABEL: @Afunc
; CHECK-NEXT: store
; CHECK-NEXT: store
; CHECK-NEXT: ret
- store i32 1, i32* %P
- store i32 3, i32* %P
- ret i8* blockaddress(@_Z1fi, %if.then)
+ store i32 1, ptr %P
+ store i32 3, ptr %P
+ ret ptr blockaddress(@_Z1fi, %if.then)
}
-define internal i8* @Bfunc(i32* %P) {
+define internal ptr @Bfunc(ptr %P) {
; CHECK-LABEL: @Bfunc
; CHECK-NEXT: store
; CHECK-NEXT: store
; CHECK-NEXT: ret
- store i32 1, i32* %P
- store i32 3, i32* %P
- ret i8* blockaddress(@_Z1fi, %if.then.2)
+ store i32 1, ptr %P
+ store i32 3, ptr %P
+ ret ptr blockaddress(@_Z1fi, %if.then.2)
}
entry:
%retval = alloca i32, align 4
%i.addr = alloca i32, align 4
- store i32 %i, i32* %i.addr, align 4
- %0 = load i32, i32* %i.addr, align 4
+ store i32 %i, ptr %i.addr, align 4
+ %0 = load i32, ptr %i.addr, align 4
%cmp = icmp eq i32 %0, 1
br i1 %cmp, label %if.then, label %if.end
if.then:
- store i32 3, i32* %retval
+ store i32 3, ptr %retval
br label %return
if.end:
- %1 = load i32, i32* %i.addr, align 4
+ %1 = load i32, ptr %i.addr, align 4
%cmp1 = icmp eq i32 %1, 3
br i1 %cmp1, label %if.then.2, label %if.end.3
if.then.2:
- store i32 56, i32* %retval
+ store i32 56, ptr %retval
br label %return
if.end.3:
- store i32 0, i32* %retval
+ store i32 0, ptr %retval
br label %return
return:
- %2 = load i32, i32* %retval
+ %2 = load i32, ptr %retval
ret i32 %2
}
; These should not be merged, as the datalayout says a pointer is 64 bits. No
; sext/zext is specified, so these functions could lower differently.
-define internal i32 @Ffunc(i32* %P, i32* %Q) {
+define internal i32 @Ffunc(ptr %P, ptr %Q) {
; CHECK-LABEL: define internal i32 @Ffunc
; CHECK-NEXT: store
; CHECK-NEXT: store
; CHECK-NEXT: ret
- store i32 1, i32* %P
- store i32 3, i32* %Q
+ store i32 1, ptr %P
+ store i32 3, ptr %Q
ret i32 0
}
-define internal i64* @Gfunc(i32* %P, i32* %Q) {
-; CHECK-LABEL: define internal i64* @Gfunc
+define internal ptr @Gfunc(ptr %P, ptr %Q) {
+; CHECK-LABEL: define internal ptr @Gfunc
; CHECK-NEXT: store
; CHECK-NEXT: store
; CHECK-NEXT: ret
- store i32 1, i32* %P
- store i32 3, i32* %Q
- ret i64* null
+ store i32 1, ptr %P
+ store i32 3, ptr %Q
+ ret ptr null
}
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
; These should not be merged, as 1 != 0.
-define internal i64 @Ifunc(i32* %P, i32* %Q) {
+define internal i64 @Ifunc(ptr %P, ptr %Q) {
; CHECK-LABEL: define internal i64 @Ifunc
; CHECK-NEXT: store
; CHECK-NEXT: store
; CHECK-NEXT: ret
- store i32 10, i32* %P
- store i32 10, i32* %Q
+ store i32 10, ptr %P
+ store i32 10, ptr %Q
ret i64 1
}
-define internal i64* @Jfunc(i32* %P, i32* %Q) {
-; CHECK-LABEL: define internal i64* @Jfunc
+define internal ptr @Jfunc(ptr %P, ptr %Q) {
+; CHECK-LABEL: define internal ptr @Jfunc
; CHECK-NEXT: store
; CHECK-NEXT: store
; CHECK-NEXT: ret
- store i32 10, i32* %P
- store i32 10, i32* %Q
- ret i64* null
+ store i32 10, ptr %P
+ store i32 10, ptr %Q
+ ret ptr null
}
}
; CHECK-LABEL: @f1(
-; CHECK: ptrtoint i64*
+; CHECK: ptrtoint ptr
; CHECK: tail call addrspace(1) void @f0(i64
-define void @f1(i64* %p0) {
+define void @f1(ptr %p0) {
entry:
call void @stuff()
call void @stuff()
ret void
}
-define void @f2(i64 addrspace(1)* %p0) {
+define void @f2(ptr addrspace(1) %p0) {
entry:
call void @stuff()
call void @stuff()
}
; CHECK-LABEL: @f0
-; CHECK: %2 = ptrtoint i64* %0 to i64
+; CHECK: %2 = ptrtoint ptr %0 to i64
; CHECK: tail call void @f0(i64 %2)
; CHECK: ret void
-define void @f1(i64 addrspace(0)* %p0) {
+define void @f1(ptr addrspace(0) %p0) {
entry:
call void @stuff()
call void @stuff()
declare void @stuff()
-define void @f0(i64 addrspace(0)* %p0) {
+define void @f0(ptr addrspace(0) %p0) {
entry:
call void @stuff()
call void @stuff()
ret void
}
-define void @f2(i64 addrspace(1)* %p0) {
+define void @f2(ptr addrspace(1) %p0) {
entry:
call void @stuff()
call void @stuff()
; RUN: opt -passes=mergefunc -S < %s | FileCheck %s
-define i1 @cmp_with_range(i8*, i8*) {
- %v1 = load i8, i8* %0, !range !0
- %v2 = load i8, i8* %1, !range !0
+define i1 @cmp_with_range(ptr, ptr) {
+ %v1 = load i8, ptr %0, !range !0
+ %v2 = load i8, ptr %1, !range !0
%out = icmp eq i8 %v1, %v2
ret i1 %out
}
-define i1 @cmp_no_range(i8*, i8*) {
+define i1 @cmp_no_range(ptr, ptr) {
; CHECK-LABEL: @cmp_no_range
-; CHECK-NEXT: %v1 = load i8, i8* %0
-; CHECK-NEXT: %v2 = load i8, i8* %1
+; CHECK-NEXT: %v1 = load i8, ptr %0
+; CHECK-NEXT: %v2 = load i8, ptr %1
; CHECK-NEXT: %out = icmp eq i8 %v1, %v2
; CHECK-NEXT: ret i1 %out
- %v1 = load i8, i8* %0
- %v2 = load i8, i8* %1
+ %v1 = load i8, ptr %0
+ %v2 = load i8, ptr %1
%out = icmp eq i8 %v1, %v2
ret i1 %out
}
-define i1 @cmp_different_range(i8*, i8*) {
+define i1 @cmp_different_range(ptr, ptr) {
; CHECK-LABEL: @cmp_different_range
-; CHECK-NEXT: %v1 = load i8, i8* %0, align 1, !range !1
-; CHECK-NEXT: %v2 = load i8, i8* %1, align 1, !range !1
+; CHECK-NEXT: %v1 = load i8, ptr %0, align 1, !range !1
+; CHECK-NEXT: %v2 = load i8, ptr %1, align 1, !range !1
; CHECK-NEXT: %out = icmp eq i8 %v1, %v2
; CHECK-NEXT: ret i1 %out
- %v1 = load i8, i8* %0, !range !1
- %v2 = load i8, i8* %1, !range !1
+ %v1 = load i8, ptr %0, !range !1
+ %v2 = load i8, ptr %1, !range !1
%out = icmp eq i8 %v1, %v2
ret i1 %out
}
-define i1 @cmp_with_same_range(i8*, i8*) {
+define i1 @cmp_with_same_range(ptr, ptr) {
; CHECK-LABEL: @cmp_with_same_range
; CHECK: tail call i1 @cmp_with_range
- %v1 = load i8, i8* %0, !range !0
- %v2 = load i8, i8* %1, !range !0
+ %v1 = load i8, ptr %0, !range !0
+ %v2 = load i8, ptr %1, !range !0
%out = icmp eq i8 %v1, %v2
ret i1 %out
}
; RUN: opt -passes=mergefunc -S < %s | FileCheck %s
-define i1 @cmp_with_range(i8*, i8*) {
- %v1 = load i8, i8* %0, !range !0
- %v2 = load i8, i8* %1, !range !0
+define i1 @cmp_with_range(ptr, ptr) {
+ %v1 = load i8, ptr %0, !range !0
+ %v2 = load i8, ptr %1, !range !0
%out = icmp eq i8 %v1, %v2
ret i1 %out
}
-define i1 @cmp_no_range(i8*, i8*) {
+define i1 @cmp_no_range(ptr, ptr) {
; CHECK-LABEL: @cmp_no_range
-; CHECK-NEXT: %v1 = load i8, i8* %0
-; CHECK-NEXT: %v2 = load i8, i8* %1
+; CHECK-NEXT: %v1 = load i8, ptr %0
+; CHECK-NEXT: %v2 = load i8, ptr %1
; CHECK-NEXT: %out = icmp eq i8 %v1, %v2
; CHECK-NEXT: ret i1 %out
- %v1 = load i8, i8* %0
- %v2 = load i8, i8* %1
+ %v1 = load i8, ptr %0
+ %v2 = load i8, ptr %1
%out = icmp eq i8 %v1, %v2
ret i1 %out
}
-define i1 @cmp_different_range(i8*, i8*) {
+define i1 @cmp_different_range(ptr, ptr) {
; CHECK-LABEL: @cmp_different_range
-; CHECK-NEXT: %v1 = load i8, i8* %0, align 1, !range !1
-; CHECK-NEXT: %v2 = load i8, i8* %1, align 1, !range !1
+; CHECK-NEXT: %v1 = load i8, ptr %0, align 1, !range !1
+; CHECK-NEXT: %v2 = load i8, ptr %1, align 1, !range !1
; CHECK-NEXT: %out = icmp eq i8 %v1, %v2
; CHECK-NEXT: ret i1 %out
- %v1 = load i8, i8* %0, !range !1
- %v2 = load i8, i8* %1, !range !1
+ %v1 = load i8, ptr %0, !range !1
+ %v2 = load i8, ptr %1, !range !1
%out = icmp eq i8 %v1, %v2
ret i1 %out
}
-define i1 @cmp_with_same_range(i8*, i8*) {
+define i1 @cmp_with_same_range(ptr, ptr) {
; CHECK-LABEL: @cmp_with_same_range
; CHECK: tail call i1 @cmp_with_range
- %v1 = load i8, i8* %0, !range !0
- %v2 = load i8, i8* %1, !range !0
+ %v1 = load i8, ptr %0, !range !0
+ %v2 = load i8, ptr %1, !range !0
%out = icmp eq i8 %v1, %v2
ret i1 %out
}
; RUN: opt -passes=mergefunc -disable-output < %s
; A linked list type and simple payload
-%LL = type { %S, %LL* }
-%S = type { void (%S*, i32)* }
+%LL = type { %S, ptr }
+%S = type { ptr }
; Table refers to itself via GEP
-@Table = internal global [3 x %LL] [%LL { %S { void (%S*, i32)* @B }, %LL* getelementptr inbounds ([3 x %LL], [3 x %LL]* @Table, i32 0, i32 0) }, %LL { %S { void (%S*, i32)* @A }, %LL* getelementptr inbounds ([3 x %LL], [3 x %LL]* @Table, i32 0, i32 0) }, %LL { %S { void (%S*, i32)* @A }, %LL* getelementptr inbounds ([3 x %LL], [3 x %LL]* @Table, i32 0, i32 0) }], align 16
+@Table = internal global [3 x %LL] [%LL { %S { ptr @B }, ptr @Table }, %LL { %S { ptr @A }, ptr @Table }, %LL { %S { ptr @A }, ptr @Table }], align 16
; The body of this is irrelevant; it is long so that mergefunc doesn't skip it as a small function.
-define internal void @A(%S* %self, i32 %a) {
+define internal void @A(ptr %self, i32 %a) {
%1 = add i32 %a, 32
%2 = add i32 %1, 32
%3 = add i32 %2, 32
ret void
}
-define internal void @B(%S* %self, i32 %a) {
+define internal void @B(ptr %self, i32 %a) {
%1 = add i32 %a, 32
%2 = add i32 %1, 32
%3 = add i32 %2, 32
; both return undef. They should be merged. Note undef cannot be merged with
; anything else, because this implies the ordering will be inconsistent (i.e.
; -1 == undef and undef == 1, but -1 < 1, so we must have undef != <any int>).
-define internal i64 @Cfunc(i32* %P, i32* %Q) {
+define internal i64 @Cfunc(ptr %P, ptr %Q) {
; CHECK-LABEL: define internal i64 @Cfunc
- store i32 4, i32* %P
- store i32 6, i32* %Q
+ store i32 4, ptr %P
+ store i32 6, ptr %Q
ret i64 undef
}
-define internal i64* @Dfunc(i32* %P, i32* %Q) {
+define internal ptr @Dfunc(ptr %P, ptr %Q) {
; MERGE-NOT: @Dfunc
- store i32 4, i32* %P
- store i32 6, i32* %Q
- ret i64* undef
+ store i32 4, ptr %P
+ store i32 6, ptr %Q
+ ret ptr undef
}
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
-; ALIAS: @_Z9simple_vaPKcz = unnamed_addr alias void (i8*, ...), void (i8*, ...)* @_Z10simple_va2PKcz
+; ALIAS: @_Z9simple_vaPKcz = unnamed_addr alias void (ptr, ...), ptr @_Z10simple_va2PKcz
; ALIAS-NOT: @_Z9simple_vaPKcz
-%struct.__va_list_tag = type { i32, i32, i8*, i8* }
+%struct.__va_list_tag = type { i32, i32, ptr, ptr }
; CHECK-LABEL: define {{.*}}@_Z9simple_vaPKcz
; CHECK: call void @llvm.va_start
; CHECK: call void @llvm.va_end
-define dso_local void @_Z9simple_vaPKcz(i8* nocapture readnone, ...) unnamed_addr {
+define dso_local void @_Z9simple_vaPKcz(ptr nocapture readnone, ...) unnamed_addr {
%2 = alloca [1 x %struct.__va_list_tag], align 16
- %3 = bitcast [1 x %struct.__va_list_tag]* %2 to i8*
- call void @llvm.va_start(i8* nonnull %3)
- %4 = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %2, i64 0, i64 0, i32 0
- %5 = load i32, i32* %4, align 16
- %6 = icmp ult i32 %5, 41
- br i1 %6, label %7, label %13
+ call void @llvm.va_start(ptr nonnull %2)
+ %3 = load i32, ptr %2, align 16
+ %4 = icmp ult i32 %3, 41
+ br i1 %4, label %5, label %11
; <label>:7: ; preds = %1
- %8 = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %2, i64 0, i64 0, i32 3
- %9 = load i8*, i8** %8, align 16
- %10 = sext i32 %5 to i64
- %11 = getelementptr i8, i8* %9, i64 %10
- %12 = add i32 %5, 8
- store i32 %12, i32* %4, align 16
- br label %17
+ %6 = getelementptr inbounds [1 x %struct.__va_list_tag], ptr %2, i64 0, i64 0, i32 3
+ %7 = load ptr, ptr %6, align 16
+ %8 = sext i32 %3 to i64
+ %9 = getelementptr i8, ptr %7, i64 %8
+ %10 = add i32 %3, 8
+ store i32 %10, ptr %2, align 16
+ br label %15
; <label>:13: ; preds = %1
- %14 = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %2, i64 0, i64 0, i32 2
- %15 = load i8*, i8** %14, align 8
- %16 = getelementptr i8, i8* %15, i64 8
- store i8* %16, i8** %14, align 8
- br label %17
+ %12 = getelementptr inbounds [1 x %struct.__va_list_tag], ptr %2, i64 0, i64 0, i32 2
+ %13 = load ptr, ptr %12, align 8
+ %14 = getelementptr i8, ptr %13, i64 8
+ store ptr %14, ptr %12, align 8
+ br label %15
-; <label>:17: ; preds = %13, %7
- %18 = phi i8* [ %11, %7 ], [ %15, %13 ]
- %19 = bitcast i8* %18 to i32*
- %20 = load i32, i32* %19, align 4
- call void @_Z6escapei(i32 %20)
- call void @llvm.va_end(i8* nonnull %3)
+; <label>:17: ; preds = %11, %5
+ %16 = phi ptr [ %9, %5 ], [ %13, %11 ]
+ %17 = load i32, ptr %16, align 4
+ call void @_Z6escapei(i32 %17)
+ call void @llvm.va_end(ptr nonnull %2)
ret void
}
; Function Attrs: nounwind
-declare void @llvm.va_start(i8*)
+declare void @llvm.va_start(ptr)
; Function Attrs: minsize optsize
declare dso_local void @_Z6escapei(i32) local_unnamed_addr
; Function Attrs: nounwind
-declare void @llvm.va_end(i8*)
+declare void @llvm.va_end(ptr)
; CHECK-LABEL: define {{.*}}@_Z10simple_va2PKcz
; CHECK: call void @llvm.va_start
; CHECK: call void @llvm.va_end
-define dso_local void @_Z10simple_va2PKcz(i8* nocapture readnone, ...) unnamed_addr {
+define dso_local void @_Z10simple_va2PKcz(ptr nocapture readnone, ...) unnamed_addr {
%2 = alloca [1 x %struct.__va_list_tag], align 16
- %3 = bitcast [1 x %struct.__va_list_tag]* %2 to i8*
- call void @llvm.va_start(i8* nonnull %3)
- %4 = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %2, i64 0, i64 0, i32 0
- %5 = load i32, i32* %4, align 16
- %6 = icmp ult i32 %5, 41
- br i1 %6, label %7, label %13
+ call void @llvm.va_start(ptr nonnull %2)
+ %3 = load i32, ptr %2, align 16
+ %4 = icmp ult i32 %3, 41
+ br i1 %4, label %5, label %11
; <label>:7: ; preds = %1
- %8 = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %2, i64 0, i64 0, i32 3
- %9 = load i8*, i8** %8, align 16
- %10 = sext i32 %5 to i64
- %11 = getelementptr i8, i8* %9, i64 %10
- %12 = add i32 %5, 8
- store i32 %12, i32* %4, align 16
- br label %17
+ %6 = getelementptr inbounds [1 x %struct.__va_list_tag], ptr %2, i64 0, i64 0, i32 3
+ %7 = load ptr, ptr %6, align 16
+ %8 = sext i32 %3 to i64
+ %9 = getelementptr i8, ptr %7, i64 %8
+ %10 = add i32 %3, 8
+ store i32 %10, ptr %2, align 16
+ br label %15
; <label>:13: ; preds = %1
- %14 = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %2, i64 0, i64 0, i32 2
- %15 = load i8*, i8** %14, align 8
- %16 = getelementptr i8, i8* %15, i64 8
- store i8* %16, i8** %14, align 8
- br label %17
+ %12 = getelementptr inbounds [1 x %struct.__va_list_tag], ptr %2, i64 0, i64 0, i32 2
+ %13 = load ptr, ptr %12, align 8
+ %14 = getelementptr i8, ptr %13, i64 8
+ store ptr %14, ptr %12, align 8
+ br label %15
-; <label>:17: ; preds = %13, %7
- %18 = phi i8* [ %11, %7 ], [ %15, %13 ]
- %19 = bitcast i8* %18 to i32*
- %20 = load i32, i32* %19, align 4
- call void @_Z6escapei(i32 %20)
- call void @llvm.va_end(i8* nonnull %3)
+; <label>:17: ; preds = %11, %5
+ %16 = phi ptr [ %9, %5 ], [ %13, %11 ]
+ %17 = load i32, ptr %16, align 4
+ call void @_Z6escapei(i32 %17)
+ call void @llvm.va_end(ptr nonnull %2)
ret void
}
; RUN: opt -passes=mergefunc -disable-output < %s
; This used to cause a crash when compairing the GEPs
-define void @foo(<2 x i64*>) {
- %tmp = getelementptr i64, <2 x i64*> %0, <2 x i64> <i64 0, i64 0>
+define void @foo(<2 x ptr>) {
+ %tmp = getelementptr i64, <2 x ptr> %0, <2 x i64> <i64 0, i64 0>
ret void
}
-define void @bar(<2 x i64*>) {
- %tmp = getelementptr i64, <2 x i64*> %0, <2 x i64> <i64 0, i64 0>
+define void @bar(<2 x ptr>) {
+ %tmp = getelementptr i64, <2 x ptr> %0, <2 x i64> <i64 0, i64 0>
ret void
}
; This test is checks whether we can merge
; vector<intptr_t>::push_back(0)
; and
-; vector<void *>::push_back(0)
+; vector<ptr>::push_back(0)
; .
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"
-%0 = type { i32, void ()*, i8* }
+%0 = type { i32, ptr, ptr }
%1 = type { i64, i1 }
%"class.std::vector" = type { [24 x i8] }
@vi = global %"class.std::vector" zeroinitializer, align 8
-@__dso_handle = external unnamed_addr global i8*
+@__dso_handle = external unnamed_addr global ptr
@vp = global %"class.std::vector" zeroinitializer, align 8
-@llvm.global_ctors = appending global [1 x %0] [%0 { i32 65535, void ()* @_GLOBAL__I_a, i8* null }]
+@llvm.global_ctors = appending global [1 x %0] [%0 { i32 65535, ptr @_GLOBAL__I_a, ptr null }]
-define linkonce_odr void @_ZNSt6vectorIlSaIlEED1Ev(%"class.std::vector"* nocapture %this) unnamed_addr align 2 {
+define linkonce_odr void @_ZNSt6vectorIlSaIlEED1Ev(ptr nocapture %this) unnamed_addr align 2 {
entry:
- %tmp2.i.i = bitcast %"class.std::vector"* %this to i64**
- %tmp3.i.i = load i64*, i64** %tmp2.i.i, align 8
- %tobool.i.i.i = icmp eq i64* %tmp3.i.i, null
+ %tmp3.i.i = load ptr, ptr %this, align 8
+ %tobool.i.i.i = icmp eq ptr %tmp3.i.i, null
br i1 %tobool.i.i.i, label %_ZNSt6vectorIlSaIlEED2Ev.exit, label %if.then.i.i.i
if.then.i.i.i: ; preds = %entry
- %0 = bitcast i64* %tmp3.i.i to i8*
- tail call void @_ZdlPv(i8* %0) nounwind
+ tail call void @_ZdlPv(ptr %tmp3.i.i) nounwind
ret void
_ZNSt6vectorIlSaIlEED2Ev.exit: ; preds = %entry
ret void
}
-declare i32 @__cxa_atexit(void (i8*)*, i8*, i8*)
+declare i32 @__cxa_atexit(ptr, ptr, ptr)
-define linkonce_odr void @_ZNSt6vectorIPvSaIS0_EED1Ev(%"class.std::vector"* nocapture %this) unnamed_addr align 2 {
+define linkonce_odr void @_ZNSt6vectorIPvSaIS0_EED1Ev(ptr nocapture %this) unnamed_addr align 2 {
entry:
- %tmp2.i.i = bitcast %"class.std::vector"* %this to i8***
- %tmp3.i.i = load i8**, i8*** %tmp2.i.i, align 8
- %tobool.i.i.i = icmp eq i8** %tmp3.i.i, null
+ %tmp3.i.i = load ptr, ptr %this, align 8
+ %tobool.i.i.i = icmp eq ptr %tmp3.i.i, null
br i1 %tobool.i.i.i, label %_ZNSt6vectorIPvSaIS0_EED2Ev.exit, label %if.then.i.i.i
if.then.i.i.i: ; preds = %entry
- %0 = bitcast i8** %tmp3.i.i to i8*
- tail call void @_ZdlPv(i8* %0) nounwind
+ tail call void @_ZdlPv(ptr %tmp3.i.i) nounwind
ret void
_ZNSt6vectorIPvSaIS0_EED2Ev.exit: ; preds = %entry
declare void @_Z1fv()
-declare void @_ZNSt6vectorIPvSaIS0_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS0_S2_EERKS0_(%"class.std::vector"* nocapture %this, i8** %__position.coerce, i8** nocapture %__x) align 2
+declare void @_ZNSt6vectorIPvSaIS0_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS0_S2_EERKS0_(ptr nocapture %this, ptr %__position.coerce, ptr nocapture %__x) align 2
-declare void @_ZdlPv(i8*) nounwind
+declare void @_ZdlPv(ptr) nounwind
-declare void @llvm.memmove.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
+declare void @llvm.memmove.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind
declare void @_ZSt17__throw_bad_allocv() noreturn
-declare noalias i8* @_Znwm(i64)
+declare noalias ptr @_Znwm(i64)
-declare void @_ZNSt6vectorIlSaIlEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPlS1_EERKl(%"class.std::vector"* nocapture %this, i64* %__position.coerce, i64* nocapture %__x) align 2
+declare void @_ZNSt6vectorIlSaIlEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPlS1_EERKl(ptr nocapture %this, ptr %__position.coerce, ptr nocapture %__x) align 2
declare void @_GLOBAL__I_a()
-declare %1 @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone
+declare %0 @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone
; Weak functions too small for merging to be profitable
-; CHECK: define weak i32 @foo(i8* %0, i32 %1)
+; CHECK: define weak i32 @foo(ptr %0, i32 %1)
; CHECK-NEXT: ret i32 %1
-; CHECK: define weak i32 @bar(i8* %0, i32 %1)
+; CHECK: define weak i32 @bar(ptr %0, i32 %1)
; CHECK-NEXT: ret i32 %1
-define weak i32 @foo(i8* %0, i32 %1) #0 {
+define weak i32 @foo(ptr %0, i32 %1) #0 {
ret i32 %1
}
-define weak i32 @bar(i8* %0, i32 %1) #0 {
+define weak i32 @bar(ptr %0, i32 %1) #0 {
ret i32 %1
}