Files
c3c/test/test_suite/subarrays/slice_comparison.c3t
Christoffer Lerno e293c435af 0.6.0: init_new/init_temp removed. LinkedList API rewritten. List "pop" and "remove" function now return Optionals. RingBuffer API rewritten. Allocator interface changed. Deprecated Allocator, DString and mem functions removed. "identity" functions are now constants for Matrix and Complex numbers. @default implementations for interfaces removed. any* => any, same for interfaces. Emit local/private globals as "private" in LLVM, following C "static". Updated enum syntax. Add support [rgba] properties in vectors. Improved checks of aliased "void". Subarray -> slice. Fix of llvm codegen enum check. Improved alignment handling. Add --output-dir #1155. Removed List/Object append. GenericList renamed AnyList. Remove unused "unwrap". Fixes to cond. Optimize output in dead branches. Better checking of operator methods. Disallow any from implementing dynamic methods. Check for operator mismatch. Remove unnecessary bitfield. Remove numbering in --list* commands Old style enum declaration for params/type, but now the type is optional. Add note on #1086. Allow making distinct types out of "void", "typeid", "anyfault" and faults. Remove system linker build options. "Try" expressions must be simple expressions. Add optimized build to Mac tests. Register int. assert(false) only allowed in unused branches or in tests. Compile time failed asserts is a compile time error. Remove current_block_is_target. Bug when assigning an optional from an optional. Remove unused emit_zstring. Simplify phi code. Remove unnecessary unreachable blocks and remove unnecessary current_block NULL assignments. Proper handling of '.' and Win32 '//server' paths. Add "no discard" to expression blocks with a return value. Detect "unsigned >= 0" as errors. Fix issue with distinct void as a member #1147. Improve callstack debug information #1184. Fix issue with absolute output-dir paths. Lambdas were not type checked thoroughly #1185. Fix compilation warning #1187. Request jump table using @jump for switches. Path normalization - fix possible null terminator out of bounds. Improved error messages on inlined macros.
Upgrade of mingw in CI. Fix problems using reflection on interface types #1203. Improved debug information on defer. $foreach doesn't create an implicit syntactic scope.
Error if `@if` depends on `@if`. Updated Linux stacktrace. Fix of default argument stacktrace. Allow linking libraries directly by file path. Improve inlining warning messages. Added `index_of_char_from`. Compiler crash using enum nameof from different module #1205. Removed unused fields in find_msvc. Use vswhere to find msvc. Update tests for LLVM 19
2024-06-12 10:14:26 +02:00

233 lines
9.0 KiB
C

// #target: macos-x64
module mymodule;
extern fn void printf(char *, ...);
fn void main()
{
char[] y = "hodo";
char[] z = "hodo";
if (y == "hodo")
{
printf("This works\n");
}
if (y == z)
{
printf("This works too\n");
}
switch (y)
{
case "mixx":
printf("Wut\n");
case "hodot":
printf("Nope\n");
case "hodo":
printf("Winning!\n");
default:
printf("Hodohell\n");
}
}
/* #expect: mymodule.ll
define void @mymodule.main() #0 {
entry:
%y = alloca %"char[]", align 8
%z = alloca %"char[]", align 8
%cmp.idx = alloca i64, align 8
%cmp.idx5 = alloca i64, align 8
%switch = alloca %"char[]", align 8
%cmp.idx18 = alloca i64, align 8
%cmp.idx29 = alloca i64, align 8
%cmp.idx42 = alloca i64, align 8
store %"char[]" { ptr @.str, i64 4 }, ptr %y, align 8
store %"char[]" { ptr @.str.1, i64 4 }, ptr %z, align 8
%0 = load %"char[]", ptr %y, align 8
%1 = extractvalue %"char[]" %0, 1
%2 = extractvalue %"char[]" %0, 0
%eq = icmp eq i64 %1, 4
br i1 %eq, label %slice_cmp_values, label %slice_cmp_exit
slice_cmp_values: ; preds = %entry
store i64 0, ptr %cmp.idx, align 8
br label %slice_loop_start
slice_loop_start: ; preds = %slice_loop_comparison, %slice_cmp_values
%3 = load i64, ptr %cmp.idx, align 8
%lt = icmp ult i64 %3, %1
br i1 %lt, label %slice_loop_comparison, label %slice_cmp_exit
slice_loop_comparison: ; preds = %slice_loop_start
%ptradd = getelementptr inbounds i8, ptr %2, i64 %3
%ptradd1 = getelementptr inbounds i8, ptr @.str.2, i64 %3
%4 = load i8, ptr %ptradd, align 1
%5 = load i8, ptr %ptradd1, align 1
%eq2 = icmp eq i8 %4, %5
%6 = add i64 %3, 1
store i64 %6, ptr %cmp.idx, align 8
br i1 %eq2, label %slice_loop_start, label %slice_cmp_exit
slice_cmp_exit: ; preds = %slice_loop_comparison, %slice_loop_start, %entry
%slice_cmp_phi = phi i1 [ true, %slice_loop_start ], [ false, %entry ], [ false, %slice_loop_comparison ]
br i1 %slice_cmp_phi, label %if.then, label %if.exit
if.then: ; preds = %slice_cmp_exit
call void (ptr, ...) @printf(ptr @.str.3)
br label %if.exit
if.exit: ; preds = %if.then, %slice_cmp_exit
%7 = load %"char[]", ptr %y, align 8
%8 = load %"char[]", ptr %z, align 8
%9 = extractvalue %"char[]" %7, 1
%10 = extractvalue %"char[]" %8, 1
%11 = extractvalue %"char[]" %7, 0
%12 = extractvalue %"char[]" %8, 0
%eq3 = icmp eq i64 %9, %10
br i1 %eq3, label %slice_cmp_values4, label %slice_cmp_exit12
slice_cmp_values4: ; preds = %if.exit
store i64 0, ptr %cmp.idx5, align 8
br label %slice_loop_start6
slice_loop_start6: ; preds = %slice_loop_comparison8, %slice_cmp_values4
%13 = load i64, ptr %cmp.idx5, align 8
%lt7 = icmp ult i64 %13, %9
br i1 %lt7, label %slice_loop_comparison8, label %slice_cmp_exit12
slice_loop_comparison8: ; preds = %slice_loop_start6
%ptradd9 = getelementptr inbounds i8, ptr %11, i64 %13
%ptradd10 = getelementptr inbounds i8, ptr %12, i64 %13
%14 = load i8, ptr %ptradd9, align 1
%15 = load i8, ptr %ptradd10, align 1
%eq11 = icmp eq i8 %14, %15
%16 = add i64 %13, 1
store i64 %16, ptr %cmp.idx5, align 8
br i1 %eq11, label %slice_loop_start6, label %slice_cmp_exit12
slice_cmp_exit12: ; preds = %slice_loop_comparison8, %slice_loop_start6, %if.exit
%slice_cmp_phi13 = phi i1 [ true, %slice_loop_start6 ], [ false, %if.exit ], [ false, %slice_loop_comparison8 ]
br i1 %slice_cmp_phi13, label %if.then14, label %if.exit15
if.then14: ; preds = %slice_cmp_exit12
call void (ptr, ...) @printf(ptr @.str.4)
br label %if.exit15
if.exit15: ; preds = %if.then14, %slice_cmp_exit12
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %switch, ptr align 8 %y, i32 16, i1 false)
br label %switch.entry
switch.entry: ; preds = %if.exit15
%17 = load %"char[]", ptr %switch, align 8
%18 = extractvalue %"char[]" %17, 1
%19 = extractvalue %"char[]" %17, 0
%eq16 = icmp eq i64 4, %18
br i1 %eq16, label %slice_cmp_values17, label %slice_cmp_exit25
slice_cmp_values17: ; preds = %switch.entry
store i64 0, ptr %cmp.idx18, align 8
br label %slice_loop_start19
slice_loop_start19: ; preds = %slice_loop_comparison21, %slice_cmp_values17
%20 = load i64, ptr %cmp.idx18, align 8
%lt20 = icmp ult i64 %20, 4
br i1 %lt20, label %slice_loop_comparison21, label %slice_cmp_exit25
slice_loop_comparison21: ; preds = %slice_loop_start19
%ptradd22 = getelementptr inbounds i8, ptr @.str.5, i64 %20
%ptradd23 = getelementptr inbounds i8, ptr %19, i64 %20
%21 = load i8, ptr %ptradd22, align 1
%22 = load i8, ptr %ptradd23, align 1
%eq24 = icmp eq i8 %21, %22
%23 = add i64 %20, 1
store i64 %23, ptr %cmp.idx18, align 8
br i1 %eq24, label %slice_loop_start19, label %slice_cmp_exit25
slice_cmp_exit25: ; preds = %slice_loop_comparison21, %slice_loop_start19, %switch.entry
%slice_cmp_phi26 = phi i1 [ true, %slice_loop_start19 ], [ false, %switch.entry ], [ false, %slice_loop_comparison21 ]
br i1 %slice_cmp_phi26, label %switch.case, label %next_if
switch.case: ; preds = %slice_cmp_exit25
call void (ptr, ...) @printf(ptr @.str.6)
br label %switch.exit
next_if: ; preds = %slice_cmp_exit25
%24 = extractvalue %"char[]" %17, 1
%25 = extractvalue %"char[]" %17, 0
%eq27 = icmp eq i64 5, %24
br i1 %eq27, label %slice_cmp_values28, label %slice_cmp_exit36
slice_cmp_values28: ; preds = %next_if
store i64 0, ptr %cmp.idx29, align 8
br label %slice_loop_start30
slice_loop_start30: ; preds = %slice_loop_comparison32, %slice_cmp_values28
%26 = load i64, ptr %cmp.idx29, align 8
%lt31 = icmp ult i64 %26, 5
br i1 %lt31, label %slice_loop_comparison32, label %slice_cmp_exit36
slice_loop_comparison32: ; preds = %slice_loop_start30
%ptradd33 = getelementptr inbounds i8, ptr @.str.7, i64 %26
%ptradd34 = getelementptr inbounds i8, ptr %25, i64 %26
%27 = load i8, ptr %ptradd33, align 1
%28 = load i8, ptr %ptradd34, align 1
%eq35 = icmp eq i8 %27, %28
%29 = add i64 %26, 1
store i64 %29, ptr %cmp.idx29, align 8
br i1 %eq35, label %slice_loop_start30, label %slice_cmp_exit36
slice_cmp_exit36: ; preds = %slice_loop_comparison32, %slice_loop_start30, %next_if
%slice_cmp_phi37 = phi i1 [ true, %slice_loop_start30 ], [ false, %next_if ], [ false, %slice_loop_comparison32 ]
br i1 %slice_cmp_phi37, label %switch.case38, label %next_if39
switch.case38: ; preds = %slice_cmp_exit36
call void (ptr, ...) @printf(ptr @.str.8)
br label %switch.exit
next_if39: ; preds = %slice_cmp_exit36
%30 = extractvalue %"char[]" %17, 1
%31 = extractvalue %"char[]" %17, 0
%eq40 = icmp eq i64 4, %30
br i1 %eq40, label %slice_cmp_values41, label %slice_cmp_exit49
slice_cmp_values41: ; preds = %next_if39
store i64 0, ptr %cmp.idx42, align 8
br label %slice_loop_start43
slice_loop_start43: ; preds = %slice_loop_comparison45, %slice_cmp_values41
%32 = load i64, ptr %cmp.idx42, align 8
%lt44 = icmp ult i64 %32, 4
br i1 %lt44, label %slice_loop_comparison45, label %slice_cmp_exit49
slice_loop_comparison45: ; preds = %slice_loop_start43
%ptradd46 = getelementptr inbounds i8, ptr @.str.9, i64 %32
%ptradd47 = getelementptr inbounds i8, ptr %31, i64 %32
%33 = load i8, ptr %ptradd46, align 1
%34 = load i8, ptr %ptradd47, align 1
%eq48 = icmp eq i8 %33, %34
%35 = add i64 %32, 1
store i64 %35, ptr %cmp.idx42, align 8
br i1 %eq48, label %slice_loop_start43, label %slice_cmp_exit49
slice_cmp_exit49: ; preds = %slice_loop_comparison45, %slice_loop_start43, %next_if39
%slice_cmp_phi50 = phi i1 [ true, %slice_loop_start43 ], [ false, %next_if39 ], [ false, %slice_loop_comparison45 ]
br i1 %slice_cmp_phi50, label %switch.case51, label %next_if52
switch.case51: ; preds = %slice_cmp_exit49
call void (ptr, ...) @printf(ptr @.str.10)
br label %switch.exit
next_if52: ; preds = %slice_cmp_exit49
br label %switch.default
switch.default: ; preds = %next_if52
call void (ptr, ...) @printf(ptr @.str.11)
br label %switch.exit
switch.exit: ; preds = %switch.default, %switch.case51, %switch.case38, %switch.case
ret void
}