brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.0 KiB · e9979fe Raw
175 lines · plain
1// RUN: %clang_cc1 -std=c2y -triple x86_64-apple-darwin -Wno-objc-root-class -emit-llvm -o - %s | FileCheck %s2 3int g(id x);4 5// CHECK-LABEL: define void @f1(ptr {{.*}} %y)6// CHECK: entry:7// CHECK:   %y.addr = alloca ptr, align 88// CHECK:   %x1 = alloca ptr, align 89// CHECK:   %state.ptr = alloca %struct.__objcFastEnumerationState, align 810// CHECK:   %items.ptr = alloca [16 x ptr], align 811// CHECK:   store ptr %y, ptr %y.addr, align 812// CHECK:   br label %x13// CHECK: x:14// CHECK:   call void @llvm.memset.p0.i64(ptr align 8 %state.ptr, i8 0, i64 64, i1 false)15// CHECK:   %0 = load ptr, ptr %y.addr, align 816// CHECK:   %1 = load ptr, ptr @OBJC_SELECTOR_REFERENCES_, align 817// CHECK:   %call = call i64 @objc_msgSend(ptr {{.*}} %0, ptr {{.*}} %1, ptr {{.*}} %state.ptr, ptr {{.*}} %items.ptr, i64 {{.*}} 16)18// CHECK:   %iszero = icmp eq i64 %call, 019// CHECK:   br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit20// CHECK: forcoll.loopinit:21// CHECK:   %mutationsptr.ptr = getelementptr inbounds nuw %struct.__objcFastEnumerationState, ptr %state.ptr, i32 0, i32 222// CHECK:   %mutationsptr = load ptr, ptr %mutationsptr.ptr, align 823// CHECK:   %forcoll.initial-mutations = load i64, ptr %mutationsptr, align 824// CHECK:   br label %forcoll.loopbody25// CHECK: forcoll.loopbody:26// CHECK:   %forcoll.index = phi i64 [ 0, %forcoll.loopinit ], [ %6, %forcoll.next ], [ 0, %forcoll.refetch ]27// CHECK:   %forcoll.count = phi i64 [ %call, %forcoll.loopinit ], [ %forcoll.count, %forcoll.next ], [ %call8, %forcoll.refetch ]28// CHECK:   %mutationsptr2 = load ptr, ptr %mutationsptr.ptr, align 829// CHECK:   %statemutations = load i64, ptr %mutationsptr2, align 830// CHECK:   %2 = icmp eq i64 %statemutations, %forcoll.initial-mutations31// CHECK:   br i1 %2, label %forcoll.notmutated, label %forcoll.mutated32// CHECK: forcoll.mutated:33// CHECK:   call void @objc_enumerationMutation(ptr {{.*}} %0)34// CHECK:   br label %forcoll.notmutated35// CHECK: forcoll.notmutated:36// CHECK:   %stateitems.ptr = getelementptr inbounds nuw %struct.__objcFastEnumerationState, ptr %state.ptr, i32 0, i32 137// CHECK:   %stateitems = load ptr, ptr %stateitems.ptr, align 838// CHECK:   %currentitem.ptr = getelementptr inbounds ptr, ptr %stateitems, i64 %forcoll.index39// CHECK:   %3 = load ptr, ptr %currentitem.ptr, align 840// CHECK:   store ptr %3, ptr %x1, align 841// CHECK:   %4 = load ptr, ptr %x1, align 842// CHECK:   %call3 = call i32 @g(ptr {{.*}} %4)43// CHECK:   %tobool = icmp ne i32 %call3, 044// CHECK:   br i1 %tobool, label %if.then, label %if.end45// CHECK: if.then:46// CHECK:   br label %forcoll.end47// CHECK: if.end:48// CHECK:   %5 = load ptr, ptr %x1, align 849// CHECK:   %call4 = call i32 @g(ptr {{.*}} %5)50// CHECK:   %tobool5 = icmp ne i32 %call4, 051// CHECK:   br i1 %tobool5, label %if.then6, label %if.end752// CHECK: if.then6:53// CHECK:   br label %forcoll.next54// CHECK: if.end7:55// CHECK:   br label %forcoll.next56// CHECK: forcoll.next:57// CHECK:   %6 = add nuw i64 %forcoll.index, 158// CHECK:   %7 = icmp ult i64 %6, %forcoll.count59// CHECK:   br i1 %7, label %forcoll.loopbody, label %forcoll.refetch60// CHECK: forcoll.refetch:61// CHECK:   %8 = load ptr, ptr @OBJC_SELECTOR_REFERENCES_, align 862// CHECK:   %call8 = call i64 @objc_msgSend(ptr {{.*}} %0, ptr {{.*}} %8, ptr {{.*}} %state.ptr, ptr {{.*}} %items.ptr, i64 {{.*}} 16)63// CHECK:   %9 = icmp eq i64 %call8, 064// CHECK:   br i1 %9, label %forcoll.empty, label %forcoll.loopbody65// CHECK: forcoll.empty:66// CHECK:   br label %forcoll.end67// CHECK: forcoll.end:68// CHECK:   ret void69void f1(id y) {70  x: for (id x in y) {71    if (g(x)) break x;72    if (g(x)) continue x;73  }74}75 76// CHECK-LABEL: define void @f2(ptr {{.*}} %y)77// CHECK: entry:78// CHECK:   %y.addr = alloca ptr, align 879// CHECK:   %x = alloca ptr, align 880// CHECK:   %state.ptr = alloca %struct.__objcFastEnumerationState, align 881// CHECK:   %items.ptr = alloca [16 x ptr], align 882// CHECK:   store ptr %y, ptr %y.addr, align 883// CHECK:   br label %a84// CHECK: a:85// CHECK:   br label %while.cond86// CHECK: while.cond:87// CHECK:   %0 = load ptr, ptr %y.addr, align 888// CHECK:   %call = call i32 @g(ptr {{.*}} %0)89// CHECK:   %tobool = icmp ne i32 %call, 090// CHECK:   br i1 %tobool, label %while.body, label %while.end91// CHECK: while.body:92// CHECK:   br label %b93// CHECK: b:94// CHECK:   call void @llvm.memset.p0.i64(ptr align 8 %state.ptr, i8 0, i64 64, i1 false)95// CHECK:   %1 = load ptr, ptr %y.addr, align 896// CHECK:   %2 = load ptr, ptr @OBJC_SELECTOR_REFERENCES_, align 897// CHECK:   %call1 = call i64 @objc_msgSend(ptr {{.*}} %1, ptr {{.*}} %2, ptr {{.*}} %state.ptr, ptr {{.*}} %items.ptr, i64 {{.*}} 16)98// CHECK:   %iszero = icmp eq i64 %call1, 099// CHECK:   br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit100// CHECK: forcoll.loopinit:101// CHECK:   %mutationsptr.ptr = getelementptr inbounds nuw %struct.__objcFastEnumerationState, ptr %state.ptr, i32 0, i32 2102// CHECK:   %mutationsptr = load ptr, ptr %mutationsptr.ptr, align 8103// CHECK:   %forcoll.initial-mutations = load i64, ptr %mutationsptr, align 8104// CHECK:   br label %forcoll.loopbody105// CHECK: forcoll.loopbody:106// CHECK:   %forcoll.index = phi i64 [ 0, %forcoll.loopinit ], [ %9, %forcoll.next ], [ 0, %forcoll.refetch ]107// CHECK:   %forcoll.count = phi i64 [ %call1, %forcoll.loopinit ], [ %forcoll.count, %forcoll.next ], [ %call17, %forcoll.refetch ]108// CHECK:   %mutationsptr2 = load ptr, ptr %mutationsptr.ptr, align 8109// CHECK:   %statemutations = load i64, ptr %mutationsptr2, align 8110// CHECK:   %3 = icmp eq i64 %statemutations, %forcoll.initial-mutations111// CHECK:   br i1 %3, label %forcoll.notmutated, label %forcoll.mutated112// CHECK: forcoll.mutated:113// CHECK:   call void @objc_enumerationMutation(ptr {{.*}} %1)114// CHECK:   br label %forcoll.notmutated115// CHECK: forcoll.notmutated:116// CHECK:   %stateitems.ptr = getelementptr inbounds nuw %struct.__objcFastEnumerationState, ptr %state.ptr, i32 0, i32 1117// CHECK:   %stateitems = load ptr, ptr %stateitems.ptr, align 8118// CHECK:   %currentitem.ptr = getelementptr inbounds ptr, ptr %stateitems, i64 %forcoll.index119// CHECK:   %4 = load ptr, ptr %currentitem.ptr, align 8120// CHECK:   store ptr %4, ptr %x, align 8121// CHECK:   %5 = load ptr, ptr %x, align 8122// CHECK:   %call3 = call i32 @g(ptr {{.*}} %5)123// CHECK:   %tobool4 = icmp ne i32 %call3, 0124// CHECK:   br i1 %tobool4, label %if.then, label %if.end125// CHECK: if.then:126// CHECK:   br label %while.end127// CHECK: if.end:128// CHECK:   %6 = load ptr, ptr %x, align 8129// CHECK:   %call5 = call i32 @g(ptr {{.*}} %6)130// CHECK:   %tobool6 = icmp ne i32 %call5, 0131// CHECK:   br i1 %tobool6, label %if.then7, label %if.end8132// CHECK: if.then7:133// CHECK:   br label %while.cond134// CHECK: if.end8:135// CHECK:   %7 = load ptr, ptr %x, align 8136// CHECK:   %call9 = call i32 @g(ptr {{.*}} %7)137// CHECK:   %tobool10 = icmp ne i32 %call9, 0138// CHECK:   br i1 %tobool10, label %if.then11, label %if.end12139// CHECK: if.then11:140// CHECK:   br label %forcoll.end141// CHECK: if.end12:142// CHECK:   %8 = load ptr, ptr %x, align 8143// CHECK:   %call13 = call i32 @g(ptr {{.*}} %8)144// CHECK:   %tobool14 = icmp ne i32 %call13, 0145// CHECK:   br i1 %tobool14, label %if.then15, label %if.end16146// CHECK: if.then15:147// CHECK:   br label %forcoll.next148// CHECK: if.end16:149// CHECK:   br label %forcoll.next150// CHECK: forcoll.next:151// CHECK:   %9 = add nuw i64 %forcoll.index, 1152// CHECK:   %10 = icmp ult i64 %9, %forcoll.count153// CHECK:   br i1 %10, label %forcoll.loopbody, label %forcoll.refetch154// CHECK: forcoll.refetch:155// CHECK:   %11 = load ptr, ptr @OBJC_SELECTOR_REFERENCES_, align 8156// CHECK:   %call17 = call i64 @objc_msgSend(ptr {{.*}} %1, ptr {{.*}} %11, ptr {{.*}} %state.ptr, ptr {{.*}} %items.ptr, i64 {{.*}} 16)157// CHECK:   %12 = icmp eq i64 %call17, 0158// CHECK:   br i1 %12, label %forcoll.empty, label %forcoll.loopbody159// CHECK: forcoll.empty:160// CHECK:   br label %forcoll.end161// CHECK: forcoll.end:162// CHECK:   br label %while.cond163// CHECK: while.end:164// CHECK:   ret void165void f2(id y) {166  a: while (g(y)) {167    b: for (id x in y) {168      if (g(x)) break a;169      if (g(x)) continue a;170      if (g(x)) break b;171      if (g(x)) continue b;172    }173  }174}175