1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s 3 4define i8 @noundef(i8 noundef %x) { 5; CHECK-LABEL: @noundef( 6; CHECK-NEXT: ret i8 [[X:%.*]] 7; 8 %y = freeze i8 %x 9 ret i8 %y 10} 11 12define i1 @icmp(i8 noundef %x, i8 noundef %y) { 13; CHECK-LABEL: @icmp( 14; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] 15; CHECK-NEXT: ret i1 [[C]] 16; 17 %c = icmp eq i8 %x, %y 18 %f = freeze i1 %c 19 ret i1 %f 20} 21 22define i1 @or(i1 noundef %x, i1 noundef %x2) { 23; CHECK-LABEL: @or( 24; CHECK-NEXT: [[Y:%.*]] = or i1 [[X:%.*]], [[X2:%.*]] 25; CHECK-NEXT: ret i1 [[Y]] 26; 27 %y = or i1 %x, %x2 28 %z = freeze i1 %y 29 ret i1 %z 30} 31 32define i1 @or_disjoint(i1 noundef %x, i1 noundef %x2) { 33; CHECK-LABEL: @or_disjoint( 34; CHECK-NEXT: [[Y:%.*]] = or disjoint i1 [[X:%.*]], [[X2:%.*]] 35; CHECK-NEXT: [[Z:%.*]] = freeze i1 [[Y]] 36; CHECK-NEXT: ret i1 [[Z]] 37; 38 %y = or disjoint i1 %x, %x2 39 %z = freeze i1 %y 40 ret i1 %z 41} 42 43define i1 @or2(i1 noundef %x, i1 %x2) { 44; CHECK-LABEL: @or2( 45; CHECK-NEXT: [[Y:%.*]] = or i1 [[X:%.*]], [[X2:%.*]] 46; CHECK-NEXT: [[Z:%.*]] = freeze i1 [[Y]] 47; CHECK-NEXT: ret i1 [[Z]] 48; 49 %y = or i1 %x, %x2 50 %z = freeze i1 %y 51 ret i1 %z 52} 53 54define i8 @add(i8 noundef %x) { 55; CHECK-LABEL: @add( 56; CHECK-NEXT: [[Y:%.*]] = add i8 [[X:%.*]], 1 57; CHECK-NEXT: ret i8 [[Y]] 58; 59 %y = add i8 %x, 1 60 %z = freeze i8 %y 61 ret i8 %z 62} 63 64define i8 @addnsw(i8 noundef %x) { 65; CHECK-LABEL: @addnsw( 66; CHECK-NEXT: [[Y:%.*]] = add nsw i8 [[X:%.*]], 1 67; CHECK-NEXT: [[Z:%.*]] = freeze i8 [[Y]] 68; CHECK-NEXT: ret i8 [[Z]] 69; 70 %y = add nsw i8 %x, 1 71 %z = freeze i8 %y 72 ret i8 %z 73} 74 75define i16 @zext(i8 noundef %x) { 76; CHECK-LABEL: @zext( 77; CHECK-NEXT: [[Y:%.*]] = zext i8 [[X:%.*]] to i16 78; CHECK-NEXT: ret i16 [[Y]] 79; 80 %y = zext i8 %x to i16 81 %z = freeze i16 %y 82 ret i16 %z 83} 84 85define i16 @zext_nneg(i8 noundef %x) { 86; CHECK-LABEL: @zext_nneg( 87; CHECK-NEXT: [[Y:%.*]] = zext nneg i8 [[X:%.*]] to i16 88; CHECK-NEXT: [[Z:%.*]] = freeze i16 [[Y]] 89; CHECK-NEXT: ret i16 [[Z]] 90; 91 %y = zext nneg i8 %x to i16 92 %z = freeze i16 %y 93 ret i16 %z 94} 95 96define {i8, i32} @aggr({i8, i32} noundef %x) { 97; CHECK-LABEL: @aggr( 98; CHECK-NEXT: ret { i8, i32 } [[X:%.*]] 99; 100 %y = freeze {i8, i32} %x 101 ret {i8, i32} %y 102} 103 104define i32 @extract({i8, i32} noundef %x) { 105; CHECK-LABEL: @extract( 106; CHECK-NEXT: [[Y:%.*]] = extractvalue { i8, i32 } [[X:%.*]], 1 107; CHECK-NEXT: ret i32 [[Y]] 108; 109 %y = extractvalue {i8, i32} %x, 1 110 %z = freeze i32 %y 111 ret i32 %z 112} 113 114define i32 @extract2({i8, {i8, i32}} noundef %x) { 115; CHECK-LABEL: @extract2( 116; CHECK-NEXT: [[Y:%.*]] = extractvalue { i8, { i8, i32 } } [[X:%.*]], 1 117; CHECK-NEXT: [[Z:%.*]] = extractvalue { i8, i32 } [[Y]], 1 118; CHECK-NEXT: ret i32 [[Z]] 119; 120 %y = extractvalue {i8, {i8, i32}} %x, 1 121 %z = extractvalue {i8, i32} %y, 1 122 %w = freeze i32 %z 123 ret i32 %w 124} 125 126declare void @use_i1(i1 noundef) 127 128define i1 @used_by_fncall(i1 %x) { 129; CHECK-LABEL: @used_by_fncall( 130; CHECK-NEXT: [[Y:%.*]] = add nsw i1 [[X:%.*]], true 131; CHECK-NEXT: call void @use_i1(i1 [[Y]]) 132; CHECK-NEXT: ret i1 [[Y]] 133; 134 %y = add nsw i1 %x, 1 135 call void @use_i1(i1 %y) 136 %f = freeze i1 %y 137 ret i1 %f 138} 139 140define i32 @noundef_metadata(ptr %p) { 141; CHECK-LABEL: @noundef_metadata( 142; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[P:%.*]], align 4, !noundef [[META0:![0-9]+]] 143; CHECK-NEXT: ret i32 [[V]] 144; 145 %v = load i32, ptr %p, !noundef !{} 146 %v.fr = freeze i32 %v 147 ret i32 %v.fr 148} 149 150define {i8, i32} @noundef_metadata2(ptr %p) { 151; CHECK-LABEL: @noundef_metadata2( 152; CHECK-NEXT: [[V:%.*]] = load { i8, i32 }, ptr [[P:%.*]], align 4, !noundef [[META0]] 153; CHECK-NEXT: ret { i8, i32 } [[V]] 154; 155 %v = load {i8, i32}, ptr %p, !noundef !{} 156 %v.fr = freeze {i8, i32} %v 157 ret {i8, i32} %v.fr 158} 159