104 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt -S -passes=instcombine < %s | FileCheck %s3target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32"4target triple = "i386-apple-darwin10.0.0"5 6define void @fu1(i32 %parm) #0 {7; CHECK-LABEL: define void @fu18; CHECK-SAME: (i32 [[PARM:%.*]]) #[[ATTR0:[0-9]+]] {9; CHECK-NEXT: bb:10; CHECK-NEXT: [[I:%.*]] = alloca i32, align 411; CHECK-NEXT: [[PTR:%.*]] = alloca ptr, align 412; CHECK-NEXT: store i32 [[PARM]], ptr [[I]], align 413; CHECK-NEXT: store ptr null, ptr [[PTR]], align 414; CHECK-NEXT: [[I2_NOT:%.*]] = icmp eq i32 [[PARM]], 015; CHECK-NEXT: br i1 [[I2_NOT]], label [[BB9:%.*]], label [[BB3:%.*]]16; CHECK: bb3:17; CHECK-NEXT: [[I4:%.*]] = load i32, ptr [[I]], align 418; CHECK-NEXT: [[I5:%.*]] = shl nuw i32 [[I4]], 319; CHECK-NEXT: [[I6:%.*]] = add nuw i32 [[I5]], 204820; CHECK-NEXT: [[I7:%.*]] = alloca i8, i32 [[I6]], align 121; CHECK-NEXT: store ptr [[I7]], ptr [[PTR]], align 422; CHECK-NEXT: br label [[BB9]]23; CHECK: bb9:24; CHECK-NEXT: [[I10:%.*]] = load ptr, ptr [[PTR]], align 425; CHECK-NEXT: call void @bar(ptr [[I10]]) #[[ATTR1:[0-9]+]]26; CHECK-NEXT: ret void27;28bb:29 %i = alloca i32, align 430 31 %ptr = alloca ptr, align 432 store i32 %parm, ptr %i, align 433 store ptr null, ptr %ptr, align 434 %i1 = load i32, ptr %i, align 435 %i2 = icmp ne i32 %i1, 036 br i1 %i2, label %bb3, label %bb937 38bb3: ; preds = %bb39 %i4 = load i32, ptr %i, align 440 %i5 = shl nuw i32 %i4, 341 ; With "nuw", the alloca and its bitcast can be fused:42 %i6 = add nuw i32 %i5, 204843 44 %i7 = alloca i8, i32 %i6, align 145 store ptr %i7, ptr %ptr, align 446 br label %bb947 48bb9: ; preds = %bb3, %bb49 %i10 = load ptr, ptr %ptr, align 450 call void @bar(ptr %i10)51 ret void52}53 54declare void @bar(ptr)55 56define void @fu2(i32 %parm) #0 {57; CHECK-LABEL: define void @fu258; CHECK-SAME: (i32 [[PARM:%.*]]) #[[ATTR0]] {59; CHECK-NEXT: bb:60; CHECK-NEXT: [[I:%.*]] = alloca i32, align 461; CHECK-NEXT: [[PTR:%.*]] = alloca ptr, align 462; CHECK-NEXT: store i32 [[PARM]], ptr [[I]], align 463; CHECK-NEXT: store ptr null, ptr [[PTR]], align 464; CHECK-NEXT: [[I2_NOT:%.*]] = icmp eq i32 [[PARM]], 065; CHECK-NEXT: br i1 [[I2_NOT]], label [[BB9:%.*]], label [[BB3:%.*]]66; CHECK: bb3:67; CHECK-NEXT: [[I4:%.*]] = load i32, ptr [[I]], align 468; CHECK-NEXT: [[I5:%.*]] = shl nuw i32 [[I4]], 369; CHECK-NEXT: [[I6:%.*]] = add i32 [[I5]], 204870; CHECK-NEXT: [[I7:%.*]] = alloca i8, i32 [[I6]], align 171; CHECK-NEXT: store ptr [[I7]], ptr [[PTR]], align 472; CHECK-NEXT: br label [[BB9]]73; CHECK: bb9:74; CHECK-NEXT: [[I10:%.*]] = load ptr, ptr [[PTR]], align 475; CHECK-NEXT: call void @bar(ptr [[I10]]) #[[ATTR1]]76; CHECK-NEXT: ret void77;78bb:79 %i = alloca i32, align 480 %ptr = alloca ptr, align 481 store i32 %parm, ptr %i, align 482 store ptr null, ptr %ptr, align 483 %i1 = load i32, ptr %i, align 484 %i2 = icmp ne i32 %i1, 085 br i1 %i2, label %bb3, label %bb986 87bb3: ; preds = %bb88 %i4 = load i32, ptr %i, align 489 %i5 = mul nuw i32 %i4, 890 ; Without "nuw", the alloca and its bitcast cannot be fused:91 %i6 = add i32 %i5, 204892 %i7 = alloca i8, i32 %i6, align 193 94 store ptr %i7, ptr %ptr, align 495 br label %bb996 97bb9: ; preds = %bb3, %bb98 %i10 = load ptr, ptr %ptr, align 499 call void @bar(ptr %i10)100 ret void101}102 103attributes #0 = { nounwind ssp }104