1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=ipsccp -S | FileCheck %s 3 4%0 = type { i32, i32 } 5 6define internal %0 @foo(i1 %Q) { 7; CHECK-LABEL: @foo( 8; CHECK-NEXT: br i1 [[Q:%.*]], label [[T:%.*]], label [[F:%.*]] 9; CHECK: T: 10; CHECK-NEXT: ret [[TMP0:%.*]] { i32 21, i32 22 } 11; CHECK: F: 12; CHECK-NEXT: ret [[TMP0]] { i32 21, i32 23 } 13; 14 br i1 %Q, label %T, label %F 15 16T: ; preds = %0 17 %mrv = insertvalue %0 undef, i32 21, 0 18 %mrv1 = insertvalue %0 %mrv, i32 22, 1 19 ret %0 %mrv1 20 21F: ; preds = %0 22 %mrv2 = insertvalue %0 undef, i32 21, 0 23 %mrv3 = insertvalue %0 %mrv2, i32 23, 1 24 ret %0 %mrv3 25} 26 27define internal %0 @bar(i1 %Q) { 28; CHECK-LABEL: @bar( 29; CHECK-NEXT: br i1 [[Q:%.*]], label [[T:%.*]], label [[F:%.*]] 30; CHECK: T: 31; CHECK-NEXT: ret [[TMP0:%.*]] { i32 21, i32 22 } 32; CHECK: F: 33; CHECK-NEXT: ret [[TMP0]] { i32 21, i32 23 } 34; 35 %A = insertvalue %0 undef, i32 21, 0 36 br i1 %Q, label %T, label %F 37 38T: ; preds = %0 39 %B = insertvalue %0 %A, i32 22, 1 40 ret %0 %B 41 42F: ; preds = %0 43 %C = insertvalue %0 %A, i32 23, 1 44 ret %0 %C 45} 46 47define %0 @caller(i1 %Q) { 48; CHECK-LABEL: @caller( 49; CHECK-NEXT: [[X:%.*]] = call [[TMP0:%.*]] @foo(i1 [[Q:%.*]]) 50; CHECK-NEXT: [[B:%.*]] = extractvalue [[TMP0]] [[X]], 1 51; CHECK-NEXT: [[Y:%.*]] = call [[TMP0]] @bar(i1 [[Q]]) 52; CHECK-NEXT: [[D:%.*]] = extractvalue [[TMP0]] [[Y]], 1 53; CHECK-NEXT: [[N:%.*]] = add nuw nsw i32 [[B]], [[D]] 54; CHECK-NEXT: ret [[TMP0]] [[X]] 55; 56 %X = call %0 @foo(i1 %Q) 57 %A = extractvalue %0 %X, 0 58 %B = extractvalue %0 %X, 1 59 %Y = call %0 @bar(i1 %Q) 60 %C = extractvalue %0 %Y, 0 61 %D = extractvalue %0 %Y, 1 62 %M = add i32 %A, %C 63 %N = add i32 %B, %D 64 ret %0 %X 65} 66