1; ModuleID = 'PR1657.bc' 2; Do not promote getelementptr because it may exposes load from a null pointer 3; and store from a null pointer which are covered by 4; icmp eq ptr null, null condition. 5; RUN: opt < %s -passes=licm -S | not grep promoted 6 %struct.decision = type { i8, ptr } 7 8define i32 @main() { 9entry: 10 br label %blah.i 11 12blah.i: ; preds = %cond_true.i, %entry 13 %tmp3.i = icmp eq ptr null, null ; <i1> [#uses=1] 14 br i1 %tmp3.i, label %clear_modes.exit, label %cond_true.i 15 16cond_true.i: ; preds = %blah.i 17 %tmp1.i = getelementptr %struct.decision, ptr null, i32 0, i32 0 ; <ptr> [#uses=1] 18 store i8 0, ptr %tmp1.i 19 br label %blah.i 20 21clear_modes.exit: ; preds = %blah.i 22 call void @exit( i32 0 ) 23 unreachable 24} 25 26define i32 @f(ptr %ptr) { 27entry: 28 br label %loop.head 29 30loop.head: ; preds = %cond.true, %entry 31 %x = phi ptr [ %ptr, %entry ], [ %ptr.i, %cond.true ] ; <ptr> [#uses=1] 32 %tmp3.i = icmp ne ptr %ptr, %x ; <i1> [#uses=1] 33 br i1 %tmp3.i, label %cond.true, label %exit 34 35cond.true: ; preds = %loop.head 36 %ptr.i = getelementptr i8, ptr %ptr, i32 0 ; <ptr> [#uses=2] 37 store i8 0, ptr %ptr.i 38 br label %loop.head 39 40exit: ; preds = %loop.head 41 ret i32 0 42} 43 44define i32 @f2(ptr %p, ptr %q) { 45entry: 46 br label %loop.head 47 48loop.head: ; preds = %cond.true, %entry 49 %tmp3.i = icmp eq ptr null, %q ; <i1> [#uses=1] 50 br i1 %tmp3.i, label %exit, label %cond.true 51 52cond.true: ; preds = %loop.head 53 %ptr.i = getelementptr i8, ptr %p, i32 0 ; <ptr> [#uses=2] 54 store i8 0, ptr %ptr.i 55 br label %loop.head 56 57exit: ; preds = %loop.head 58 ret i32 0 59} 60 61declare void @exit(i32) 62