1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2; RUN: opt -S -passes=gvn < %s | FileCheck %s 3 4declare i32 @setjmp() returns_twice 5declare void @longjmp() 6declare ptr @malloc(i64) 7 8define i32 @test() { 9; CHECK-LABEL: define i32 @test() { 10; CHECK-NEXT: [[MALLOC:%.*]] = call noalias ptr @malloc(i64 4) 11; CHECK-NEXT: store i32 10, ptr [[MALLOC]], align 4 12; CHECK-NEXT: [[SJ:%.*]] = call i32 @setjmp() 13; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[SJ]], 0 14; CHECK-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_END:.*]] 15; CHECK: [[IF_THEN]]: 16; CHECK-NEXT: store i32 20, ptr [[MALLOC]], align 4 17; CHECK-NEXT: call void @longjmp() 18; CHECK-NEXT: unreachable 19; CHECK: [[IF_END]]: 20; CHECK-NEXT: [[RES:%.*]] = load i32, ptr [[MALLOC]], align 4 21; CHECK-NEXT: ret i32 [[RES]] 22; 23 %malloc = call noalias ptr @malloc(i64 4) 24 store i32 10, ptr %malloc, align 4 25 %sj = call i32 @setjmp() 26 %cmp = icmp eq i32 %sj, 0 27 br i1 %cmp, label %if.then, label %if.end 28 29if.then: 30 store i32 20, ptr %malloc 31 call void @longjmp() 32 unreachable 33 34if.end: 35 %res = load i32, ptr %malloc 36 ret i32 %res 37} 38 39; We are still allowed to optimize non-volatile accesses to allocas. 40define i32 @test_alloca() { 41; CHECK-LABEL: define i32 @test_alloca() { 42; CHECK-NEXT: [[ALLOC:%.*]] = alloca i43, align 8 43; CHECK-NEXT: store i32 10, ptr [[ALLOC]], align 4 44; CHECK-NEXT: [[SJ:%.*]] = call i32 @setjmp() 45; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[SJ]], 0 46; CHECK-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_END:.*]] 47; CHECK: [[IF_THEN]]: 48; CHECK-NEXT: store i32 20, ptr [[ALLOC]], align 4 49; CHECK-NEXT: call void @longjmp() 50; CHECK-NEXT: unreachable 51; CHECK: [[IF_END]]: 52; CHECK-NEXT: ret i32 10 53; 54 %alloc = alloca i43 55 store i32 10, ptr %alloc, align 4 56 %sj = call i32 @setjmp() 57 %cmp = icmp eq i32 %sj, 0 58 br i1 %cmp, label %if.then, label %if.end 59 60if.then: 61 store i32 20, ptr %alloc 62 call void @longjmp() 63 unreachable 64 65if.end: 66 %res = load i32, ptr %alloc 67 ret i32 %res 68} 69 70define i32 @test_alloca_volatile() { 71; CHECK-LABEL: define i32 @test_alloca_volatile() { 72; CHECK-NEXT: [[ALLOC:%.*]] = alloca i43, align 8 73; CHECK-NEXT: store volatile i32 10, ptr [[ALLOC]], align 4 74; CHECK-NEXT: [[SJ:%.*]] = call i32 @setjmp() 75; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[SJ]], 0 76; CHECK-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_END:.*]] 77; CHECK: [[IF_THEN]]: 78; CHECK-NEXT: store volatile i32 20, ptr [[ALLOC]], align 4 79; CHECK-NEXT: call void @longjmp() 80; CHECK-NEXT: unreachable 81; CHECK: [[IF_END]]: 82; CHECK-NEXT: [[RES:%.*]] = load volatile i32, ptr [[ALLOC]], align 4 83; CHECK-NEXT: ret i32 [[RES]] 84; 85 %alloc = alloca i43 86 store volatile i32 10, ptr %alloc, align 4 87 %sj = call i32 @setjmp() 88 %cmp = icmp eq i32 %sj, 0 89 br i1 %cmp, label %if.then, label %if.end 90 91if.then: 92 store volatile i32 20, ptr %alloc 93 call void @longjmp() 94 unreachable 95 96if.end: 97 %res = load volatile i32, ptr %alloc 98 ret i32 %res 99} 100