1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes="default<O3>" -enable-merge-functions -S < %s | FileCheck %s 3 4; TODO: These two functions should get merged, but currently aren't, because 5; the function merging pass is scheduled too early. 6 7target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 8target triple = "x86_64-unknown-linux-gnu" 9 10define i1 @test1(i32 %c) { 11; CHECK-LABEL: @test1( 12; CHECK-NEXT: entry: 13; CHECK-NEXT: [[SWITCH_TABLEIDX:%.*]] = add i32 [[C:%.*]], -100 14; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i32 [[SWITCH_TABLEIDX]], 20 15; CHECK-NEXT: [[SWITCH_CAST:%.*]] = trunc i32 [[SWITCH_TABLEIDX]] to i20 16; CHECK-NEXT: [[SWITCH_DOWNSHIFT:%.*]] = lshr i20 -490991, [[SWITCH_CAST]] 17; CHECK-NEXT: [[SWITCH_MASKED:%.*]] = trunc i20 [[SWITCH_DOWNSHIFT]] to i1 18; CHECK-NEXT: [[I_0:%.*]] = select i1 [[TMP0]], i1 [[SWITCH_MASKED]], i1 false 19; CHECK-NEXT: ret i1 [[I_0]] 20; 21entry: 22 %_4 = alloca i8, align 1 23 %_3 = alloca i8, align 1 24 %_2 = alloca i8, align 1 25 %i = alloca i8, align 1 26 %i1 = icmp eq i32 %c, 115 27 br i1 %i1, label %bb10, label %bb11 28 29bb10: ; preds = %entry 30 store i8 1, ptr %_4, align 1 31 br label %bb12 32 33bb11: ; preds = %entry 34 %_6 = icmp eq i32 %c, 109 35 %i2 = zext i1 %_6 to i8 36 store i8 %i2, ptr %_4, align 1 37 br label %bb12 38 39bb12: ; preds = %bb11, %bb10 40 %i3 = load i8, ptr %_4, align 1 41 %i4 = trunc i8 %i3 to i1 42 br i1 %i4, label %bb7, label %bb8 43 44bb8: ; preds = %bb12 45 %_8 = icmp eq i32 %c, 104 46 %i5 = zext i1 %_8 to i8 47 store i8 %i5, ptr %_3, align 1 48 br label %bb9 49 50bb7: ; preds = %bb12 51 store i8 1, ptr %_3, align 1 52 br label %bb9 53 54bb9: ; preds = %bb7, %bb8 55 %i6 = load i8, ptr %_3, align 1 56 %i7 = trunc i8 %i6 to i1 57 br i1 %i7, label %bb4, label %bb5 58 59bb5: ; preds = %bb9 60 %_10 = icmp eq i32 %c, 100 61 %i8 = zext i1 %_10 to i8 62 store i8 %i8, ptr %_2, align 1 63 br label %bb6 64 65bb4: ; preds = %bb9 66 store i8 1, ptr %_2, align 1 67 br label %bb6 68 69bb6: ; preds = %bb4, %bb5 70 %i9 = load i8, ptr %_2, align 1 71 %i10 = trunc i8 %i9 to i1 72 br i1 %i10, label %bb1, label %bb2 73 74bb2: ; preds = %bb6 75 %_12 = icmp eq i32 %c, 119 76 %i11 = zext i1 %_12 to i8 77 store i8 %i11, ptr %i, align 1 78 br label %bb3 79 80bb1: ; preds = %bb6 81 store i8 1, ptr %i, align 1 82 br label %bb3 83 84bb3: ; preds = %bb1, %bb2 85 %i12 = load i8, ptr %i, align 1 86 %i13 = trunc i8 %i12 to i1 87 ret i1 %i13 88} 89 90define i1 @test2(i32 %c) { 91; CHECK-LABEL: @test2( 92; CHECK-NEXT: [[TMP2:%.*]] = tail call noundef i1 @test1(i32 [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] 93; CHECK-NEXT: ret i1 [[TMP2]] 94; 95entry: 96 %i = alloca i8, align 1 97 switch i32 %c, label %bb1 [ 98 i32 115, label %bb2 99 i32 109, label %bb2 100 i32 104, label %bb2 101 i32 100, label %bb2 102 i32 119, label %bb2 103 ] 104 105bb1: ; preds = %entry 106 store i8 0, ptr %i, align 1 107 br label %bb3 108 109bb2: ; preds = %entry, %entry, %entry, %entry, %entry 110 store i8 1, ptr %i, align 1 111 br label %bb3 112 113bb3: ; preds = %bb2, %bb1 114 %i1 = load i8, ptr %i, align 1 115 %i2 = trunc i8 %i1 to i1 116 ret i1 %i2 117} 118 119